KWin
Loading...
Searching...
No Matches
module.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2011 Tamas Krutki <ktamasw@gmail.com>
3 SPDX-FileCopyrightText: 2012 Martin Gräßlin <mgraesslin@kde.org>
4
5 SPDX-License-Identifier: GPL-2.0-or-later
6*/
7#include "module.h"
8
9#include <QDBusConnection>
10#include <QDBusMessage>
11#include <QDBusPendingCall>
12#include <QFileDialog>
13#include <QStringList>
14
15#include <KCMultiDialog>
16#include <KConfigGroup>
17#include <KLocalizedString>
18#include <KPackage/Package>
19#include <KPackage/PackageJob>
20#include <KPackage/PackageLoader>
21#include <KSharedConfig>
22
23#include "kwinscriptsdata.h"
24
25Module::Module(QObject *parent, const KPluginMetaData &data)
26 : KQuickConfigModule(parent, data)
27 , m_kwinScriptsData(new KWinScriptsData(this))
28 , m_model(new KPluginModel(this))
29{
30 // Hide the help button, because there is no help
31 setButtons(Apply | Default);
32 connect(m_model, &KPluginModel::isSaveNeededChanged, this, [this]() {
33 setNeedsSave(m_model->isSaveNeeded() || !m_pendingDeletions.isEmpty());
34 });
35 connect(m_model, &KPluginModel::defaulted, this, [this](bool defaulted) {
36 setRepresentsDefaults(defaulted);
37 });
38 m_model->setConfig(KSharedConfig::openConfig("kwinrc")->group(QStringLiteral("Plugins")));
39}
40
42{
43 m_model->clear();
44 m_model->addPlugins(m_kwinScriptsData->pluginMetaDataList(), QString());
45}
46
48{
49 QString path = QFileDialog::getOpenFileName(nullptr, i18n("Import KWin Script"), QDir::homePath(),
50 i18n("*.kwinscript|KWin scripts (*.kwinscript)"));
51
52 if (path.isNull()) {
53 return;
54 }
55
56 using namespace KPackage;
57
58 auto job = PackageJob::update(QStringLiteral("KWin/Script"), path);
59 connect(job, &KJob::result, this, [job, this]() {
60 if (job->error() != KJob::NoError) {
61 setErrorMessage(i18nc("Placeholder is error message returned from the install service", "Cannot import selected script.\n%1", job->errorString()));
62 return;
63 }
64
65 m_infoMessage = i18nc("Placeholder is name of the script that was imported", "The script \"%1\" was successfully imported.", job->package().metadata().name());
66 m_errorMessage.clear();
67 Q_EMIT messageChanged();
68
69 m_model->clear();
70 m_model->addPlugins(m_kwinScriptsData->pluginMetaDataList(), QString());
71
72 setNeedsSave(false);
73 });
74}
75
76void Module::configure(const KPluginMetaData &data)
77{
78 auto dialog = new KCMultiDialog();
79 dialog->addModule(data, QVariantList{data.pluginId(), QStringLiteral("KWin/Script")});
80 dialog->setAttribute(Qt::WA_DeleteOnClose);
81 dialog->show();
82}
83
84void Module::togglePendingDeletion(const KPluginMetaData &data)
85{
86 if (m_pendingDeletions.contains(data)) {
87 m_pendingDeletions.removeOne(data);
88 } else {
89 m_pendingDeletions.append(data);
90 }
91 setNeedsSave(m_model->isSaveNeeded() || !m_pendingDeletions.isEmpty());
93}
94
96{
97 m_model->defaults();
98 m_pendingDeletions.clear();
100
101 setNeedsSave(m_model->isSaveNeeded());
102}
103
105{
106 m_model->clear();
107 m_model->addPlugins(m_kwinScriptsData->pluginMetaDataList(), QString());
108 m_pendingDeletions.clear();
110
111 setNeedsSave(false);
112}
113
115{
116 using namespace KPackage;
117 for (const KPluginMetaData &info : std::as_const(m_pendingDeletions)) {
118 // We can get the package root from the entry path
119 QDir root = QFileInfo(info.fileName()).dir();
120 root.cdUp();
121 KJob *uninstallJob = PackageJob::uninstall(QStringLiteral("KWin/Script"), info.pluginId(), root.absolutePath());
122 connect(uninstallJob, &KJob::result, this, [this, uninstallJob]() {
123 if (!uninstallJob->errorString().isEmpty()) {
124 setErrorMessage(i18n("Error when uninstalling KWin Script: %1", uninstallJob->errorString()));
125 } else {
126 load(); // Make sure to reload the KCM to deleted entries to disappear
127 }
128 });
129 }
130
131 m_infoMessage.clear();
132 Q_EMIT messageChanged();
133 m_pendingDeletions.clear();
135
136 m_model->save();
137 QDBusMessage message = QDBusMessage::createMethodCall("org.kde.KWin", "/Scripting", "org.kde.kwin.Scripting", "start");
138 QDBusConnection::sessionBus().asyncCall(message);
139
140 setNeedsSave(false);
141}
142
143K_PLUGIN_FACTORY_WITH_JSON(KcmKWinScriptsFactory, "kcm_kwin_scripts.json",
144 registerPlugin<Module>();
145 registerPlugin<KWinScriptsData>();)
146
147#include "module.moc"
148
149#include "moc_module.cpp"
QList< KPluginMetaData > pluginMetaDataList() const
Q_INVOKABLE void onGHNSEntriesChanged()
Definition module.cpp:41
Q_INVOKABLE void togglePendingDeletion(const KPluginMetaData &data)
Definition module.cpp:84
void pendingDeletionsChanged()
void messageChanged()
Q_INVOKABLE void importScript()
Definition module.cpp:47
Module(QObject *parent, const KPluginMetaData &data)
Definition module.cpp:25
void defaults() override
Definition module.cpp:95
Q_INVOKABLE void configure(const KPluginMetaData &data)
Definition module.cpp:76
void save() override
Definition module.cpp:114
void load() override
Definition module.cpp:104
K_PLUGIN_FACTORY_WITH_JSON(KCMKWinDecorationFactory, "kcm_kwindecoration.json", registerPlugin< KCMKWinDecoration >();registerPlugin< KWinDecorationData >();) namespace
Definition kcm.cpp:29