diff --git a/src/plugins/kdecorations/aurorae/src/CMakeLists.txt b/src/plugins/kdecorations/aurorae/src/CMakeLists.txt index 3d5ea85fc8..4e1b4e8437 100644 --- a/src/plugins/kdecorations/aurorae/src/CMakeLists.txt +++ b/src/plugins/kdecorations/aurorae/src/CMakeLists.txt @@ -25,12 +25,11 @@ target_compile_definitions(kwin5_aurorae PRIVATE target_link_libraries(kwin5_aurorae KDecoration2::KDecoration kwineffects - KF6::KCMUtils KF6::I18n KF6::Package KF6::WindowSystem + KF6::ConfigGui Qt::Quick - Qt::UiTools ) install(TARGETS kwin5_aurorae DESTINATION ${KDE_INSTALL_PLUGINDIR}/org.kde.kdecoration2) @@ -57,7 +56,22 @@ configure_file(aurorae.knsrc.cmake ${CMAKE_CURRENT_BINARY_DIR}/aurorae.knsrc) ########### install files ############### -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/aurorae.knsrc DESTINATION ${KDE_INSTALL_KNSRCDIR}) +if (KWIN_BUILD_KCMS) + kwin_add_effect_config(kwin_aurorae_config auroraeconfig.cpp) + + target_link_libraries(kwin_aurorae_config + KF6::ConfigGui + KF6::KCMUtils + KF6::I18n + KDecoration2::KDecoration + Qt::DBus + Qt::UiTools + Qt::Widgets + KWinEffectsInterface + ) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/aurorae.knsrc DESTINATION ${KDE_INSTALL_KNSRCDIR}) +endif() + install( FILES qml/AppMenuButton.qml diff --git a/src/plugins/kdecorations/aurorae/src/aurorae.cpp b/src/plugins/kdecorations/aurorae/src/aurorae.cpp index 55433bc55a..501904d599 100644 --- a/src/plugins/kdecorations/aurorae/src/aurorae.cpp +++ b/src/plugins/kdecorations/aurorae/src/aurorae.cpp @@ -8,6 +8,7 @@ #include "config-kwin.h" #include "libkwineffects/kwineffects.h" +#include "auroraeshared.h" #include "auroraetheme.h" #include "libkwineffects/kwinoffscreenquickview.h" // qml imports @@ -26,11 +27,9 @@ #include #include // Qt -#include #include #include #include -#include #include #include #include @@ -43,14 +42,11 @@ #include #include #include -#include -#include K_PLUGIN_FACTORY_WITH_JSON(AuroraeDecoFactory, "aurorae.json", registerPlugin(); - registerPlugin(); - registerPlugin();) + registerPlugin();) namespace Aurorae { @@ -107,12 +103,6 @@ void Helper::unref() static const QString s_defaultTheme = QStringLiteral("kwin4_decoration_qml_plastik"); static const QString s_qmlPackageFolder = QStringLiteral("kwin/decorations/"); -/* - * KDecoration2::BorderSize doesn't map to the indices used for the Aurorae SVG Button Sizes. - * BorderSize defines None and NoSideBorder as index 0 and 1. These do not make sense for Button - * Size, thus we need to perform a mapping between the enum value and the config value. - */ -static const int s_indexMapper = 2; QQmlComponent *Helper::component(const QString &themeName) { @@ -228,19 +218,6 @@ void Helper::init() qRegisterMetaType(); } -static QString findTheme(const QVariantList &args) -{ - if (args.isEmpty()) { - return QString(); - } - const auto map = args.first().toMap(); - auto it = map.constFind(QStringLiteral("theme")); - if (it == map.constEnd()) { - return QString(); - } - return it.value().toString(); -} - Decoration::Decoration(QObject *parent, const QVariantList &args) : KDecoration2::Decoration(parent, args) , m_item(nullptr) @@ -693,104 +670,6 @@ bool ThemeProvider::hasConfiguration(const QString &theme) QStringLiteral("kwin/decorations/%1/contents/config/main.xml").arg(theme)); return !(ui.isEmpty() || xml.isEmpty()); } - -ConfigurationModule::ConfigurationModule(QObject *parent, const KPluginMetaData &data, const QVariantList &args) - : KCModule(parent, data, args) - , m_theme(findTheme(args)) - , m_buttonSize(int(KDecoration2::BorderSize::Normal) - s_indexMapper) -{ - init(); -} - -void ConfigurationModule::init() -{ - if (m_theme.startsWith(QLatin1String("__aurorae__svg__"))) { - // load the generic setting module - initSvg(); - } else { - initQml(); - } -} - -void ConfigurationModule::initSvg() -{ - QWidget *form = new QWidget(widget()); - form->setLayout(new QHBoxLayout(form)); - QComboBox *sizes = new QComboBox(form); - sizes->addItem(i18nc("@item:inlistbox Button size:", "Tiny")); - sizes->addItem(i18nc("@item:inlistbox Button size:", "Normal")); - sizes->addItem(i18nc("@item:inlistbox Button size:", "Large")); - sizes->addItem(i18nc("@item:inlistbox Button size:", "Very Large")); - sizes->addItem(i18nc("@item:inlistbox Button size:", "Huge")); - sizes->addItem(i18nc("@item:inlistbox Button size:", "Very Huge")); - sizes->addItem(i18nc("@item:inlistbox Button size:", "Oversized")); - sizes->setObjectName(QStringLiteral("kcfg_ButtonSize")); - - QLabel *label = new QLabel(i18n("Button size:"), form); - label->setBuddy(sizes); - form->layout()->addWidget(label); - form->layout()->addWidget(sizes); - - widget()->layout()->addWidget(form); - - KCoreConfigSkeleton *skel = new KCoreConfigSkeleton(KSharedConfig::openConfig(QStringLiteral("auroraerc")), this); - skel->setCurrentGroup(m_theme.mid(16)); - skel->addItemInt(QStringLiteral("ButtonSize"), - m_buttonSize, - int(KDecoration2::BorderSize::Normal) - s_indexMapper, - QStringLiteral("ButtonSize")); - addConfig(skel, form); -} - -void ConfigurationModule::initQml() -{ - const QString packageRoot = QStandardPaths::locate(QStandardPaths::GenericDataLocation, - QLatin1String("kwin/decorations/") + m_theme, - QStandardPaths::LocateDirectory); - if (packageRoot.isEmpty()) { - return; - } - - const KPluginMetaData metaData = KPluginMetaData::fromJsonFile(packageRoot + QLatin1String("/metadata.json")); - if (!metaData.isValid()) { - return; - } - - const QString xml = packageRoot + QLatin1String("/contents/config/main.xml"); - const QString ui = packageRoot + QLatin1String("/contents/ui/config.ui"); - if (!QFileInfo::exists(xml) || !QFileInfo::exists(ui)) { - return; - } - - KLocalizedTranslator *translator = new KLocalizedTranslator(this); - QCoreApplication::instance()->installTranslator(translator); - const QString translationDomain = metaData.value("X-KWin-Config-TranslationDomain"); - if (!translationDomain.isEmpty()) { - translator->setTranslationDomain(translationDomain); - } - - // load the KConfigSkeleton - QFile configFile(xml); - KSharedConfigPtr auroraeConfig = KSharedConfig::openConfig("auroraerc"); - KConfigGroup configGroup = auroraeConfig->group(m_theme); - m_skeleton = new KConfigLoader(configGroup, &configFile, this); - // load the ui file - QUiLoader *loader = new QUiLoader(this); - loader->setLanguageChangeEnabled(true); - QFile uiFile(ui); - uiFile.open(QFile::ReadOnly); - QWidget *customConfigForm = loader->load(&uiFile, widget()); - translator->addContextToMonitor(customConfigForm->objectName()); - uiFile.close(); - widget()->layout()->addWidget(customConfigForm); - // connect the ui file with the skeleton - addConfig(m_skeleton, customConfigForm); - - // send a custom event to the translator to retranslate using our translator - QEvent le(QEvent::LanguageChange); - QCoreApplication::sendEvent(customConfigForm, &le); -} - } #include "aurorae.moc" diff --git a/src/plugins/kdecorations/aurorae/src/aurorae.h b/src/plugins/kdecorations/aurorae/src/aurorae.h index c5781625c5..0a08816155 100644 --- a/src/plugins/kdecorations/aurorae/src/aurorae.h +++ b/src/plugins/kdecorations/aurorae/src/aurorae.h @@ -6,7 +6,6 @@ #pragma once -#include #include #include #include @@ -101,20 +100,4 @@ private: QList m_themes; const KPluginMetaData m_data; }; - -class ConfigurationModule : public KCModule -{ - Q_OBJECT -public: - ConfigurationModule(QObject *parent, const KPluginMetaData &data, const QVariantList &args); - -private: - void init(); - void initSvg(); - void initQml(); - QString m_theme; - KConfigLoader *m_skeleton = nullptr; - int m_buttonSize; -}; - } diff --git a/src/plugins/kdecorations/aurorae/src/auroraeconfig.cpp b/src/plugins/kdecorations/aurorae/src/auroraeconfig.cpp new file mode 100644 index 0000000000..8243f0c191 --- /dev/null +++ b/src/plugins/kdecorations/aurorae/src/auroraeconfig.cpp @@ -0,0 +1,122 @@ +/* + SPDX-FileCopyrightText: 2009, 2010, 2012 Martin Gräßlin + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#include "auroraeconfig.h" +#include "auroraeshared.h" +#include +#include +#include +#include +#include +#include +#include +#include + +K_PLUGIN_CLASS(Aurorae::ConfigurationModule) + +namespace Aurorae +{ + +ConfigurationModule::ConfigurationModule(QObject *parent, const KPluginMetaData &data, const QVariantList &args) + : KCModule(parent, data, args) + , m_theme(findTheme(args)) + , m_buttonSize(int(KDecoration2::BorderSize::Normal) - s_indexMapper) +{ + init(); +} + +void ConfigurationModule::init() +{ + if (m_theme.startsWith(QLatin1String("__aurorae__svg__"))) { + // load the generic setting module + initSvg(); + } else { + initQml(); + } +} + +void ConfigurationModule::initSvg() +{ + QWidget *form = new QWidget(widget()); + form->setLayout(new QHBoxLayout(form)); + QComboBox *sizes = new QComboBox(form); + sizes->addItem(i18nc("@item:inlistbox Button size:", "Tiny")); + sizes->addItem(i18nc("@item:inlistbox Button size:", "Normal")); + sizes->addItem(i18nc("@item:inlistbox Button size:", "Large")); + sizes->addItem(i18nc("@item:inlistbox Button size:", "Very Large")); + sizes->addItem(i18nc("@item:inlistbox Button size:", "Huge")); + sizes->addItem(i18nc("@item:inlistbox Button size:", "Very Huge")); + sizes->addItem(i18nc("@item:inlistbox Button size:", "Oversized")); + sizes->setObjectName(QStringLiteral("kcfg_ButtonSize")); + + QLabel *label = new QLabel(i18n("Button size:"), form); + label->setBuddy(sizes); + form->layout()->addWidget(label); + form->layout()->addWidget(sizes); + + widget()->layout()->addWidget(form); + + KCoreConfigSkeleton *skel = new KCoreConfigSkeleton(KSharedConfig::openConfig(QStringLiteral("auroraerc")), this); + skel->setCurrentGroup(m_theme.mid(16)); + skel->addItemInt(QStringLiteral("ButtonSize"), + m_buttonSize, + int(KDecoration2::BorderSize::Normal) - s_indexMapper, + QStringLiteral("ButtonSize")); + addConfig(skel, form); +} + +void ConfigurationModule::initQml() +{ + const QString packageRoot = QStandardPaths::locate(QStandardPaths::GenericDataLocation, + QLatin1String("kwin/decorations/") + m_theme, + QStandardPaths::LocateDirectory); + if (packageRoot.isEmpty()) { + return; + } + + const KPluginMetaData metaData = KPluginMetaData::fromJsonFile(packageRoot + QLatin1String("/metadata.json")); + if (!metaData.isValid()) { + return; + } + + const QString xml = packageRoot + QLatin1String("/contents/config/main.xml"); + const QString ui = packageRoot + QLatin1String("/contents/ui/config.ui"); + if (!QFileInfo::exists(xml) || !QFileInfo::exists(ui)) { + return; + } + + KLocalizedTranslator *translator = new KLocalizedTranslator(this); + QCoreApplication::instance()->installTranslator(translator); + const QString translationDomain = metaData.value("X-KWin-Config-TranslationDomain"); + if (!translationDomain.isEmpty()) { + translator->setTranslationDomain(translationDomain); + } + + // load the KConfigSkeleton + QFile configFile(xml); + KSharedConfigPtr auroraeConfig = KSharedConfig::openConfig("auroraerc"); + KConfigGroup configGroup = auroraeConfig->group(m_theme); + m_skeleton = new KConfigLoader(configGroup, &configFile, this); + // load the ui file + QUiLoader *loader = new QUiLoader(this); + loader->setLanguageChangeEnabled(true); + QFile uiFile(ui); + uiFile.open(QFile::ReadOnly); + QWidget *customConfigForm = loader->load(&uiFile, widget()); + translator->addContextToMonitor(customConfigForm->objectName()); + uiFile.close(); + widget()->layout()->addWidget(customConfigForm); + // connect the ui file with the skeleton + addConfig(m_skeleton, customConfigForm); + + // send a custom event to the translator to retranslate using our translator + QEvent le(QEvent::LanguageChange); + QCoreApplication::sendEvent(customConfigForm, &le); +} + +} + +#include "auroraeconfig.moc" diff --git a/src/plugins/kdecorations/aurorae/src/auroraeconfig.h b/src/plugins/kdecorations/aurorae/src/auroraeconfig.h new file mode 100644 index 0000000000..4d0dc1592d --- /dev/null +++ b/src/plugins/kdecorations/aurorae/src/auroraeconfig.h @@ -0,0 +1,33 @@ +/* + SPDX-FileCopyrightText: 2009, 2010, 2012 Martin Gräßlin + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#ifndef AURORAECONFIG_H +#define AURORAECONFIG_H + +#include +#include + +namespace Aurorae +{ + +class ConfigurationModule : public KCModule +{ + Q_OBJECT +public: + ConfigurationModule(QObject *parent, const KPluginMetaData &data, const QVariantList &args); + +private: + void init(); + void initSvg(); + void initQml(); + QString m_theme; + KConfigLoader *m_skeleton = nullptr; + int m_buttonSize; +}; + +} + +#endif // AURORAECONFIG_H diff --git a/src/plugins/kdecorations/aurorae/src/auroraeshared.h b/src/plugins/kdecorations/aurorae/src/auroraeshared.h new file mode 100644 index 0000000000..860c965848 --- /dev/null +++ b/src/plugins/kdecorations/aurorae/src/auroraeshared.h @@ -0,0 +1,35 @@ +/* + SPDX-FileCopyrightText: 2009, 2010, 2012 Martin Gräßlin + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#pragma once + +#include +#include + +namespace Aurorae +{ + +/* + * KDecoration2::BorderSize doesn't map to the indices used for the Aurorae SVG Button Sizes. + * BorderSize defines None and NoSideBorder as index 0 and 1. These do not make sense for Button + * Size, thus we need to perform a mapping between the enum value and the config value. + */ +static const int s_indexMapper = 2; + +static QString findTheme(const QVariantList &args) +{ + if (args.isEmpty()) { + return QString(); + } + const auto map = args.first().toMap(); + auto it = map.constFind(QStringLiteral("theme")); + if (it == map.constEnd()) { + return QString(); + } + return it.value().toString(); +} + +}