11#include <KDecoration2/DecoratedClient>
12#include <KDecoration2/Decoration>
15#include <KCMultiDialog>
16#include <KPluginFactory>
17#include <KPluginMetaData>
19#include <QDBusConnection>
20#include <QDBusMessage>
23#include <QDialogButtonBox>
26#include <QQuickRenderControl>
27#include <QQuickWindow>
36static const QString s_pluginName = QStringLiteral(
"org.kde.kdecoration2");
37static const QString s_kcmName = QStringLiteral(
"org.kde.kdecoration2.kcm");
40 : DecorationBridge(parent)
41 , m_lastCreatedClient(nullptr)
42 , m_lastCreatedSettings(nullptr)
52 auto ptr = std::unique_ptr<PreviewClient>(
new PreviewClient(client, decoration));
53 m_lastCreatedClient = ptr.get();
59 auto ptr = std::unique_ptr<PreviewSettings>(
new PreviewSettings(parent));
60 m_lastCreatedSettings = ptr.get();
66 m_previewItems.append(item);
71 m_previewItems.removeAll(item);
90 if (m_theme ==
theme) {
99 return m_kcmoduleName;
116void PreviewBridge::createFactory()
120 if (m_plugin.isNull()) {
122 qWarning() <<
"Plugin not set";
126 const auto offers = KPluginMetaData::findPlugins(s_pluginName);
127 auto item = std::find_if(offers.constBegin(), offers.constEnd(), [
this](
const auto &
plugin) {
128 return plugin.pluginId() == m_plugin;
130 if (item != offers.constEnd()) {
131 m_factory = KPluginFactory::loadFactory(*item).plugin;
134 setValid(!m_factory.isNull());
142void PreviewBridge::setValid(
bool valid)
144 if (m_valid ==
valid) {
156 QVariantMap args({{QStringLiteral(
"bridge"), QVariant::fromValue(
this)}});
157 if (!m_theme.isNull()) {
158 args.insert(QStringLiteral(
"theme"), m_theme);
160 return m_factory->create<KDecoration2::Decoration>(parent, QVariantList({args}));
168 return m_factory->create<KDecoration2::DecorationButton>(parent, QVariantList({QVariant::fromValue(type), QVariant::fromValue(decoration)}));
174 qWarning() <<
"Cannot show an invalid decoration's configuration dialog";
178 KCMultiDialog *dialog =
new KCMultiDialog;
179 dialog->setAttribute(Qt::WA_DeleteOnClose);
181 if (m_lastCreatedClient) {
182 dialog->setWindowTitle(m_lastCreatedClient->
caption());
186 if (!m_theme.isNull()) {
187 args.insert(QStringLiteral(
"theme"), m_theme);
189 Q_ASSERT(!m_kcmoduleName.isEmpty());
191 dialog->addModule(KPluginMetaData(s_kcmName + QLatin1Char(
'/') + m_kcmoduleName), {args});
193 connect(dialog, &KCMultiDialog::configCommitted,
this, [
this] {
194 if (m_lastCreatedSettings) {
195 Q_EMIT m_lastCreatedSettings->decorationSettings()->reconfigured();
198 QDBusMessage message = QDBusMessage::createSignal(QStringLiteral(
"/KWin"),
199 QStringLiteral(
"org.kde.KWin"),
200 QStringLiteral(
"reloadConfig"));
201 QDBusConnection::sessionBus().send(message);
206 dialog->windowHandle()->setTransientParent(QQuickRenderControl::renderWindowFor(ctx->window()));
207 dialog->setModal(
true);
225 m_bridge->deleteLater();
231#include "moc_previewbridge.cpp"
BridgeItem(QObject *parent=nullptr)
void kcmoduleNameChanged()
void registerPreviewItem(PreviewItem *item)
PreviewBridge(QObject *parent=nullptr)
KDecoration2::Decoration * createDecoration(QObject *parent=nullptr)
void kcmoduleNameChanged()
std::unique_ptr< DecorationSettingsPrivate > settings(DecorationSettings *parent) override
KDecoration2::DecorationButton * createButton(KDecoration2::Decoration *decoration, KDecoration2::DecorationButtonType type, QObject *parent=nullptr)
std::unique_ptr< DecoratedClientPrivate > createClient(DecoratedClient *client, Decoration *decoration) override
void unregisterPreviewItem(PreviewItem *item)
void setTheme(const QString &theme)
void setKcmoduleName(const QString &name)
void configure(QQuickItem *ctx)
void setPlugin(const QString &plugin)
~PreviewBridge() override