/* SPDX-FileCopyrightText: 2013 Marco Martin SPDX-License-Identifier: GPL-2.0-or-later */ import QtQuick 2.0 import QtQuick.Layouts 1.1 import QtQuick.Window 2.0 import QtGraphicalEffects 1.0 import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as PlasmaComponents import org.kde.kquickcontrolsaddons 2.0 import org.kde.latte.core 0.2 as LatteCore PlasmaCore.ToolTipArea { id: root objectName: "org.kde.desktop-CompactApplet" anchors.fill: parent mainText: plasmoid.toolTipMainText subText: plasmoid.toolTipSubText location: plasmoid.location active: !plasmoid.expanded textFormat: plasmoid.toolTipTextFormat mainItem: plasmoid.toolTipItem ? plasmoid.toolTipItem : null property Item fullRepresentation: null property Item compactRepresentation: null /*Discover real visual parent - the following code points to Applet::ItemWrapper*/ property Item originalCompactRepresenationParent: null property Item compactRepresentationVisualParent: originalCompactRepresenationParent && originalCompactRepresenationParent.parent ? originalCompactRepresenationParent.parent.parent : null property Item appletItem: compactRepresentationVisualParent && compactRepresentationVisualParent.parent && compactRepresentationVisualParent.parent.parent ? compactRepresentationVisualParent.parent.parent.parent : null onCompactRepresentationChanged: { if (compactRepresentation) { originalCompactRepresenationParent = compactRepresentation.parent; compactRepresentation.parent = root; compactRepresentation.anchors.centerIn = root; compactRepresentation.width = Qt.binding(function() { return root.width; }); compactRepresentation.height = Qt.binding(function() { return root.height; }); compactRepresentation.visible = true; } root.visible = true; } onFullRepresentationChanged: { if (!fullRepresentation) { return; } //if the fullRepresentation size was restored to a stored size, or if is dragged from the desktop, restore popup size if (fullRepresentation.Layout && fullRepresentation.Layout.preferredWidth > 0) { popupWindow.mainItem.width = Qt.binding(function() { return fullRepresentation.Layout.preferredWidth }) } else if (fullRepresentation.implicitWidth > 0) { popupWindow.mainItem.width = Qt.binding(function() { return fullRepresentation.implicitWidth }) } else if (fullRepresentation.width > 0) { popupWindow.mainItem.width = Qt.binding(function() { return fullRepresentation.width }) } else { popupWindow.mainItem.width = Qt.binding(function() { return PlasmaCore.Theme.mSize(PlasmaCore.Theme.defaultFont).width * 35 }) } if (fullRepresentation.Layout && fullRepresentation.Layout.preferredHeight > 0) { popupWindow.mainItem.height = Qt.binding(function() { return fullRepresentation.Layout.preferredHeight }) } else if (fullRepresentation.implicitHeight > 0) { popupWindow.mainItem.height = Qt.binding(function() { return fullRepresentation.implicitHeight }) } else if (fullRepresentation.height > 0) { popupWindow.mainItem.height = Qt.binding(function() { return fullRepresentation.height }) } else { popupWindow.mainItem.height = Qt.binding(function() { return PlasmaCore.Theme.mSize(PlasmaCore.Theme.defaultFont).height * 25 }) } fullRepresentation.parent = appletParent; fullRepresentation.anchors.fill = fullRepresentation.parent; } /* PlasmaCore.FrameSvgItem { id: expandedItem anchors.fill: parent imagePath: "widgets/tabbar" visible: fromCurrentTheme && opacity > 0 prefix: { var prefix; switch (plasmoid.location) { case PlasmaCore.Types.LeftEdge: prefix = "west-active-tab"; break; case PlasmaCore.Types.TopEdge: prefix = "north-active-tab"; break; case PlasmaCore.Types.RightEdge: prefix = "east-active-tab"; break; default: prefix = "south-active-tab"; } if (!hasElementPrefix(prefix)) { prefix = "active-tab"; } return prefix; } opacity: plasmoid.expanded ? 1 : 0 Behavior on opacity { NumberAnimation { duration: PlasmaCore.Units.shortDuration easing.type: Easing.InOutQuad } } }*/ //! This timer is needed in order for the applet popup to not reshow instantly and faulty after the user //! clicks compact representation to hide it Timer { id: expandedSync interval: 500 onTriggered: plasmoid.expanded = popupWindow.visible; } Connections { target: plasmoid.action("configure") function onTriggered() { plasmoid.expanded = false } } Connections { target: plasmoid function onContextualActionsAboutToShow() { root.hideToolTip() } } LatteCore.Dialog { id: popupWindow objectName: "popupWindow" flags: Qt.WindowStaysOnTopHint visible: plasmoid.expanded && fullRepresentation visualParent: compactRepresentationVisualParent ? compactRepresentationVisualParent : (compactRepresentation ? compactRepresentation : null) // location: PlasmaCore.Types.Floating //plasmoid.location edge: plasmoid.location /*this way dialog borders are not updated and it is used only for adjusting dialog position*/ hideOnWindowDeactivate: plasmoid.hideOnWindowDeactivate backgroundHints: (plasmoid.containmentDisplayHints & PlasmaCore.Types.DesktopFullyCovered) ? PlasmaCore.Dialog.SolidBackground : PlasmaCore.Dialog.StandardBackground property var oldStatus: PlasmaCore.Types.UnknownStatus //It's a MouseEventListener to get all the events, so the eventfilter will be able to catch them mainItem: MouseEventListener { id: appletParent focus: true Keys.onEscapePressed: { plasmoid.expanded = false; } LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft LayoutMirroring.childrenInherit: true Layout.minimumWidth: (fullRepresentation && fullRepresentation.Layout) ? fullRepresentation.Layout.minimumWidth : 0 Layout.minimumHeight: (fullRepresentation && fullRepresentation.Layout) ? fullRepresentation.Layout.minimumHeight: 0 Layout.preferredWidth: (fullRepresentation && fullRepresentation.Layout) ? fullRepresentation.Layout.preferredWidth : -1 Layout.preferredHeight: (fullRepresentation && fullRepresentation.Layout) ? fullRepresentation.Layout.preferredHeight: -1 Layout.maximumWidth: (fullRepresentation && fullRepresentation.Layout) ? fullRepresentation.Layout.maximumWidth : Infinity Layout.maximumHeight: (fullRepresentation && fullRepresentation.Layout) ? fullRepresentation.Layout.maximumHeight: Infinity onActiveFocusChanged: { if (activeFocus && fullRepresentation) { fullRepresentation.forceActiveFocus() } } } onVisibleChanged: { if (!visible) { expandedSync.restart(); plasmoid.status = oldStatus; } else { oldStatus = plasmoid.status; plasmoid.status = PlasmaCore.Types.RequiresAttentionStatus; // This call currently fails and complains at runtime: // QWindow::setWindowState: QWindow::setWindowState does not accept Qt::WindowActive popupWindow.requestActivate(); } } } ////Indicators API //// Binding { target: compactRepresentation ? compactRepresentation.anchors : null property: "horizontalCenterOffset" when: compactRepresentation value: appletItem ? appletItem.iconOffsetX : 0 } Binding { target: compactRepresentation ? compactRepresentation.anchors : null property: "verticalCenterOffset" when: compactRepresentation value: appletItem ? appletItem.iconOffsetY : 0 } Binding { target: root property: "transformOrigin" value: appletItem && compactRepresentation ? appletItem.iconTransformOrigin : Item.Center } Binding { target: root property: "opacity" value: appletItem && compactRepresentation ? appletItem.iconOpacity : 1.0 } Binding { target: root property: "rotation" value: appletItem && compactRepresentation ? appletItem.iconRotation : 0 } Binding { target: root property: "scale" value: appletItem && compactRepresentation ? appletItem.iconScale : 1.0 } ////Clicked Effect //// BrightnessContrast { id: _clickedEffect anchors.centerIn: parent anchors.horizontalCenterOffset: compactRepresentation ? compactRepresentation.anchors.horizontalCenterOffset : 0 anchors.verticalCenterOffset: compactRepresentation ? compactRepresentation.anchors.verticalCenterOffset : 0 source: compactRepresentation width: root.width height: root.height visible: appletItem && clickedAnimation.running && !appletItem.indicators.info.providesClickedAnimation z:1000 } /////Clicked Animation///// SequentialAnimation{ id: clickedAnimation alwaysRunToEnd: true running: appletItem && appletItem.animations && appletItem.indicators && appletItem.isSquare && appletItem.pressed && !appletItem.originalAppletBehavior && (appletItem.animations.speedFactor.current > 0) && !appletItem.indicators.info.providesClickedAnimation ParallelAnimation{ PropertyAnimation { target: _clickedEffect property: "brightness" to: -0.35 duration: appletItem && appletItem.animations ? appletItem.animations.duration.large : 0 easing.type: Easing.OutQuad } } ParallelAnimation{ PropertyAnimation { target: _clickedEffect property: "brightness" to: 0 duration: appletItem && appletItem.animations ? appletItem.animations.duration.large : 0 easing.type: Easing.OutQuad } } } //END animations }