From 39f9581d4f1ceb8bc0c2ae4aafedb806ee2532d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Thu, 4 Dec 2014 16:28:06 +0100 Subject: [PATCH] Bring back configuration options for Decorations * Border Sizes * Close menu double click Both are added to the Settings and exposed in the decoration kcm. As it started to no longer scale the kcm uses a ui file. Still missing: * buttons * custom decoration configuration * GHNS * search --- decorations/settings.cpp | 47 +++++- decorations/settings.h | 1 + kcmkwin/kwindecoration/CMakeLists.txt | 1 + .../declarative-plugin/previewsettings.cpp | 12 ++ .../declarative-plugin/previewsettings.h | 8 + kcmkwin/kwindecoration/kcm.cpp | 105 +++++++++++-- kcmkwin/kwindecoration/kcm.h | 11 +- kcmkwin/kwindecoration/kcm.ui | 138 ++++++++++++++++++ kcmkwin/kwindecoration/qml/main.qml | 2 + 9 files changed, 305 insertions(+), 20 deletions(-) create mode 100644 kcmkwin/kwindecoration/kcm.ui diff --git a/decorations/settings.cpp b/decorations/settings.cpp index d8bd039a98..f4dacb8721 100644 --- a/decorations/settings.cpp +++ b/decorations/settings.cpp @@ -21,6 +21,7 @@ along with this program. If not, see . // KWin #include "composite.h" #include "virtualdesktops.h" +#include "workspace.h" #include @@ -55,6 +56,7 @@ SettingsImpl::SettingsImpl(KDecoration2::DecorationSettings *parent) disconnect(c); } ); + connect(Workspace::self(), &Workspace::configChanged, this, &SettingsImpl::readSettings); } SettingsImpl::~SettingsImpl() = default; @@ -71,7 +73,7 @@ bool SettingsImpl::isOnAllDesktopsAvailable() const bool SettingsImpl::isCloseOnDoubleClickOnMenu() const { - return false; + return m_closeDoubleClickMenu; } static QHash s_buttonNames; @@ -127,18 +129,57 @@ QVector< KDecoration2::DecorationButtonType > SettingsImpl::readDecorationButton return buttonsFromString(config.readEntry(key, buttonsToString(defaultValue))); } +static KDecoration2::BorderSize stringToSize(const QString &name) +{ + static const QMap s_sizes = QMap({ + {QStringLiteral("None"), KDecoration2::BorderSize::None}, + {QStringLiteral("NoSides"), KDecoration2::BorderSize::NoSides}, + {QStringLiteral("Tiny"), KDecoration2::BorderSize::Tiny}, + {QStringLiteral("Normal"), KDecoration2::BorderSize::Normal}, + {QStringLiteral("Large"), KDecoration2::BorderSize::Large}, + {QStringLiteral("VeryLarge"), KDecoration2::BorderSize::VeryLarge}, + {QStringLiteral("Huge"), KDecoration2::BorderSize::Huge}, + {QStringLiteral("VeryHuge"), KDecoration2::BorderSize::VeryHuge}, + {QStringLiteral("Oversized"), KDecoration2::BorderSize::Oversized} + }); + auto it = s_sizes.constFind(name); + if (it == s_sizes.constEnd()) { + // non sense values are interpreted just like normal + return KDecoration2::BorderSize::Normal; + } + return it.value(); +} + void SettingsImpl::readSettings() { KConfigGroup config = KSharedConfig::openConfig(KWIN_CONFIG)->group(QStringLiteral("org.kde.kdecoration2")); - m_leftButtons = readDecorationButtons(config, "ButtonsOnLeft", QVector({ + const auto &left = readDecorationButtons(config, "ButtonsOnLeft", QVector({ KDecoration2::DecorationButtonType::Menu, KDecoration2::DecorationButtonType::OnAllDesktops })); - m_rightButtons = readDecorationButtons(config, "ButtonsOnRight", QVector({ + if (left != m_leftButtons) { + m_leftButtons = left; + emit decorationSettings()->decorationButtonsLeftChanged(m_leftButtons); + } + const auto &right = readDecorationButtons(config, "ButtonsOnRight", QVector({ KDecoration2::DecorationButtonType::Minimize, KDecoration2::DecorationButtonType::Maximize, KDecoration2::DecorationButtonType::Close })); + if (right != m_rightButtons) { + m_rightButtons = right; + emit decorationSettings()->decorationButtonsRightChanged(m_rightButtons); + } + const bool close = config.readEntry("CloseOnDoubleClickOnMenu", false); + if (close != m_closeDoubleClickMenu) { + m_closeDoubleClickMenu = close; + emit decorationSettings()->closeOnDoubleClickOnMenuChanged(m_closeDoubleClickMenu); + } + const auto size = stringToSize(config.readEntry("BorderSize", QStringLiteral("Normal"))); + if (size != m_borderSize) { + m_borderSize = size; + emit decorationSettings()->borderSizeChanged(m_borderSize); + } } } diff --git a/decorations/settings.h b/decorations/settings.h index 6767507ea0..632fe366ed 100644 --- a/decorations/settings.h +++ b/decorations/settings.h @@ -58,6 +58,7 @@ private: QVector< KDecoration2::DecorationButtonType > m_leftButtons; QVector< KDecoration2::DecorationButtonType > m_rightButtons; KDecoration2::BorderSize m_borderSize; + bool m_closeDoubleClickMenu = false; }; } // Decoration } // KWin diff --git a/kcmkwin/kwindecoration/CMakeLists.txt b/kcmkwin/kwindecoration/CMakeLists.txt index 35089b8b0f..1972a69d3f 100644 --- a/kcmkwin/kwindecoration/CMakeLists.txt +++ b/kcmkwin/kwindecoration/CMakeLists.txt @@ -16,6 +16,7 @@ ki18n_wrap_ui(kcm_kwindecoration_PART_SRCS buttons.ui config.ui decoration.ui + kcm.ui ) add_library(kcm_kwindecoration MODULE ${kcm_kwindecoration_PART_SRCS}) diff --git a/kcmkwin/kwindecoration/declarative-plugin/previewsettings.cpp b/kcmkwin/kwindecoration/declarative-plugin/previewsettings.cpp index 6216d33147..c9faad88cf 100644 --- a/kcmkwin/kwindecoration/declarative-plugin/previewsettings.cpp +++ b/kcmkwin/kwindecoration/declarative-plugin/previewsettings.cpp @@ -354,6 +354,9 @@ void Settings::createSettings() m_settings.clear(); } else { m_settings = QSharedPointer::create(m_bridge.data()); + m_previewSettings = m_bridge->lastCreatedSettings(); + m_previewSettings->setBorderSizesIndex(m_borderSize); + connect(this, &Settings::borderSizesIndexChanged, m_previewSettings, &PreviewSettings::setBorderSizesIndex); } emit settingsChanged(); } @@ -368,5 +371,14 @@ DecorationSettings *Settings::settingsPointer() const return m_settings.data(); } +void Settings::setBorderSizesIndex(int index) +{ + if (m_borderSize == index) { + return; + } + m_borderSize = index; + emit borderSizesIndexChanged(m_borderSize); +} + } } diff --git a/kcmkwin/kwindecoration/declarative-plugin/previewsettings.h b/kcmkwin/kwindecoration/declarative-plugin/previewsettings.h index 8430091c6f..cae3439004 100644 --- a/kcmkwin/kwindecoration/declarative-plugin/previewsettings.h +++ b/kcmkwin/kwindecoration/declarative-plugin/previewsettings.h @@ -159,6 +159,7 @@ class Settings : public QObject Q_OBJECT Q_PROPERTY(KDecoration2::Preview::PreviewBridge *bridge READ bridge WRITE setBridge NOTIFY bridgeChanged) Q_PROPERTY(KDecoration2::DecorationSettings *settings READ settingsPointer NOTIFY settingsChanged) + Q_PROPERTY(int borderSizesIndex READ borderSizesIndex WRITE setBorderSizesIndex NOTIFY borderSizesIndexChanged) public: explicit Settings(QObject *parent = nullptr); virtual ~Settings(); @@ -168,15 +169,22 @@ public: QSharedPointer settings() const; DecorationSettings *settingsPointer() const; + int borderSizesIndex() const { + return m_borderSize; + } + void setBorderSizesIndex(int index); Q_SIGNALS: void bridgeChanged(); void settingsChanged(); + void borderSizesIndexChanged(int); private: void createSettings(); QPointer m_bridge; QSharedPointer m_settings; + PreviewSettings *m_previewSettings = nullptr; + int m_borderSize = 3; }; } diff --git a/kcmkwin/kwindecoration/kcm.cpp b/kcmkwin/kwindecoration/kcm.cpp index cd0caf3b2b..3568a60ce5 100644 --- a/kcmkwin/kwindecoration/kcm.cpp +++ b/kcmkwin/kwindecoration/kcm.cpp @@ -24,13 +24,13 @@ #include #include #include +#include // Qt #include #include #include #include #include -#include #include #include @@ -38,6 +38,8 @@ K_PLUGIN_FACTORY(KDecorationFactory, registerPlugin(); ) +Q_DECLARE_METATYPE(KDecoration2::BorderSize) + namespace KDecoration2 { @@ -46,24 +48,65 @@ namespace Configuration static const QString s_pluginName = QStringLiteral("org.kde.kdecoration2"); static const QString s_defaultPlugin = QStringLiteral("org.kde.breeze"); +ConfigurationForm::ConfigurationForm(QWidget *parent) + : QWidget(parent) +{ + setupUi(this); +} + +static bool s_loading = false; + ConfigurationModule::ConfigurationModule(QWidget *parent, const QVariantList &args) : KCModule(parent, args) - , m_view(new QQuickWidget(this)) , m_model(new DecorationsModel(this)) + , m_ui(new ConfigurationForm(this)) { - m_view->rootContext()->setContextProperty(QStringLiteral("decorationsModel"), m_model); - m_view->rootContext()->setContextProperty("highlightColor", QPalette().color(QPalette::Highlight)); - m_view->setResizeMode(QQuickWidget::SizeRootObjectToView); - m_view->setSource(QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kwin/kcm_kwindecoration/main.qml")))); - if (m_view->status() == QQuickWidget::Ready) { - auto listView = m_view->rootObject()->findChild("listView"); + m_ui->view->rootContext()->setContextProperty(QStringLiteral("decorationsModel"), m_model); + m_ui->view->rootContext()->setContextProperty("highlightColor", QPalette().color(QPalette::Highlight)); + m_ui->view->rootContext()->setContextProperty("_borderSizesIndex", 3); // 3 is normal + m_ui->view->setResizeMode(QQuickWidget::SizeRootObjectToView); + m_ui->view->setSource(QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kwin/kcm_kwindecoration/main.qml")))); + if (m_ui->view->status() == QQuickWidget::Ready) { + auto listView = m_ui->view->rootObject()->findChild("listView"); if (listView) { connect(listView, SIGNAL(currentIndexChanged()), this, SLOT(changed())); } } + m_ui->doubleClickMessage->setVisible(false); + m_ui->doubleClickMessage->setText(i18n("Close by double clicking:\n To open the menu, keep the button pressed until it appears.")); + m_ui->doubleClickMessage->setCloseButtonVisible(true); + m_ui->borderSizesCombo->setItemData(0, QVariant::fromValue(BorderSize::None)); + m_ui->borderSizesCombo->setItemData(1, QVariant::fromValue(BorderSize::NoSides)); + m_ui->borderSizesCombo->setItemData(2, QVariant::fromValue(BorderSize::Tiny)); + m_ui->borderSizesCombo->setItemData(3, QVariant::fromValue(BorderSize::Normal)); + m_ui->borderSizesCombo->setItemData(4, QVariant::fromValue(BorderSize::Large)); + m_ui->borderSizesCombo->setItemData(5, QVariant::fromValue(BorderSize::VeryLarge)); + m_ui->borderSizesCombo->setItemData(6, QVariant::fromValue(BorderSize::Huge)); + m_ui->borderSizesCombo->setItemData(7, QVariant::fromValue(BorderSize::VeryHuge)); + m_ui->borderSizesCombo->setItemData(8, QVariant::fromValue(BorderSize::Oversized)); + + connect(m_ui->closeWindowsDoubleClick, &QCheckBox::stateChanged, this, + static_cast(&ConfigurationModule::changed)); + connect(m_ui->closeWindowsDoubleClick, &QCheckBox::toggled, this, + [this] (bool toggled) { + if (!toggled || s_loading) { + return; + } + m_ui->doubleClickMessage->animatedShow(); + } + ); + connect(m_ui->borderSizesCombo, static_cast(&QComboBox::currentIndexChanged), + this, [this] (int index) { + auto listView = m_ui->view->rootObject()->findChild("listView"); + if (listView) { + listView->setProperty("borderSizesIndex", index); + } + changed(); + } + ); QVBoxLayout *l = new QVBoxLayout(this); - l->addWidget(m_view); + l->addWidget(m_ui); QMetaObject::invokeMethod(m_model, "init", Qt::QueuedConnection); } @@ -74,26 +117,60 @@ void ConfigurationModule::showEvent(QShowEvent *ev) KCModule::showEvent(ev); } +static const QMap s_sizes = QMap({ + {QStringLiteral("None"), BorderSize::None}, + {QStringLiteral("NoSides"), BorderSize::NoSides}, + {QStringLiteral("Tiny"), BorderSize::Tiny}, + {QStringLiteral("Normal"), BorderSize::Normal}, + {QStringLiteral("Large"), BorderSize::Large}, + {QStringLiteral("VeryLarge"), BorderSize::VeryLarge}, + {QStringLiteral("Huge"), BorderSize::Huge}, + {QStringLiteral("VeryHuge"), BorderSize::VeryHuge}, + {QStringLiteral("Oversized"), BorderSize::Oversized} +}); + +static BorderSize stringToSize(const QString &name) +{ + auto it = s_sizes.constFind(name); + if (it == s_sizes.constEnd()) { + // non sense values are interpreted just like normal + return BorderSize::Normal; + } + return it.value(); +} + +static QString sizeToString(BorderSize size) +{ + return s_sizes.key(size, QStringLiteral("Normal")); +} + void ConfigurationModule::load() { + s_loading = true; const KConfigGroup config = KSharedConfig::openConfig("kwinrc")->group(s_pluginName); const QString plugin = config.readEntry("library", s_defaultPlugin); const QString theme = config.readEntry("theme", QString()); const QModelIndex index = m_model->findDecoration(plugin, theme); - if (auto listView = m_view->rootObject()->findChild("listView")) { + if (auto listView = m_ui->view->rootObject()->findChild("listView")) { listView->setProperty("currentIndex", index.isValid() ? index.row() : -1); } + m_ui->closeWindowsDoubleClick->setChecked(config.readEntry("CloseOnDoubleClickOnMenu", false)); + const QVariant border = QVariant::fromValue(stringToSize(config.readEntry("BorderSize", QStringLiteral("Normal")))); + m_ui->borderSizesCombo->setCurrentIndex(m_ui->borderSizesCombo->findData(border)); KCModule::load(); + s_loading = false; } void ConfigurationModule::save() { - if (auto listView = m_view->rootObject()->findChild("listView")) { + KConfigGroup config = KSharedConfig::openConfig("kwinrc")->group(s_pluginName); + config.writeEntry("CloseOnDoubleClickOnMenu", m_ui->closeWindowsDoubleClick->isChecked()); + config.writeEntry("BorderSize", sizeToString(m_ui->borderSizesCombo->currentData().value())); + if (auto listView = m_ui->view->rootObject()->findChild("listView")) { const int currentIndex = listView->property("currentIndex").toInt(); if (currentIndex != -1) { const QModelIndex index = m_model->index(currentIndex, 0); if (index.isValid()) { - KConfigGroup config = KSharedConfig::openConfig("kwinrc")->group(s_pluginName); config.writeEntry("library", index.data(Qt::UserRole + 4).toString()); const QString theme = index.data(Qt::UserRole +5).toString(); if (theme.isEmpty()) { @@ -101,10 +178,10 @@ void ConfigurationModule::save() } else { config.writeEntry("theme", theme); } - config.sync(); } } } + config.sync(); KCModule::save(); // Send signal to all kwin instances QDBusMessage message = QDBusMessage::createSignal(QStringLiteral("/KWin"), @@ -115,7 +192,7 @@ void ConfigurationModule::save() void ConfigurationModule::defaults() { - if (auto listView = m_view->rootObject()->findChild("listView")) { + if (auto listView = m_ui->view->rootObject()->findChild("listView")) { const QModelIndex index = m_model->findDecoration(s_defaultPlugin); listView->setProperty("currentIndex", index.isValid() ? index.row() : -1); } diff --git a/kcmkwin/kwindecoration/kcm.h b/kcmkwin/kwindecoration/kcm.h index e3d352aa86..1d241471f8 100644 --- a/kcmkwin/kwindecoration/kcm.h +++ b/kcmkwin/kwindecoration/kcm.h @@ -21,8 +21,7 @@ #define KDECORATIONS_KCM_H #include - -class QQuickWidget; +#include namespace KDecoration2 { @@ -34,6 +33,12 @@ namespace Configuration { class DecorationsModel; +class ConfigurationForm : public QWidget, public Ui::KCMForm +{ +public: + explicit ConfigurationForm(QWidget* parent); +}; + class ConfigurationModule : public KCModule { Q_OBJECT @@ -50,8 +55,8 @@ protected: void showEvent(QShowEvent *ev) override; private: - QQuickWidget *m_view; DecorationsModel *m_model; + ConfigurationForm *m_ui; }; } diff --git a/kcmkwin/kwindecoration/kcm.ui b/kcmkwin/kwindecoration/kcm.ui new file mode 100644 index 0000000000..16666a120c --- /dev/null +++ b/kcmkwin/kwindecoration/kcm.ui @@ -0,0 +1,138 @@ + + + KCMForm + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + + + + + 0 + 0 + + + + QQuickWidget::SizeRootObjectToView + + + + + + + + + Border si&ze: + + + borderSizesCombo + + + + + + + + No Borders + + + + + No Side Borders + + + + + Tiny + + + + + Normal + + + + + Large + + + + + Very Large + + + + + Huge + + + + + Very Huge + + + + + Oversized + + + + + + + + + + + + + + + + + + Close windows by double clicking &the menu button: + + + closeWindowsDoubleClick + + + + + + + + + + QQuickWidget + QWidget +
QQuickWidget
+
+ + KComboBox + QComboBox +
kcombobox.h
+
+ + KMessageWidget + QFrame +
kmessagewidget.h
+ 1 +
+
+ + +
diff --git a/kcmkwin/kwindecoration/qml/main.qml b/kcmkwin/kwindecoration/qml/main.qml index 692d576886..d940bba641 100644 --- a/kcmkwin/kwindecoration/qml/main.qml +++ b/kcmkwin/kwindecoration/qml/main.qml @@ -34,6 +34,7 @@ ScrollView { } highlightMoveDuration: 250 boundsBehavior: Flickable.StopAtBounds + property int borderSizesIndex: 3 // 3 == Normal delegate: Item { width: listView.width height: 150 @@ -45,6 +46,7 @@ ScrollView { KDecoration.Settings { id: settingsItem bridge: bridgeItem + borderSizesIndex: listView.borderSizesIndex } KDecoration.Decoration { id: inactivePreview