/*SPDX-FileCopyrightText: 2020 Kai Uwe Broulik <kde@broulik.de>SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL*/import QtQuickimport QtQuick.Layoutsimport QtQuick.Controls as QQC2import QtQmlimport org.kde.kirigami as Kirigamiimport org.kde.kirigami.delegates as KDimport org.kde.kcmutils as KCMimport org.kde.private.kcms.style as PrivateKCM.ScrollViewKCM {id: rootBinding {target: kcm.filteredModelproperty: "query"value: searchField.textrestoreMode: Binding.RestoreBinding}Binding {target: kcm.filteredModelproperty: "statusFilter"value: filterCombo.model[filterCombo.currentIndex].statusFilterrestoreMode: Binding.RestoreBinding}headerPaddingEnabled: false // Let the InlineMessage touch the edgesheader: ColumnLayout {spacing: 0Kirigami.InlineMessage {readonly property string bugsURL: "https://bugs.kde.org/enter_bug.cgi"Layout.fillWidth: truetype: Kirigami.MessageType.Warningposition: Kirigami.InlineMessage.Position.HeadershowCloseButton: falsevisible: truetext: xi18nc("@info", "If you're disabling something here to work around an issue, please <link url='%1'>submit a bug report about it as well.</link>", bugsURL);onLinkActivated: Qt.openUrlExternally(bugsURL)}Kirigami.InlineMessage {Layout.fillWidth: truetext: i18nc("@info:status inlinemessage", "The background services manager (kded6) is currently not running. Make sure it is installed correctly.");type: Kirigami.MessageType.Errorposition: Kirigami.InlineMessage.Position.HeadershowCloseButton: falsevisible: !kcm.kdedRunning}Kirigami.InlineMessage {id: selfDisablingModulesHintLayout.fillWidth: truetext: i18nc("@info:status inlinemessage", "Some services disable themselves again when manually started if they are not useful in the current environment.")type: Kirigami.MessageType.Informationposition: Kirigami.InlineMessage.Position.HeadershowCloseButton: truevisible: false}Kirigami.InlineMessage {id: runningModulesChangedAfterSaveHintLayout.fillWidth: truetext: i18nc("@info:status inlinemessage", "Some services were automatically started/stopped when the background services manager (kded6) was restarted to apply your changes.")type: Kirigami.MessageType.Informationposition: Kirigami.InlineMessage.Position.HeadershowCloseButton: truevisible: false}Kirigami.InlineMessage {id: errorMessageLayout.fillWidth: truetype: Kirigami.MessageType.Errorposition: Kirigami.InlineMessage.Position.HeadershowCloseButton: truevisible: falseConnections {target: kcmfunction onErrorMessage(errorString) {errorMessage.text = errorString;errorMessage.visible = true;}function onShowSelfDisablingModulesHint() {selfDisablingModulesHint.visible = true;}function onShowRunningModulesChangedAfterSaveHint() {runningModulesChangedAfterSaveHint.visible = true;}}}RowLayout {Layout.fillWidth: true// Equal to the margins removed by disabling header paddingLayout.margins: Kirigami.Units.mediumSpacingspacing: Kirigami.Units.mediumSpacingKirigami.SearchField {id: searchFieldLayout.fillWidth: true}QQC2.ComboBox {id: filterCombotextRole: "text"enabled: kcm.kdedRunning || currentIndex > 0model: [{text: i18nc("@item:inlistbox", "All Services"), statusFilter: Private.KCM.UnknownStatus},{text: i18nc("@item:inlistbox List running services", "Running"), statusFilter: Private.KCM.Running},{text: i18nc("@item:inlistbox List not running services", "Not Running"), statusFilter: Private.KCM.NotRunning}]Kirigami.StyleHints.iconName: "view-filter"}}}view: ListView {id: listclip: trueactiveFocusOnTab: truereuseItems: truemodel: kcm.filteredModelsection.property: "type"section.delegate: Kirigami.ListSectionHeader {width: list.widthlabel: {switch (Number(section)) {case Private.KCM.AutostartType: return i18nc("@title:group list section", "Startup Services");case Private.KCM.OnDemandType: return i18nc("@title:group list section", "Load-on-Demand Services");}}}Component {id: listDelegateComponent// Not using KirigamiDelegates.CheckSubtitleDelegate because some// delegates need to be checkable, but others don'tQQC2.ItemDelegate {id: delegatewidth: list.widthtext: model.displayenabled: !model.immutablecheckable: model.type !== Private.KCM.OnDemandTypechecked: model.autoloadEnabled === truehoverEnabled: checkablefocusPolicy: Qt.ClickFocusAccessible.name: checked ? i18nc("@action:button %1 service name", "Disable automatically loading %1 on startup", delegate.text) : i18nc("@action:button %1 service name", "Enable automatically loading %1 on startup", delegate.text)Accessible.description: i18nc("@info:whatsthis Accessible description", "Toggle automatically loading this service on startup")Accessible.onPressAction: clicked()onClicked: {if (checkable) {model.autoloadEnabled = !model.autoloadEnabled;}}contentItem: RowLayout {QQC2.CheckBox {id: autoloadCheck// Keep focus on the delegatefocusPolicy: Qt.NoFocuschecked: delegate.checkedvisible: delegate.checkableonToggled: model.autoloadEnabled = !model.autoloadEnabledQQC2.ToolTip {text: delegate.Accessible.description}KCM.SettingHighlighter {highlight: !model.autoloadEnabled}}KD.TitleSubtitle {id: titleSubtitleLayout.fillWidth: truetitle: delegate.textsubtitle: model.descriptionselected: delegate.highlighted || delegate.pressed || delegate.down}QQC2.Label {id: statusLabelhorizontalAlignment: Text.AlignRightopacity: model.status === Private.KCM.Running ? 1 : 0.75color: model.status === Private.KCM.Running? Kirigami.Theme.positiveTextColor: (titleSubtitle.selected ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor)visible: kcm.kdedRunning && model.type !== Private.KCM.OnDemandTypetext: {switch (model.status) {case Private.KCM.NotRunning: return i18nc("@info:status", "Not running");case Private.KCM.Running: return i18nc("@info:status", "Running");}return "";}textFormat: Text.PlainText}QQC2.Button {icon.name: model.status === Private.KCM.Running ? "media-playback-pause" : "media-playback-start"visible: kcm.kdedRunning && model.status !== Private.KCM.UnknownStatus && model.type !== Private.KCM.OnDemandTypeonClicked: {errorMessage.visible = false;if (model.status === Private.KCM.Running) {kcm.stopModule(model.moduleName);} else {kcm.startModule(model.moduleName);}}Accessible.name: model.status === Private.KCM.Running ? i18nc("@action:button %1 service name", "Stop %1", delegate.text) : i18nc("@action:button %1 service name", "Start %1", delegate.text)QQC2.ToolTip.delay: Kirigami.Units.toolTipDelayQQC2.ToolTip.visible: hoveredQQC2.ToolTip.text: model.status === Private.KCM.Running ? i18nc("@action:button", "Stop Service") : i18nc("@action:button", "Start Service")}}}}delegate: listDelegateComponent}}