Warning, /plasma/plasma-workspace/kcms/autostart/ui/main.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2020 Nicolas Fella <nicolas.fella@gmx.de 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 import QtCore 0008 import QtQuick 0009 import QtQuick.Controls 0010 import QtQuick.Layouts 0011 import QtQuick.Dialogs 0012 0013 import org.kde.kcmutils as KCM 0014 import org.kde.kirigami as Kirigami 0015 import org.kde.plasma.kcm.autostart 0016 0017 KCM.ScrollViewKCM { 0018 id: root 0019 0020 implicitHeight: Kirigami.Units.gridUnit * 28 0021 implicitWidth: Kirigami.Units.gridUnit * 28 0022 0023 header: Kirigami.InlineMessage { 0024 id: errorMessage 0025 0026 showCloseButton: true 0027 0028 Connections { 0029 target: kcm.model 0030 0031 property var fixItAction: Kirigami.Action { 0032 property string fileName 0033 text: i18n("Make Executable") 0034 icon.name: "dialog-ok" 0035 onTriggered: { 0036 kcm.model.makeFileExecutable(fileName); 0037 errorMessage.visible = false; 0038 } 0039 } 0040 0041 function onError(message) { 0042 errorMessage.type = Kirigami.MessageType.Error; 0043 errorMessage.visible = true; 0044 errorMessage.text = message; 0045 } 0046 0047 function onNonExecutableScript(fileName, kind) { 0048 fixItAction.fileName = fileName; 0049 errorMessage.type = Kirigami.MessageType.Warning; 0050 errorMessage.visible = true; 0051 errorMessage.actions = [fixItAction]; 0052 if (kind === AutostartModel.PlasmaShutdown) { 0053 errorMessage.text = i18nd("kcm_autostart", "The file '%1' must be executable to run at logout.", fileName); 0054 } else { 0055 errorMessage.text = i18nd("kcm_autostart", "The file '%1' must be executable to run at login.", fileName); 0056 } 0057 } 0058 0059 } 0060 0061 } 0062 0063 actions: [ 0064 Kirigami.Action { 0065 icon.name: "list-add-symbolic" 0066 text: i18nc("@action:button", "Add…") 0067 0068 Kirigami.Action { 0069 text: i18nc("@action:button", "Add Application…") 0070 icon.name: "list-add-symbolic" 0071 onTriggered: kcm.model.showApplicationDialog(root) 0072 } 0073 Kirigami.Action { 0074 text: i18nc("@action:button", "Add Login Script…") 0075 icon.name: "list-add-symbolic" 0076 onTriggered: loginFileDialogLoader.active = true 0077 } 0078 Kirigami.Action { 0079 text: i18nc("@action:button", "Add Logout Script…") 0080 icon.name: "list-add-symbolic" 0081 onTriggered: logoutFileDialogLoader.active = true 0082 } 0083 } 0084 ] 0085 0086 view: ListView { 0087 id: listView 0088 0089 clip: true 0090 model: kcm.model 0091 0092 delegate: ItemDelegate { 0093 id: delegate 0094 0095 property Unit unit: model.systemdUnit 0096 property bool noUnit: (unit && !kcm.model.usingSystemdBoot) || (model.source === AutostartModel.PlasmaShutdown || model.source === AutostartModel.PlasmaEnvScripts) 0097 0098 text: model.name 0099 width: ListView.view.width 0100 0101 onClicked: { 0102 if (noUnit) { 0103 return; 0104 } 0105 0106 if (!model.systemdUnit.invalid) { 0107 kcm.pop(); 0108 kcm.push("entry.qml", { 0109 "unit": unit 0110 }); 0111 } else { 0112 errorMessage.type = Kirigami.MessageType.Warning; 0113 errorMessage.visible = true; 0114 errorMessage.text = i18nd("kcm_autostart", "%1 has not been autostarted yet. Details will be available after the system is restarted.", model.name); 0115 } 0116 } 0117 0118 contentItem: RowLayout { 0119 spacing: Kirigami.Units.smallSpacing 0120 0121 Kirigami.IconTitleSubtitle { 0122 Layout.fillWidth: true 0123 icon.name: model.iconName 0124 0125 reserveSpaceForSubtitle: true 0126 0127 title: delegate.text 0128 subtitle: model.source === AutostartModel.PlasmaShutdown || model.source === AutostartModel.XdgScripts ? model.targetFileDirPath : "" 0129 } 0130 0131 Label { 0132 Layout.rightMargin: Kirigami.Units.smallSpacing 0133 text: { 0134 if (noUnit || !model.systemdUnit) { 0135 return ""; 0136 } else if (model.systemdUnit.invalid) { 0137 return i18nc("@label Entry hasn't been autostarted because system hasn't been restarted", "Not autostarted yet"); 0138 } else { 0139 return model.systemdUnit.activeStateValue; 0140 } 0141 } 0142 color: model.systemdUnit.activeState === "failed" ? Kirigami.Theme.negativeTextColor : Kirigami.Theme.disabledTextColor 0143 } 0144 0145 ToolButton { 0146 text: i18nc("@action:button", "See properties") 0147 icon.name: "document-properties" 0148 display: Button.IconOnly 0149 onClicked: kcm.model.editApplication(model.index, root) 0150 visible: model.source === AutostartModel.XdgAutoStart || model.source === AutostartModel.XdgScripts 0151 } 0152 0153 ToolButton { 0154 text: i18nc("@action:button", "Remove entry") 0155 icon.name: "edit-delete-remove" 0156 display: Button.IconOnly 0157 onClicked: kcm.model.removeEntry(model.index) 0158 } 0159 } 0160 } 0161 0162 section.property: "source" 0163 section.delegate: Kirigami.ListSectionHeader { 0164 width: listView.width 0165 text: { 0166 if (section == AutostartModel.XdgAutoStart){ 0167 return i18n("Applications"); 0168 } 0169 if (section == AutostartModel.XdgScripts){ 0170 return i18n("Login Scripts"); 0171 } 0172 if (section == AutostartModel.PlasmaEnvScripts){ 0173 return i18n("Pre-startup Scripts"); 0174 } 0175 if (section == AutostartModel.PlasmaShutdown){ 0176 return i18n("Logout Scripts"); 0177 } 0178 } 0179 } 0180 Kirigami.PlaceholderMessage { 0181 anchors.centerIn: parent 0182 width: parent.width - (Kirigami.Units.largeSpacing * 4) 0183 visible: parent.count === 0 0184 text: i18n("No user-specified autostart items") 0185 explanation: xi18nc("@info 'some' refers to autostart items", "Click the <interface>Add…</interface> button to add some") 0186 } 0187 } 0188 0189 footer: Row { 0190 spacing: Kirigami.Units.largeSpacing 0191 0192 Loader { 0193 id: loginFileDialogLoader 0194 0195 active: false 0196 0197 sourceComponent: FileDialog { 0198 id: loginFileDialog 0199 0200 title: i18n("Choose Login Script") 0201 currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0] 0202 onAccepted: { 0203 kcm.model.addScript(loginFileDialog.selectedFile, AutostartModel.XdgScripts); 0204 loginFileDialogLoader.active = false; 0205 } 0206 onRejected: loginFileDialogLoader.active = false 0207 Component.onCompleted: open() 0208 } 0209 0210 } 0211 0212 Loader { 0213 id: logoutFileDialogLoader 0214 0215 active: false 0216 0217 sourceComponent: FileDialog { 0218 id: logoutFileDialog 0219 0220 title: i18n("Choose Logout Script") 0221 currentFolder: StandardPaths.standardLocations(StandardPaths.HomeLocation)[0] 0222 onAccepted: { 0223 kcm.model.addScript(logoutFileDialog.selectedFile, AutostartModel.PlasmaShutdown); 0224 logoutFileDialogLoader.active = false; 0225 } 0226 onRejected: logoutFileDialogLoader.active = false 0227 Component.onCompleted: open() 0228 } 0229 } 0230 } 0231 }