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 }