Warning, /plasma/plasma-workspace/applets/systemtray/package/contents/ui/ExpandedRepresentation.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2016 Marco Martin <mart@kde.org> 0003 SPDX-FileCopyrightText: 2020 Nate Graham <nate@kde.org> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 import QtQuick 2.12 0009 import QtQuick.Layouts 1.12 0010 import QtQuick.Window 2.15 0011 0012 import org.kde.plasma.core as PlasmaCore 0013 import org.kde.plasma.components 3.0 as PlasmaComponents 0014 import org.kde.plasma.extras 2.0 as PlasmaExtras 0015 import org.kde.plasma.plasmoid 2.0 0016 import org.kde.kirigami 2.20 as Kirigami 0017 0018 Item { 0019 id: popup 0020 0021 Layout.minimumWidth: Kirigami.Units.gridUnit * 24 0022 Layout.minimumHeight: Kirigami.Units.gridUnit * 24 0023 0024 property alias hiddenLayout: hiddenItemsView.layout 0025 property alias plasmoidContainer: container 0026 0027 // Header 0028 PlasmaExtras.PlasmoidHeading { 0029 id: plasmoidHeading 0030 anchors { 0031 top: parent.top 0032 left: parent.left 0033 right: parent.right 0034 } 0035 height: trayHeading.height + bottomPadding + container.headingHeight 0036 Behavior on height { 0037 NumberAnimation { duration: Kirigami.Units.shortDuration / 2; easing.type: Easing.InOutQuad } 0038 } 0039 } 0040 0041 // Main content layout 0042 ColumnLayout { 0043 id: expandedRepresentation 0044 anchors.fill: parent 0045 // TODO: remove this so the scrollview fully touches the header; 0046 // add top padding internally 0047 spacing: plasmoidHeading.bottomPadding 0048 0049 // Header content layout 0050 RowLayout { 0051 id: trayHeading 0052 Layout.fillWidth: true 0053 0054 PlasmaComponents.ToolButton { 0055 id: backButton 0056 visible: systemTrayState.activeApplet && systemTrayState.activeApplet.expanded && (hiddenLayout.itemCount > 0) 0057 icon.name: LayoutMirroring.enabled ? "go-previous-symbolic-rtl" : "go-previous-symbolic" 0058 0059 display: PlasmaComponents.AbstractButton.IconOnly 0060 text: i18nc("@action:button", "Go Back") 0061 0062 KeyNavigation.down: hiddenItemsView.visible ? hiddenLayout : container 0063 0064 onClicked: systemTrayState.setActiveApplet(null) 0065 } 0066 0067 Kirigami.Heading { 0068 Layout.fillWidth: true 0069 leftPadding: systemTrayState.activeApplet ? 0 : Kirigami.Units.largeSpacing 0070 0071 level: 1 0072 text: systemTrayState.activeApplet ? systemTrayState.activeApplet.plasmoid.title : i18n("Status and Notifications") 0073 textFormat: Text.PlainText 0074 elide: Text.ElideRight 0075 } 0076 0077 Repeater { 0078 id: primaryActionButtons 0079 0080 model: { 0081 if (actionsButton.applet === null) { 0082 return []; 0083 } 0084 const primaryActions = []; 0085 actionsButton.applet.plasmoid.contextualActions.forEach(action => { 0086 if (action.priority == PlasmaCore.Action.HighPriority) { 0087 primaryActions.push(action); 0088 } 0089 }) 0090 return primaryActions; 0091 } 0092 0093 delegate: PlasmaComponents.ToolButton { 0094 // We cannot use `action` as it is already a QQuickAction property of the button 0095 property QtObject qAction: model.modelData 0096 0097 visible: qAction && qAction.visible 0098 0099 // NOTE: it needs an IconItem because QtQuickControls2 buttons cannot load QIcons as their icon 0100 contentItem: Kirigami.Icon { 0101 anchors.centerIn: parent 0102 active: parent.hovered 0103 implicitWidth: Kirigami.Units.iconSizes.smallMedium 0104 implicitHeight: implicitWidth 0105 source: parent.qAction ? parent.qAction.icon : "" 0106 } 0107 0108 checkable: qAction && qAction.checkable 0109 checked: qAction && qAction.checked 0110 display: PlasmaComponents.AbstractButton.IconOnly 0111 text: qAction ? qAction.text : "" 0112 0113 KeyNavigation.down: backButton.KeyNavigation.down 0114 KeyNavigation.left: (index > 0) ? primaryActionButtons.itemAt(index - 1) : backButton 0115 KeyNavigation.right: (index < primaryActionButtons.count - 1) ? primaryActionButtons.itemAt(index + 1) : 0116 actionsButton.visible ? actionsButton : actionsButton.KeyNavigation.right 0117 0118 PlasmaComponents.ToolTip { 0119 text: parent.text 0120 } 0121 0122 onClicked: qAction.trigger(); 0123 onToggled: qAction.toggle(); 0124 } 0125 } 0126 0127 PlasmaComponents.ToolButton { 0128 id: actionsButton 0129 visible: visibleActions > 0 0130 checked: visibleActions > 1 ? configMenu.status !== PlasmaExtras.Menu.Closed : singleAction && singleAction.checked 0131 property QtObject applet: systemTrayState.activeApplet || root 0132 property int visibleActions: menuItemFactory.count 0133 property QtObject singleAction: visibleActions === 1 && menuItemFactory.object ? menuItemFactory.object.action : null 0134 0135 icon.name: "application-menu" 0136 checkable: visibleActions > 1 || (singleAction && singleAction.checkable) 0137 contentItem.opacity: visibleActions > 1 0138 0139 display: PlasmaComponents.AbstractButton.IconOnly 0140 text: actionsButton.singleAction ? actionsButton.singleAction.text : i18n("More actions") 0141 0142 Accessible.role: actionsButton.singleAction ? Accessible.Button : Accessible.ButtonMenu 0143 0144 KeyNavigation.down: backButton.KeyNavigation.down 0145 KeyNavigation.right: configureButton.visible ? configureButton : configureButton.KeyNavigation.right 0146 0147 // NOTE: it needs a Kirigami.Icon because QtQuickControls2 buttons cannot load QIcons as their icon 0148 Kirigami.Icon { 0149 parent: actionsButton 0150 anchors.centerIn: parent 0151 active: actionsButton.hovered 0152 implicitWidth: Kirigami.Units.iconSizes.smallMedium 0153 implicitHeight: implicitWidth 0154 source: actionsButton.singleAction !== null ? actionsButton.singleAction.icon.name : "" 0155 visible: actionsButton.singleAction 0156 } 0157 onToggled: { 0158 if (visibleActions > 1) { 0159 if (checked) { 0160 configMenu.openRelative(); 0161 } else { 0162 configMenu.close(); 0163 } 0164 } 0165 } 0166 onClicked: { 0167 if (singleAction) { 0168 singleAction.trigger(); 0169 } 0170 } 0171 PlasmaComponents.ToolTip { 0172 text: parent.text 0173 } 0174 PlasmaExtras.Menu { 0175 id: configMenu 0176 visualParent: actionsButton 0177 placement: PlasmaExtras.Menu.BottomPosedLeftAlignedPopup 0178 } 0179 0180 Instantiator { 0181 id: menuItemFactory 0182 model: { 0183 configMenu.clearMenuItems(); 0184 if (!actionsButton.applet) { 0185 return []; 0186 } 0187 let actions = []; 0188 for (let i in actionsButton.applet.plasmoid.contextualActions) { 0189 const action = actionsButton.applet.plasmoid.contextualActions[i]; 0190 if (action.visible 0191 && action.priority > PlasmaCore.Action.LowPriority 0192 && !primaryActionButtons.model.includes(action) 0193 && action !== actionsButton.applet.plasmoid.internalAction("configure")) { 0194 actions.push(action); 0195 } 0196 } 0197 return actions; 0198 } 0199 delegate: PlasmaExtras.MenuItem { 0200 id: menuItem 0201 action: modelData 0202 } 0203 onObjectAdded: (index, object) => { 0204 configMenu.addMenuItem(object); 0205 } 0206 } 0207 } 0208 PlasmaComponents.ToolButton { 0209 id: configureButton 0210 icon.name: "configure" 0211 visible: actionsButton.applet && actionsButton.applet.plasmoid.internalAction("configure") 0212 0213 display: PlasmaComponents.AbstractButton.IconOnly 0214 text: actionsButton.applet.plasmoid.internalAction("configure") ? actionsButton.applet.plasmoid.internalAction("configure").text : "" 0215 0216 KeyNavigation.down: backButton.KeyNavigation.down 0217 KeyNavigation.left: actionsButton.visible ? actionsButton : actionsButton.KeyNavigation.left 0218 KeyNavigation.right: pinButton 0219 0220 PlasmaComponents.ToolTip { 0221 text: parent.visible ? parent.text : "" 0222 } 0223 onClicked: actionsButton.applet.plasmoid.internalAction("configure").trigger(); 0224 } 0225 0226 PlasmaComponents.ToolButton { 0227 id: pinButton 0228 checkable: true 0229 checked: Plasmoid.configuration.pin 0230 onToggled: Plasmoid.configuration.pin = checked 0231 icon.name: "window-pin" 0232 0233 display: PlasmaComponents.AbstractButton.IconOnly 0234 text: i18n("Keep Open") 0235 0236 KeyNavigation.down: backButton.KeyNavigation.down 0237 KeyNavigation.left: configureButton.visible ? configureButton : configureButton.KeyNavigation.left 0238 0239 PlasmaComponents.ToolTip { 0240 text: parent.text 0241 } 0242 } 0243 } 0244 0245 // Grid view of all available items 0246 HiddenItemsView { 0247 id: hiddenItemsView 0248 Layout.fillWidth: true 0249 Layout.fillHeight: true 0250 Layout.topMargin: Kirigami.Units.smallSpacing 0251 visible: !systemTrayState.activeApplet 0252 0253 KeyNavigation.up: pinButton 0254 0255 onVisibleChanged: { 0256 if (visible) { 0257 layout.forceActiveFocus(); 0258 systemTrayState.oldVisualIndex = systemTrayState.newVisualIndex = -1; 0259 } 0260 } 0261 } 0262 0263 // Container for currently visible item 0264 PlasmoidPopupsContainer { 0265 id: container 0266 Layout.fillWidth: true 0267 Layout.fillHeight: true 0268 visible: systemTrayState.activeApplet 0269 0270 // We need to add margin on the top so it matches the dialog's own margin 0271 Layout.topMargin: mergeHeadings ? 0 : dialog.topPadding 0272 0273 KeyNavigation.up: pinButton 0274 KeyNavigation.backtab: pinButton 0275 0276 onVisibleChanged: { 0277 if (visible) { 0278 forceActiveFocus(); 0279 } 0280 } 0281 } 0282 } 0283 0284 // Footer 0285 PlasmaExtras.PlasmoidHeading { 0286 id: plasmoidFooter 0287 position: PlasmaComponents.ToolBar.Footer 0288 anchors { 0289 bottom: parent.bottom 0290 left: parent.left 0291 right: parent.right 0292 } 0293 visible: container.appletHasFooter 0294 height: container.footerHeight 0295 // So that it doesn't appear over the content view, which results in 0296 // the footer controls being inaccessible 0297 z: -9999 0298 } 0299 }