Warning, /plasma/plasma-sdk/plasmoidviewer/qmlpackages/shell/contents/applet/CompactApplet.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 import QtQuick 2.15 0007 import QtQuick.Layouts 1.15 0008 import QtQuick.Window 2.15 0009 0010 import org.kde.plasma.core as PlasmaCore 0011 import org.kde.ksvg 1.0 as KSvg 0012 import org.kde.plasma.plasmoid 2.0 0013 import org.kde.kquickcontrolsaddons 2.0 0014 import org.kde.kirigami 2.20 as Kirigami 0015 0016 PlasmaCore.ToolTipArea { 0017 id: root 0018 objectName: "org.kde.desktop-CompactApplet" 0019 anchors.fill: parent 0020 0021 mainText: plasmoidItem ? plasmoidItem.toolTipMainText : "" 0022 subText: plasmoidItem ? plasmoidItem.toolTipSubText : "" 0023 location: Plasmoid.location 0024 active: plasmoidItem ? !plasmoidItem.expanded : false 0025 textFormat: plasmoidItem ? plasmoidItem.toolTipTextFormat : 0 0026 mainItem: plasmoidItem && plasmoidItem.toolTipItem ? plasmoidItem.toolTipItem : null 0027 0028 property Item fullRepresentation 0029 property Item compactRepresentation 0030 property Item expandedFeedback: expandedItem 0031 property PlasmoidItem plasmoidItem 0032 0033 onCompactRepresentationChanged: { 0034 if (compactRepresentation) { 0035 compactRepresentation.anchors.fill = null; 0036 compactRepresentation.parent = compactRepresentationParent; 0037 compactRepresentation.anchors.fill = compactRepresentationParent; 0038 compactRepresentation.visible = true; 0039 } 0040 root.visible = true; 0041 } 0042 0043 onFullRepresentationChanged: { 0044 if (fullRepresentation) { 0045 fullRepresentation.anchors.fill = null; 0046 fullRepresentation.parent = appletParent; 0047 fullRepresentation.anchors.fill = appletParent; 0048 } 0049 } 0050 0051 FocusScope { 0052 id: compactRepresentationParent 0053 anchors.fill: parent 0054 activeFocusOnTab: true 0055 onActiveFocusChanged: { 0056 // When the scope gets the active focus, try to focus its first descendant, 0057 // if there is on which has activeFocusOnTab 0058 if (!activeFocus) { 0059 return; 0060 } 0061 let nextItem = nextItemInFocusChain(); 0062 let candidate = nextItem; 0063 while (candidate.parent) { 0064 if (candidate === compactRepresentationParent) { 0065 nextItem.forceActiveFocus(); 0066 return; 0067 } 0068 candidate = candidate.parent; 0069 } 0070 } 0071 0072 objectName: "expandApplet" 0073 Accessible.name: root.mainText 0074 Accessible.description: i18nd("plasma_shell_org.kde.plasma.desktop", "Open %1", root.subText) 0075 Accessible.role: Accessible.Button 0076 Accessible.onPressAction: Plasmoid.activated() 0077 0078 Keys.onPressed: { 0079 switch (event.key) { 0080 case Qt.Key_Space: 0081 case Qt.Key_Enter: 0082 case Qt.Key_Return: 0083 case Qt.Key_Select: 0084 Plasmoid.activated(); 0085 break; 0086 } 0087 } 0088 } 0089 0090 KSvg.FrameSvgItem { 0091 id: expandedItem 0092 z: -100 0093 0094 property var containerMargins: { 0095 let item = root; 0096 while (item.parent) { 0097 item = item.parent; 0098 if (item.isAppletContainer) { 0099 return item.getMargins; 0100 } 0101 } 0102 return undefined; 0103 } 0104 0105 anchors { 0106 fill: parent 0107 property bool returnAllMargins: true 0108 // The above makes sure margin is returned even for side margins, that 0109 // would be otherwise turned off. 0110 bottomMargin: containerMargins ? -containerMargins('bottom', returnAllMargins) : 0; 0111 topMargin: containerMargins ? -containerMargins('top', returnAllMargins) : 0; 0112 leftMargin: containerMargins ? -containerMargins('left', returnAllMargins) : 0; 0113 rightMargin: containerMargins ? -containerMargins('right', returnAllMargins) : 0; 0114 } 0115 imagePath: "widgets/tabbar" 0116 visible: opacity > 0 0117 prefix: { 0118 let prefix; 0119 switch (Plasmoid.location) { 0120 case PlasmaCore.Types.LeftEdge: 0121 prefix = "west-active-tab"; 0122 break; 0123 case PlasmaCore.Types.TopEdge: 0124 prefix = "north-active-tab"; 0125 break; 0126 case PlasmaCore.Types.RightEdge: 0127 prefix = "east-active-tab"; 0128 break; 0129 default: 0130 prefix = "south-active-tab"; 0131 } 0132 if (!hasElementPrefix(prefix)) { 0133 prefix = "active-tab"; 0134 } 0135 return prefix; 0136 } 0137 opacity: plasmoidItem && plasmoidItem.expanded ? 1 : 0 0138 Behavior on opacity { 0139 NumberAnimation { 0140 duration: Kirigami.Units.shortDuration 0141 easing.type: Easing.InOutQuad 0142 } 0143 } 0144 } 0145 0146 Timer { 0147 id: expandedSync 0148 interval: 100 0149 onTriggered: plasmoidItem.expanded = dialog.visible; 0150 } 0151 0152 Connections { 0153 target: Plasmoid.internalAction("configure") 0154 function onTriggered() { 0155 if (root.plasmoidItem.hideOnWindowDeactivate) { 0156 plasmoidItem.expanded = false 0157 } 0158 } 0159 } 0160 0161 Connections { 0162 target: root.Plasmoid 0163 function onContextualActionsAboutToShow() { root.hideImmediately() } 0164 } 0165 0166 PlasmaCore.Dialog { 0167 id: dialog 0168 objectName: "popupWindow" 0169 flags: Qt.WindowStaysOnTopHint 0170 location: Plasmoid.location 0171 hideOnWindowDeactivate: root.plasmoidItem && root.plasmoidItem.hideOnWindowDeactivate 0172 visible: root.plasmoidItem && root.plasmoidItem.expanded && fullRepresentation 0173 visualParent: root.compactRepresentation 0174 backgroundHints: (Plasmoid.containmentDisplayHints & PlasmaCore.Types.ContainmentPrefersOpaqueBackground) ? PlasmaCore.Dialog.SolidBackground : PlasmaCore.Dialog.StandardBackground 0175 type: PlasmaCore.Dialog.AppletPopup 0176 appletInterface: fullRepresentation && fullRepresentation.appletInterface || null 0177 0178 property var oldStatus: PlasmaCore.Types.UnknownStatus 0179 0180 onVisibleChanged: { 0181 if (!visible) { 0182 expandedSync.restart(); 0183 Plasmoid.status = oldStatus; 0184 } else { 0185 oldStatus = Plasmoid.status; 0186 Plasmoid.status = PlasmaCore.Types.RequiresAttentionStatus; 0187 // This call currently fails and complains at runtime: 0188 // QWindow::setWindowState: QWindow::setWindowState does not accept Qt::WindowActive 0189 dialog.requestActivate(); 0190 } 0191 } 0192 //It's a MouseEventListener to get all the events, so the eventfilter will be able to catch them 0193 mainItem: MouseEventListener { 0194 id: appletParent 0195 0196 focus: true 0197 0198 Keys.onEscapePressed: { 0199 root.plasmoidItem.expanded = false; 0200 } 0201 0202 Layout.minimumWidth: fullRepresentation ? fullRepresentation.Layout.minimumWidth : 0 0203 Layout.minimumHeight: fullRepresentation ? fullRepresentation.Layout.minimumHeight : 0 0204 0205 Layout.preferredWidth: fullRepresentation ? fullRepresentation.Layout.preferredWidth : -1 0206 Layout.preferredHeight: fullRepresentation ? fullRepresentation.Layout.preferredHeight : -1 0207 0208 Layout.maximumWidth: fullRepresentation ? fullRepresentation.Layout.maximumWidth : Infinity 0209 Layout.maximumHeight: fullRepresentation ? fullRepresentation.Layout.maximumHeight : Infinity 0210 0211 width: { 0212 if (root.fullRepresentation !== null) { 0213 /****/ if (root.fullRepresentation.Layout.preferredWidth > 0) { 0214 return root.fullRepresentation.Layout.preferredWidth; 0215 } else if (root.fullRepresentation.implicitWidth > 0) { 0216 return root.fullRepresentation.implicitWidth; 0217 } 0218 } 0219 return Kirigami.Units.iconSizes.sizeForLabels * 35; 0220 } 0221 height: { 0222 if (root.fullRepresentation !== null) { 0223 /****/ if (fullRepresentation.Layout.preferredHeight > 0) { 0224 return fullRepresentation.Layout.preferredHeight; 0225 } else if (fullRepresentation.implicitHeight > 0) { 0226 return fullRepresentation.implicitHeight; 0227 } 0228 } 0229 return Kirigami.Units.iconSizes.sizeForLabels * 25; 0230 } 0231 0232 onActiveFocusChanged: { 0233 if (activeFocus && fullRepresentation) { 0234 fullRepresentation.forceActiveFocus() 0235 } 0236 } 0237 0238 // Draws a line between the applet dialog and the panel 0239 KSvg.SvgItem { 0240 // Only draw for popups of panel applets, not desktop applets 0241 visible: [PlasmaCore.Types.TopEdge, PlasmaCore.Types.LeftEdge, PlasmaCore.Types.RightEdge, PlasmaCore.Types.BottomEdge] 0242 .includes(Plasmoid.location) 0243 anchors { 0244 top: Plasmoid.location === PlasmaCore.Types.BottomEdge ? undefined : parent.top 0245 left: Plasmoid.location === PlasmaCore.Types.RightEdge ? undefined : parent.left 0246 right: Plasmoid.location === PlasmaCore.Types.LeftEdge ? undefined : parent.right 0247 bottom: Plasmoid.location === PlasmaCore.Types.TopEdge ? undefined : parent.bottom 0248 topMargin: Plasmoid.location === PlasmaCore.Types.BottomEdge ? undefined : -dialog.margins.top 0249 leftMargin: Plasmoid.location === PlasmaCore.Types.RightEdge ? undefined : -dialog.margins.left 0250 rightMargin: Plasmoid.location === PlasmaCore.Types.LeftEdge ? undefined : -dialog.margins.right 0251 bottomMargin: Plasmoid.location === PlasmaCore.Types.TopEdge ? undefined : -dialog.margins.bottom 0252 } 0253 height: (Plasmoid.location === PlasmaCore.Types.TopEdge || Plasmoid.location === PlasmaCore.Types.BottomEdge) ? 1 : undefined 0254 width: (Plasmoid.location === PlasmaCore.Types.LeftEdge || Plasmoid.location === PlasmaCore.Types.RightEdge) ? 1 : undefined 0255 z: 999 /* Draw the line on top of the applet */ 0256 elementId: (Plasmoid.location === PlasmaCore.Types.TopEdge || Plasmoid.location === PlasmaCore.Types.BottomEdge) ? "horizontal-line" : "vertical-line" 0257 imagePath: "widgets/line" 0258 } 0259 0260 LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft 0261 LayoutMirroring.childrenInherit: true 0262 } 0263 } 0264 }