diff --git a/kcms/baloo/package/contents/ui/main.qml b/kcms/baloo/package/contents/ui/main.qml --- a/kcms/baloo/package/contents/ui/main.qml +++ b/kcms/baloo/package/contents/ui/main.qml @@ -23,7 +23,7 @@ import QtQuick.Controls 2.11 as QQC2 import QtQuick.Dialogs 1.2 as QtDialogs import org.kde.kirigami 2.4 as Kirigami -import org.kde.kcm 1.1 as KCM +import org.kde.kcm 1.3 as KCM KCM.SimpleKCM { id: root @@ -43,11 +43,16 @@ QQC2.CheckBox { id: fileSearchEnabled text: i18n("Enable File Search") - enabled: !kcm.balooSettings.isImmutable("indexingEnabled") checked: kcm.balooSettings.indexingEnabled onCheckStateChanged: { kcm.balooSettings.indexingEnabled = checked } + + KCM.SettingStateBinding { + target: parent + configObject: kcm.balooSettings + itemName: "indexingEnabled" + } } RowLayout { @@ -61,16 +66,28 @@ QQC2.CheckBox { id: indexFileContents text: i18n("Also index file content") - enabled: fileSearchEnabled.checked && !kcm.balooSettings.isImmutable("onlyBasicIndexing") checked: !kcm.balooSettings.onlyBasicIndexing onCheckStateChanged: kcm.balooSettings.onlyBasicIndexing = !checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.balooSettings + itemName: "onlyBasicIndexing" + extraEnabledPredicate: fileSearchEnabled.checked + } } QQC2.CheckBox { id: indexHiddenFolders text: i18n("Index hidden files and folders") - enabled: fileSearchEnabled.checked && !kcm.balooSettings.isImmutable("indexHiddenFolders") checked: kcm.balooSettings.indexHiddenFolders onCheckStateChanged: kcm.balooSettings.indexHiddenFolders = checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.balooSettings + itemName: "indexHiddenFolders" + extraEnabledPredicate: fileSearchEnabled.checked + } } } } diff --git a/kcms/colors/package/contents/ui/main.qml b/kcms/colors/package/contents/ui/main.qml --- a/kcms/colors/package/contents/ui/main.qml +++ b/kcms/colors/package/contents/ui/main.qml @@ -25,7 +25,7 @@ import QtQuick.Controls 2.3 as QtControls import org.kde.kirigami 2.4 as Kirigami import org.kde.newstuff 1.62 as NewStuff -import org.kde.kcm 1.1 as KCM +import org.kde.kcm 1.3 as KCM import org.kde.private.kcms.colors 1.0 as Private KCM.GridViewKCM { @@ -47,7 +47,13 @@ value: filterCombo.model[filterCombo.currentIndex].filter } - enabled: !kcm.downloadingFile && !kcm.colorsSettings.isImmutable("colorScheme") + KCM.SettingStateBinding { + target: parent + configObject: kcm.colorsSettings + itemName: "colorScheme" + extraEnabledPredicate: !kcm.downloadingFile + indicatorAsOverlay: true + } Component.onCompleted: { // The thumbnails are a bit more elaborate and need more room, especially when translated diff --git a/kcms/cursortheme/package/contents/ui/main.qml b/kcms/cursortheme/package/contents/ui/main.qml --- a/kcms/cursortheme/package/contents/ui/main.qml +++ b/kcms/cursortheme/package/contents/ui/main.qml @@ -23,7 +23,7 @@ import QtQuick.Dialogs 1.1 as QtDialogs import org.kde.kirigami 2.4 as Kirigami import org.kde.newstuff 1.62 as NewStuff -import org.kde.kcm 1.1 as KCM +import org.kde.kcm 1.3 as KCM import org.kde.private.kcm_cursortheme 1.0 @@ -43,7 +43,13 @@ view.positionViewAtIndex(view.currentIndex, GridView.Beginning); } - enabled: !kcm.downloadingFile + KCM.SettingStateBinding { + target: parent + configObject: kcm.cursorThemeSettings + itemName: "cursorTheme" + extraEnabledPredicate: !kcm.downloadingFile + indicatorAsOverlay: true + } DropArea { anchors.fill: parent @@ -94,7 +100,14 @@ RowLayout { id: comboLayout - enabled: kcm.canResize + + KCM.SettingStateBinding { + target: parent + configObject: kcm.cursorThemeSettings + itemName: "cursorSize" + extraEnabledPredicate: kcm.canResize + } + QtControls.Label { text: i18n("Size:") } diff --git a/kcms/fonts/fontsaasettings.h b/kcms/fonts/fontsaasettings.h --- a/kcms/fonts/fontsaasettings.h +++ b/kcms/fonts/fontsaasettings.h @@ -35,6 +35,8 @@ Q_PROPERTY(int dpi READ dpi WRITE setDpi NOTIFY dpiChanged) Q_PROPERTY(KXftConfig::SubPixel::Type subPixel READ subPixel WRITE setSubPixel NOTIFY subPixelChanged) Q_PROPERTY(KXftConfig::Hint::Style hinting READ hinting WRITE setHinting NOTIFY hintingChanged) + Q_PROPERTY(bool isAaImmutable READ isAaImmutable CONSTANT) + Q_PROPERTY(bool excludeStateProxy READ excludeStateProxy NOTIFY excludeStateProxyChanged) public: FontsAASettings(QObject *parent = nullptr); @@ -46,6 +48,8 @@ int dpi() const; KXftConfig::SubPixel::Type subPixel() const; KXftConfig::Hint::Style hinting() const; + bool isAaImmutable() const; + bool excludeStateProxy() const; void setExclude(bool exclude); void setExcludeFrom(int excludeFrom); @@ -64,9 +68,11 @@ void subPixelChanged(); void hintingChanged(); void aliasingChangeApplied(); + void excludeStateProxyChanged(); private: FontAASettingsStore *m_fontAASettingsStore; + bool m_isAaImmutable = false; bool usrSave() override; using NotifySignalType = void (FontsAASettings::*)(); diff --git a/kcms/fonts/fontsaasettings.cpp b/kcms/fonts/fontsaasettings.cpp --- a/kcms/fonts/fontsaasettings.cpp +++ b/kcms/fonts/fontsaasettings.cpp @@ -103,6 +103,11 @@ m_excludeTo = excludeTo; } + bool isImmutable() const + { + return m_isImmutable; + } + bool antiAliasing() const { return m_antiAliasing; @@ -228,6 +233,8 @@ KSharedConfig::Ptr config = KSharedConfig::openConfig("kdeglobals"); KConfigGroup cg(config, "General"); + m_isImmutable = cg.isEntryImmutable("XftAntialias"); + const auto aaState = xft.getAntiAliasing(); setAntiAliasing(aaState != KXftConfig::AntiAliasing::Disabled); @@ -238,6 +245,7 @@ private: FontsAASettings *m_settings; + bool m_isImmutable; bool m_antiAliasing; bool m_antiAliasingChanged; KXftConfig::SubPixel::Type m_subPixel; @@ -249,6 +257,51 @@ int m_excludeTo; }; +class KPropertySkeletonItemStateProxy : public KPropertySkeletonItem +{ +public: + KPropertySkeletonItemStateProxy(QObject *object, const QByteArray &propertyName, const QVariant &defaultValue) + : KPropertySkeletonItem(object, propertyName, defaultValue) + { + setIsDefaultImpl([this] { + return isDefaultImpl(); + }); + setIsSaveNeededImpl([this] { + return false; + }); + } + + ~KPropertySkeletonItemStateProxy() override = default; + + void addItem(KConfigSkeletonItem *item) + { + m_items << item; + } + + void setDefault() override + { + for (auto item : qAsConst(m_items)) { + if (item) { + item->setDefault(); + } + } + } + + bool isDefaultImpl() const + { + bool isDefault = true; + for (const auto item : qAsConst(m_items)) { + if (item) { + isDefault &= item->isDefault(); + } + } + return isDefault; + } + +private: + QVector m_items; +}; + FontsAASettings::FontsAASettings(QObject *parent) : FontsAASettingsBase(parent) @@ -263,6 +316,13 @@ connect(this, &FontsAASettings::forceFontDPIWaylandChanged, this, &FontsAASettings::dpiChanged); connect(this, &FontsAASettings::forceFontDPIChanged, this, &FontsAASettings::dpiChanged); + + auto item = new KPropertySkeletonItemStateProxy(this, "excludeStateProxy", true); + addItem(item, "excludeStateProxy"); + item->addItem(findItem("excludeFrom")); + item->addItem(findItem("excludeTo")); + connect(this, &FontsAASettings::excludeFromChanged, this, &FontsAASettings::excludeStateProxyChanged); + connect(this, &FontsAASettings::excludeToChanged, this, &FontsAASettings::excludeStateProxyChanged); } void FontsAASettings::addItemInternal(const QByteArray &propertyName, const QVariant &defaultValue, NotifySignalType notifySignal) @@ -349,6 +409,16 @@ return findItem("hinting")->property().value(); } +bool FontsAASettings::isAaImmutable() const +{ + return m_fontAASettingsStore->isImmutable(); +} + +bool FontsAASettings::excludeStateProxy() const +{ + return false; +} + void FontsAASettings::setHinting(KXftConfig::Hint::Style hinting) { findItem("hinting")->setProperty(hinting); diff --git a/kcms/fonts/package/contents/ui/main.qml b/kcms/fonts/package/contents/ui/main.qml --- a/kcms/fonts/package/contents/ui/main.qml +++ b/kcms/fonts/package/contents/ui/main.qml @@ -23,7 +23,7 @@ import QtQuick.Controls 2.0 as QtControls import QtQuick.Dialogs 1.2 as QtDialogs import org.kde.kirigami 2.4 as Kirigami -import org.kde.kcm 1.1 as KCM +import org.kde.kcm 1.3 as KCM KCM.SimpleKCM { id: root @@ -68,37 +68,67 @@ label: i18n("General:") category: "font" font: kcm.fontsSettings.font - enabled: !kcm.fontsSettings.isImmutable("font") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsSettings + itemName: "font" + } } FontWidget { label: i18n("Fixed width:") category: "fixed" font: kcm.fontsSettings.fixed - enabled: !kcm.fontsSettings.isImmutable("fixed") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsSettings + itemName: "fixed" + } } FontWidget { label: i18n("Small:") category: "smallestReadableFont" font: kcm.fontsSettings.smallestReadableFont - enabled: !kcm.fontsSettings.isImmutable("smallestReadableFont") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsSettings + itemName: "smallestReadableFont" + } } FontWidget { label: i18n("Toolbar:") category: "toolBarFont" font: kcm.fontsSettings.toolBarFont - enabled: !kcm.fontsSettings.isImmutable("toolBarFont") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsSettings + itemName: "toolBarFont" + } } FontWidget { label: i18n("Menu:") category: "menuFont" font: kcm.fontsSettings.menuFont - enabled: !kcm.fontsSettings.isImmutable("menuFont") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsSettings + itemName: "menuFont" + } } FontWidget { label: i18n("Window title:") category: "activeFont" font: kcm.fontsSettings.activeFont - enabled: !kcm.fontsSettings.isImmutable("activeFont") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsSettings + itemName: "activeFont" + } } Kirigami.Separator { @@ -112,6 +142,13 @@ Kirigami.FormData.label: i18n("Anti-Aliasing:") text: i18n("Enable") Layout.fillWidth: true + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsAASettings + itemName: "antiAliasing" + extraEnabledPredicate: !kcm.fontsAASettings.isAaImmutable + } } QtControls.CheckBox { @@ -121,12 +158,19 @@ text: i18n("Exclude range from anti-aliasing") Layout.fillWidth: true enabled: antiAliasingCheckBox.checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsAASettings + itemName: "exclude" + extraEnabledPredicate: !kcm.fontsAASettings.isAaImmutable + } } RowLayout { id: excludeField Layout.preferredWidth: formLayout.maxImplicitWidth - enabled: antiAliasingCheckBox.checked + enabled: antiAliasingCheckBox.enabled && antiAliasingCheckBox.checked QtControls.SpinBox { id: excludeFromSpinBox stepSize: 1 @@ -154,6 +198,13 @@ editable: true enabled: excludeCheckBox.checked value: kcm.fontsAASettings.excludeTo + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsAASettings + itemName: "excludeStateProxy" + extraEnabledPredicate: excludeCheckBox.checked + } } Connections { target: kcm.fontsAASettings @@ -170,7 +221,6 @@ onCurrentIndexChanged: kcm.subPixelCurrentIndex = currentIndex; model: kcm.subPixelOptionsModel textRole: "display" - enabled: antiAliasingCheckBox.checked popup.height: popup.implicitHeight delegate: QtControls.ItemDelegate { id: subPixelDelegate @@ -197,6 +247,13 @@ } } } + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsAASettings + itemName: "subPixel" + extraEnabledPredicate: antiAliasingCheckBox.checked && !kcm.fontsAASettings.isAaImmutable + } } QtControls.ComboBox { @@ -207,7 +264,6 @@ onCurrentTextChanged: kcm.hintingCurrentIndex = currentIndex; model: kcm.hintingOptionsModel textRole: "display" - enabled: antiAliasingCheckBox.checked popup.height: popup.implicitHeight delegate: QtControls.ItemDelegate { id: hintingDelegate @@ -234,11 +290,21 @@ } } } + + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsAASettings + itemName: "hinting" + extraEnabledPredicate: antiAliasingCheckBox.checked && !kcm.fontsAASettings.isAaImmutable + } } RowLayout { + Layout.preferredWidth: formLayout.maxImplicitWidth + QtControls.CheckBox { id: dpiCheckBox + enabled: antiAliasingCheckBox.checked && !kcm.fontsAASettings.isAaImmutable checked: kcm.fontsAASettings.dpi !== 0 text: i18n("Force font DPI:") onClicked: kcm.fontsAASettings.dpi = (checked ? dpiSpinBox.value : 0) @@ -248,13 +314,27 @@ id: dpiSpinBox stepSize: 24 editable: true - enabled: dpiCheckBox.checked value: kcm.fontsAASettings.dpi !== 0 ? kcm.fontsAASettings.dpi : 96 onValueModified: kcm.fontsAASettings.dpi = value // to: need to divide to stepSize to: 1008 // lowest vaue here can be == stepSize, that is because 0 means off from: 24 + + // dpiSpinBox will set forceFontDPI or forceFontDPIWayland, + // so only one SettingStateBinding will be displayed at a time. + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsAASettings + itemName: "forceFontDPIWayland" + extraEnabledPredicate: dpiCheckBox.enabled && dpiCheckBox.checked + } + KCM.SettingStateBinding { + target: parent + configObject: kcm.fontsAASettings + itemName: "forceFontDPI" + extraEnabledPredicate: dpiCheckBox.enabled && dpiCheckBox.checked + } } } diff --git a/kcms/ksplash/package/contents/ui/main.qml b/kcms/ksplash/package/contents/ui/main.qml --- a/kcms/ksplash/package/contents/ui/main.qml +++ b/kcms/ksplash/package/contents/ui/main.qml @@ -22,12 +22,18 @@ import QtQuick.Controls 1.0 as QtControls import org.kde.kirigami 2.4 as Kirigami import org.kde.newstuff 1.62 as NewStuff -import org.kde.kcm 1.1 as KCM +import org.kde.kcm 1.3 as KCM KCM.GridViewKCM { KCM.ConfigModule.quickHelp: i18n("This module lets you choose the splash screen theme.") - enabled: !kcm.testing && !kcm.splashScreenSettings.isImmutable("theme") + KCM.SettingStateBinding { + target: parent + configObject: kcm.splashScreenSettings + itemName: "theme" + extraEnabledPredicate: !kcm.testing + indicatorAsOverlay: true + } view.model: kcm.splashModel //NOTE: pay attention to never break this binding diff --git a/kcms/launch/package/contents/ui/main.qml b/kcms/launch/package/contents/ui/main.qml --- a/kcms/launch/package/contents/ui/main.qml +++ b/kcms/launch/package/contents/ui/main.qml @@ -20,13 +20,13 @@ import QtQuick.Layouts 1.1 import QtQuick.Controls 2.2 as QtControls import org.kde.kirigami 2.3 as Kirigami -import org.kde.kcm 1.1 +import org.kde.kcm 1.3 as KCM import org.kde.private.kcms.launchfeedback 1.0 as Private -SimpleKCM { +KCM.SimpleKCM { id: root - ConfigModule.quickHelp: i18n("Launch Feedback") + KCM.ConfigModule.quickHelp: i18n("Launch Feedback") Kirigami.FormLayout { id: formLayout @@ -79,13 +79,18 @@ QtControls.CheckBox { id: taskManagerNotification - enabled: !kcm.launchFeedbackSettings.isImmutable("taskbarButton") Kirigami.FormData.label: i18n("Task Manager:") text: i18n("Enable animation") checked: kcm.launchFeedbackSettings.taskbarButton onToggled: kcm.launchFeedbackSettings.taskbarButton = checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.launchFeedbackSettings + itemName: "taskbarButton" + } } QtControls.SpinBox { @@ -96,16 +101,21 @@ stepSize: 1 editable: true - enabled: taskManagerNotification.checked && !kcm.launchFeedbackSettings.isImmutable("cursorTimeout") - value: kcm.launchFeedbackSettings.cursorTimeout onValueModified: { kcm.launchFeedbackSettings.cursorTimeout = value kcm.launchFeedbackSettings.taskbarTimeout = value } textFromValue: function(value, locale) { return i18np("%1 sec", "%1 secs", value)} valueFromText: function(text, locale) { return parseInt(text) } + + KCM.SettingStateBinding { + target: parent + configObject: kcm.launchFeedbackSettings + itemName: "cursorTimeout" + extraEnabledPredicate: taskManagerNotification.checked + } } } } diff --git a/kcms/lookandfeel/package/contents/ui/main.qml b/kcms/lookandfeel/package/contents/ui/main.qml --- a/kcms/lookandfeel/package/contents/ui/main.qml +++ b/kcms/lookandfeel/package/contents/ui/main.qml @@ -23,15 +23,20 @@ import org.kde.kirigami 2.4 as Kirigami import org.kde.newstuff 1.62 as NewStuff import org.kde.kconfig 1.0 // for KAuthorized -import org.kde.kcm 1.1 as KCM +import org.kde.kcm 1.3 as KCM KCM.GridViewKCM { KCM.ConfigModule.quickHelp: i18n("This module lets you choose the global look and feel.") view.model: kcm.lookAndFeelModel view.currentIndex: kcm.pluginIndex(kcm.lookAndFeelSettings.lookAndFeelPackage) - enabled: !kcm.lookAndFeelSettings.isImmutable("lookAndFeelPackage") + KCM.SettingStateBinding { + target: parent + configObject: kcm.lookAndFeelSettings + itemName: "lookAndFeelPackage" + indicatorAsOverlay: true + } view.delegate: KCM.GridDelegate { id: delegate diff --git a/kcms/notifications/package/contents/ui/ApplicationConfiguration.qml b/kcms/notifications/package/contents/ui/ApplicationConfiguration.qml --- a/kcms/notifications/package/contents/ui/ApplicationConfiguration.qml +++ b/kcms/notifications/package/contents/ui/ApplicationConfiguration.qml @@ -24,7 +24,7 @@ import QtQuick.Controls 2.3 as QtControls import org.kde.kirigami 2.7 as Kirigami -import org.kde.kcm 1.2 as KCM +import org.kde.kcm 1.3 as KCM import org.kde.notificationmanager 1.0 as NotificationManager @@ -80,34 +80,56 @@ QtControls.CheckBox { id: showPopupsCheck text: i18n("Show popups") - enabled: !kcm.behaviorSettings.isShowPopupsImmutable checked: kcm.behaviorSettings.showPopups onClicked: kcm.behaviorSettings.showPopups = checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.behaviorSettings + itemName: "ShowPopups" + } } RowLayout { // just for indentation QtControls.CheckBox { Layout.leftMargin: mirrored ? 0 : indicator.width Layout.rightMargin: mirrored ? indicator.width : 0 text: i18n("Show in do not disturb mode") - enabled: showPopupsCheck.checked && !kcm.behaviorSettings.isShowPopupsInDndModeImmutable checked: kcm.behaviorSettings.showPopupsInDndMode onClicked: kcm.behaviorSettings.showPopupsInDndMode = checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.behaviorSettings + itemName: "ShowPopupsInDndMode" + extraEnabledPredicate: showPopupsCheck.checked + } } } QtControls.CheckBox { text: i18n("Show in history") - enabled: !kcm.behaviorSettings.isShowInHistoryImmutable checked: kcm.behaviorSettings.showInHistory onClicked: kcm.behaviorSettings.showInHistory = checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.behaviorSettings + itemName: "ShowInHistory" + } } QtControls.CheckBox { text: i18n("Show notification badges") - enabled: !!configColumn.desktopEntry && configColumn.desktopEntry !== configColumn.otherAppsId && !kcm.behaviorSettings.isShowBadgesImmutable checked: kcm.behaviorSettings.showBadges onClicked: kcm.behaviorSettings.showBadges = checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.behaviorSettings + itemName: "ShowBadges" + extraEnabledPredicate: !!configColumn.desktopEntry && configColumn.desktopEntry !== configColumn.otherAppsId + } } Kirigami.Separator { diff --git a/kcms/notifications/package/contents/ui/main.qml b/kcms/notifications/package/contents/ui/main.qml --- a/kcms/notifications/package/contents/ui/main.qml +++ b/kcms/notifications/package/contents/ui/main.qml @@ -23,7 +23,7 @@ import QtQuick.Controls 2.3 as QtControls import org.kde.kirigami 2.4 as Kirigami import org.kde.kquickcontrols 2.0 as KQuickControls -import org.kde.kcm 1.2 as KCM +import org.kde.kcm 1.3 as KCM import org.kde.notificationmanager 1.0 as NotificationManager @@ -79,14 +79,26 @@ text: i18nc("Do not disturb when screens are mirrored", "Enable when screens are mirrored") checked: kcm.dndSettings.whenScreensMirrored onClicked: kcm.dndSettings.whenScreensMirrored = checked - enabled: root.notificationsAvailable && !kcm.dndSettings.isImmutable("WhenScreensMirrored") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.dndSettings + itemName: "WhenScreensMirrored" + extraEnabledPredicate: root.notificationsAvailable + } } QtControls.CheckBox { text: i18n("Show critical notifications") checked: kcm.notificationSettings.criticalInDndMode onClicked: kcm.notificationSettings.criticalInDndMode = checked - enabled: root.notificationsAvailable && !kcm.notificationSettings.isImmutable("CriticalInDndMode") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.notificationSettings + itemName: "CriticalInDndMode" + extraEnabledPredicate: root.notificationsAvailable + } } RowLayout { @@ -111,7 +123,13 @@ text: i18n("Always keep on top") checked: kcm.notificationSettings.criticalAlwaysOnTop onClicked: kcm.notificationSettings.criticalAlwaysOnTop = checked - enabled: root.notificationsAvailable && !kcm.notificationSettings.isImmutable("CriticalAlwaysOnTop") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.notificationSettings + itemName: "CriticalAlwaysOnTop" + extraEnabledPredicate: root.notificationsAvailable + } } Item { @@ -123,14 +141,26 @@ text: i18n("Show popup") checked: kcm.notificationSettings.lowPriorityPopups onClicked: kcm.notificationSettings.lowPriorityPopups = checked - enabled: root.notificationsAvailable && !kcm.notificationSettings.isImmutable("LowPriorityPopups") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.notificationSettings + itemName: "LowPriorityPopups" + extraEnabledPredicate: root.notificationsAvailable + } } QtControls.CheckBox { text: i18n("Show in history") checked: kcm.notificationSettings.lowPriorityHistory onClicked: kcm.notificationSettings.lowPriorityHistory = checked - enabled: root.notificationsAvailable && !kcm.notificationSettings.isImmutable("LowPriorityHistory") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.notificationSettings + itemName: "LowPriorityHistory" + extraEnabledPredicate: root.notificationsAvailable + } } QtControls.ButtonGroup { @@ -150,12 +180,18 @@ // Force binding re-evaluation when user returns from position selector + kcm.currentIndex * 0 onClicked: kcm.notificationSettings.popupPosition = NotificationManager.Settings.CloseToWidget - enabled: root.notificationsAvailable && !kcm.notificationSettings.isImmutable("PopupPosition") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.notificationSettings + itemName: "PopupPosition" + extraEnabledPredicate: root.notificationsAvailable + } } RowLayout { spacing: 0 - enabled: root.notificationsAvailable && !kcm.notificationSettings.isImmutable("PopupPosition") + enabled: positionCloseToWidget.enabled QtControls.RadioButton { id: positionCustomPosition @@ -198,15 +234,21 @@ to: 120000 // 2 minutes stepSize: 1000 value: kcm.notificationSettings.popupTimeout - enabled: root.notificationsAvailable && !kcm.notificationSettings.isImmutable("PopupTimeout") editable: true valueFromText: function(text, locale) { return parseInt(text) * 1000; } textFromValue: function(value, locale) { return i18np("%1 second", "%1 seconds", Math.round(value / 1000)); } onValueModified: kcm.notificationSettings.popupTimeout = value + + KCM.SettingStateBinding { + target: parent + configObject: kcm.notificationSettings + itemName: "PopupTimeout" + extraEnabledPredicate: root.notificationsAvailable + } } } @@ -219,25 +261,41 @@ text: i18n("Show in task manager") checked: kcm.jobSettings.inTaskManager onClicked: kcm.jobSettings.inTaskManager = checked - enabled: !kcm.jobSettings.isImmutable("InTaskManager") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.jobSettings + itemName: "InTaskManager" + } } QtControls.CheckBox { id: applicationJobsEnabledCheck text: i18nc("Show application jobs in notification widget", "Show in notifications") checked: kcm.jobSettings.inNotifications onClicked: kcm.jobSettings.inNotifications = checked - enabled: !kcm.jobSettings.isImmutable("InNotifications") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.jobSettings + itemName: "InNotifications" + } } RowLayout { // just for indentation QtControls.CheckBox { Layout.leftMargin: mirrored ? 0 : indicator.width Layout.rightMargin: mirrored ? indicator.width : 0 text: i18nc("Keep application job popup open for entire duration of job", "Keep popup open during progress") - enabled: applicationJobsEnabledCheck.checked && !kcm.jobSettings.isImmutable("PermanentPopups") checked: kcm.jobSettings.permanentPopups onClicked: kcm.jobSettings.permanentPopups = checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.jobSettings + itemName: "PermanentPopups" + extraEnabledPredicate: applicationJobsEnabledCheck.checked + } } } @@ -250,7 +308,12 @@ text: i18n("Show in task manager") checked: kcm.badgeSettings.inTaskManager onClicked: kcm.badgeSettings.inTaskManager = checked - enabled: !kcm.badgeSettings.isImmutable("InTaskManager") + + KCM.SettingStateBinding { + target: parent + configObject: kcm.badgeSettings + itemName: "InTaskManager" + } } Kirigami.Separator { diff --git a/kcms/style/package/contents/ui/EffectSettingsPopup.qml b/kcms/style/package/contents/ui/EffectSettingsPopup.qml --- a/kcms/style/package/contents/ui/EffectSettingsPopup.qml +++ b/kcms/style/package/contents/ui/EffectSettingsPopup.qml @@ -22,41 +22,53 @@ import QtQuick.Layouts 1.1 import QtQuick.Controls 2.3 as QtControls import org.kde.kirigami 2.4 as Kirigami +import org.kde.kcm 1.3 as KCM import org.kde.private.kcms.style 1.0 as Private QtControls.Popup { id: effectSettingsPopup modal: true + implicitWidth: formLayout.implicitWidth + 40 // Leave some room for SettingState buttons onOpened: { // can we do this automatically with "focus: true" somewhere? iconsOnButtonsCheckBox.forceActiveFocus(); } Kirigami.FormLayout { + id: formLayout // Popup's autosizing causes FormLayout to collapse when opening it a second time :( wideMode: true QtControls.CheckBox { id: iconsOnButtonsCheckBox Kirigami.FormData.label: i18n("Show icons:") text: i18n("On buttons") - enabled: !kcm.styleSettings.isImmutable("iconsOnButtons") checked: kcm.styleSettings.iconsOnButtons onClicked: kcm.styleSettings.iconsOnButtons = checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.styleSettings + itemName: "iconsOnButtons" + } } QtControls.CheckBox { text: i18n("In menus") - enabled: !kcm.styleSettings.isImmutable("iconsInMenus") checked: kcm.styleSettings.iconsInMenus onClicked: kcm.styleSettings.iconsInMenus = checked + + KCM.SettingStateBinding { + target: parent + configObject: kcm.styleSettings + itemName: "iconsInMenus" + } } QtControls.ComboBox { id: mainToolBarStyleCombo - enabled: !kcm.styleSettings.isImmutable("toolButtonStyle") Kirigami.FormData.label: i18n("Main toolbar label:") model: [ {text: i18n("None"), value: Private.KCM.NoText}, @@ -69,17 +81,28 @@ return item.value === kcm.mainToolBarStyle }) onActivated: kcm.mainToolBarStyle = model[currentIndex].value + + KCM.SettingStateBinding { + target: parent + configObject: kcm.styleSettings + itemName: "toolButtonStyle" + } } QtControls.ComboBox { - enabled: !kcm.styleSettings.isImmutable("toolButtonStyleOtherToolbars") Kirigami.FormData.label: i18n("Secondary toolbar label:") model: mainToolBarStyleCombo.model textRole: "text" currentIndex: model.findIndex(function (item) { return item.value === kcm.otherToolBarStyle }) onActivated: kcm.otherToolBarStyle = model[currentIndex].value + + KCM.SettingStateBinding { + target: parent + configObject: kcm.styleSettings + itemName: "toolButtonStyleOtherToolbars" + } } } } diff --git a/kcms/style/package/contents/ui/main.qml b/kcms/style/package/contents/ui/main.qml --- a/kcms/style/package/contents/ui/main.qml +++ b/kcms/style/package/contents/ui/main.qml @@ -22,7 +22,7 @@ import QtQuick.Layouts 1.1 import QtQuick.Controls 2.3 as QtControls import org.kde.kirigami 2.4 as Kirigami -import org.kde.kcm 1.1 as KCM +import org.kde.kcm 1.3 as KCM import org.kde.private.kcms.style 1.0 as Private KCM.GridViewKCM { @@ -33,7 +33,12 @@ view.model: kcm.model view.currentIndex: kcm.model.selectedStyleIndex - view.enabled: !kcm.styleSettings.isImmutable("widgetStyle") + KCM.SettingStateBinding { + target: parent + configObject: kcm.styleSettings + itemName: "widgetStyle" + indicatorAsOverlay: true + } function openGtkStyleSettings() { kcm.push("GtkStylePage.qml");