kwinscripts kcm: Port to new KPluginWidget class
Task: https://phabricator.kde.org/T12265
This commit is contained in:
parent
4d7f1d1358
commit
bd17ca0110
6 changed files with 33 additions and 36 deletions
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue