You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
latte-dock/shell/package/contents/applet/CompactApplet.qml

300 lines
11 KiB
QML

/*
SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
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
}