kwinscripts kcm: Port to new KPluginWidget class

Task: https://phabricator.kde.org/T12265
This commit is contained in:
Alexander Lohnau 2021-11-17 18:15:56 +01:00
parent 4d7f1d1358
commit bd17ca0110
6 changed files with 33 additions and 36 deletions

View file

@ -6,7 +6,7 @@ project(KWin VERSION ${PROJECT_VERSION})
set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD 99)
set(QT_MIN_VERSION "5.15.0") set(QT_MIN_VERSION "5.15.0")
set(KF5_MIN_VERSION "5.88") set(KF5_MIN_VERSION "5.89")
set(KDE_COMPILERSETTINGS_LEVEL "5.82") set(KDE_COMPILERSETTINGS_LEVEL "5.82")
find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE) find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE)

View file

@ -6,12 +6,11 @@
#include "kwinscriptsdata.h" #include "kwinscriptsdata.h"
#include <KPluginFactory> #include <KConfigGroup>
#include <KPackage/PackageLoader>
#include <KPackage/Package> #include <KPackage/Package>
#include <KPackage/PackageLoader>
#include <KPackage/PackageStructure> #include <KPackage/PackageStructure>
#include "kpluginselector.h" #include <KPluginFactory>
KWinScriptsData::KWinScriptsData(QObject *parent, const QVariantList &args) KWinScriptsData::KWinScriptsData(QObject *parent, const QVariantList &args)
: KCModuleData(parent, args) : KCModuleData(parent, args)
@ -19,25 +18,22 @@ KWinScriptsData::KWinScriptsData(QObject *parent, const QVariantList &args)
{ {
} }
QList<KPluginInfo> KWinScriptsData::pluginInfoList() const QVector<KPluginMetaData> KWinScriptsData::pluginMetaDataList() const
{ {
auto filter = [](const KPluginMetaData &md) { auto filter = [](const KPluginMetaData &md) {
return md.isValid() && !md.rawData().value("X-KWin-Exclude-Listing").toBool(); return md.isValid() && !md.rawData().value("X-KWin-Exclude-Listing").toBool();
}; };
const QString scriptFolder = QStringLiteral("kwin/scripts/"); const QString scriptFolder = QStringLiteral("kwin/scripts/");
const auto scripts = KPackage::PackageLoader::self()->findPackages(QStringLiteral("KWin/Script"), scriptFolder, filter); return KPackage::PackageLoader::self()->findPackages(QStringLiteral("KWin/Script"), scriptFolder, filter).toVector();
return KPluginInfo::fromMetaData(scripts.toVector());
} }
bool KWinScriptsData::isDefaults() const bool KWinScriptsData::isDefaults() const
{ {
QList<KPluginInfo> scriptinfos = pluginInfoList(); QVector<KPluginMetaData> plugins = pluginMetaDataList();
KConfigGroup cfgGroup(m_kwinConfig, "Plugins"); KConfigGroup cfgGroup(m_kwinConfig, "Plugins");
for (auto &script : scriptinfos) { for (auto &plugin : plugins) {
script.load(cfgGroup); if (cfgGroup.readEntry(plugin.pluginId() + QLatin1String("Enabled"), plugin.isEnabledByDefault()) != plugin.isEnabledByDefault()) {
if (script.isPluginEnabled() != script.isPluginEnabledByDefault()) {
return false; return false;
} }
} }

View file

@ -8,10 +8,10 @@
#define KWINSCRIPTSDATA_H #define KWINSCRIPTSDATA_H
#include <QObject> #include <QObject>
#include <QList> #include <QVector>
#include <KCModuleData> #include <KCModuleData>
#include <KPluginInfo> #include <KPluginMetaData>
#include <KSharedConfig> #include <KSharedConfig>
class KWinScriptsData : public KCModuleData class KWinScriptsData : public KCModuleData
@ -23,7 +23,7 @@ public:
bool isDefaults() const override; bool isDefaults() const override;
QList<KPluginInfo> pluginInfoList() const; QVector<KPluginMetaData> pluginMetaDataList() const;
private: private:
KSharedConfigPtr m_kwinConfig; KSharedConfigPtr m_kwinConfig;

View file

@ -16,13 +16,14 @@
#include <QDBusPendingCall> #include <QDBusPendingCall>
#include <KAboutData> #include <KAboutData>
#include <KConfigGroup>
#include <KLocalizedString> #include <KLocalizedString>
#include <KPluginFactory>
#include <KMessageBox> #include <KMessageBox>
#include <KMessageWidget> #include <KMessageWidget>
#include <KPackage/PackageLoader>
#include <KPackage/Package> #include <KPackage/Package>
#include <KPackage/PackageLoader>
#include <KPackage/PackageStructure> #include <KPackage/PackageStructure>
#include <KPluginFactory>
#include <KNewStuff3/KNS3/Button> #include <KNewStuff3/KNS3/Button>
@ -54,24 +55,25 @@ Module::Module(QWidget *parent, const QVariantList &args) :
ui->ghnsButton->setConfigFile(QStringLiteral("kwinscripts.knsrc")); ui->ghnsButton->setConfigFile(QStringLiteral("kwinscripts.knsrc"));
connect(ui->ghnsButton, &KNS3::Button::dialogFinished, this, [this](const KNS3::Entry::List &changedEntries) { connect(ui->ghnsButton, &KNS3::Button::dialogFinished, this, [this](const KNS3::Entry::List &changedEntries) {
if (!changedEntries.isEmpty()) { if (!changedEntries.isEmpty()) {
ui->scriptSelector->clearPlugins(); ui->scriptSelector->clear();
updateListViewContents(); updateListViewContents();
} }
}); });
connect(ui->scriptSelector, &KPluginSelector::changed, this, [this](bool isChanged){ ui->scriptSelector->setConfig(m_kwinConfig->group("Plugins"));
connect(ui->scriptSelector, &KPluginWidget::changed, this, [this](bool isChanged) {
Q_EMIT changed(isChanged || !m_pendingDeletions.isEmpty()); Q_EMIT changed(isChanged || !m_pendingDeletions.isEmpty());
}); });
connect(ui->scriptSelector, &KPluginSelector::defaulted, this, [this](bool isDefaulted){ connect(ui->scriptSelector, &KPluginWidget::defaulted, this, [this](bool isDefaulted) {
Q_EMIT defaulted(isDefaulted && m_pendingDeletions.isEmpty()); Q_EMIT defaulted(isDefaulted && m_pendingDeletions.isEmpty());
}); });
connect(this, &Module::defaultsIndicatorsVisibleChanged, ui->scriptSelector, &KPluginSelector::setDefaultsIndicatorsVisible); connect(this, &Module::defaultsIndicatorsVisibleChanged, ui->scriptSelector, &KPluginWidget::setDefaultsIndicatorsVisible);
connect(ui->importScriptButton, &QPushButton::clicked, this, &Module::importScript); connect(ui->importScriptButton, &QPushButton::clicked, this, &Module::importScript);
ui->scriptSelector->setAdditionalButtonHandler([this](const KPluginInfo &info) { ui->scriptSelector->setAdditionalButtonHandler([this](const KPluginMetaData &info) {
QPushButton *button = new QPushButton(ui->scriptSelector); QPushButton *button = new QPushButton(ui->scriptSelector);
button->setIcon(QIcon::fromTheme(QStringLiteral("delete"))); button->setIcon(QIcon::fromTheme(QStringLiteral("delete")));
button->setEnabled(QFileInfo(info.entryPath()).isWritable()); button->setEnabled(QFileInfo(info.fileName()).isWritable());
connect(button, &QPushButton::clicked, this, [this, info]() { connect(button, &QPushButton::clicked, this, [this, info]() {
if (m_pendingDeletions.contains(info)) { if (m_pendingDeletions.contains(info)) {
m_pendingDeletions.removeOne(info); m_pendingDeletions.removeOne(info);
@ -145,7 +147,8 @@ void Module::importScriptInstallFinished(KJob *job)
void Module::updateListViewContents() void Module::updateListViewContents()
{ {
ui->scriptSelector->addPlugins(m_kwinScriptsData->pluginInfoList(), KPluginSelector::ReadConfigFile, QString(), QString(), m_kwinConfig); ui->scriptSelector->clear();
ui->scriptSelector->addPlugins(m_kwinScriptsData->pluginMetaDataList(), QString());
} }
void Module::defaults() void Module::defaults()
@ -160,7 +163,6 @@ void Module::load()
m_pendingDeletions.clear(); m_pendingDeletions.clear();
Q_EMIT pendingDeletionsChanged(); Q_EMIT pendingDeletionsChanged();
updateListViewContents(); updateListViewContents();
ui->scriptSelector->load();
Q_EMIT changed(false); Q_EMIT changed(false);
} }
@ -169,13 +171,12 @@ void Module::save()
{ {
using namespace KPackage; using namespace KPackage;
PackageStructure *structure = PackageLoader::self()->loadPackageStructure(QStringLiteral("KWin/Script")); PackageStructure *structure = PackageLoader::self()->loadPackageStructure(QStringLiteral("KWin/Script"));
for (const KPluginInfo &info : qAsConst(m_pendingDeletions)) { for (const KPluginMetaData &info : qAsConst(m_pendingDeletions)) {
// We can get the package root from the entry path // We can get the package root from the entry path
QDir root = QFileInfo(info.entryPath()).dir(); QDir root = QFileInfo(info.fileName()).dir();
root.cdUp(); root.cdUp();
KJob *uninstallJob = Package(structure).uninstall(info.pluginName(), root.absolutePath()); KJob *uninstallJob = Package(structure).uninstall(info.pluginId(), root.absolutePath());
connect(uninstallJob, &KJob::result, this, [this, uninstallJob](){ connect(uninstallJob, &KJob::result, this, [this, uninstallJob]() {
ui->scriptSelector->clearPlugins();
updateListViewContents(); updateListViewContents();
// If the uninstallation is successful the entry will be immediately removed // If the uninstallation is successful the entry will be immediately removed
if (!uninstallJob->errorString().isEmpty()) { if (!uninstallJob->errorString().isEmpty()) {

View file

@ -8,8 +8,8 @@
#define MODULE_H #define MODULE_H
#include <KCModule> #include <KCModule>
#include <KPluginMetaData>
#include <KSharedConfig> #include <KSharedConfig>
#include <KPluginInfo>
namespace Ui namespace Ui
{ {
@ -62,7 +62,7 @@ private:
void updateListViewContents(); void updateListViewContents();
KSharedConfigPtr m_kwinConfig; KSharedConfigPtr m_kwinConfig;
KWinScriptsData *m_kwinScriptsData; KWinScriptsData *m_kwinScriptsData;
QList<KPluginInfo> m_pendingDeletions; QList<KPluginMetaData> m_pendingDeletions;
}; };
#endif // MODULE_H #endif // MODULE_H

View file

@ -18,7 +18,7 @@
<widget class="KMessageWidget" name="messageWidget" native="true"/> <widget class="KMessageWidget" name="messageWidget" native="true"/>
</item> </item>
<item> <item>
<widget class="KPluginSelector" name="scriptSelector" native="true"> <widget class="KPluginWidget" name="scriptSelector" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -74,9 +74,9 @@
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
<class>KPluginSelector</class> <class>KPluginWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>kpluginselector.h</header> <header>kpluginwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget> <customwidget>