summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/dms/Modules/WorkspaceOverlays/OverviewWindow.qml
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-hyprland-theme/theme-data/dms/Modules/WorkspaceOverlays/OverviewWindow.qml')
-rw-r--r--raveos-hyprland-theme/theme-data/dms/Modules/WorkspaceOverlays/OverviewWindow.qml142
1 files changed, 142 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/dms/Modules/WorkspaceOverlays/OverviewWindow.qml b/raveos-hyprland-theme/theme-data/dms/Modules/WorkspaceOverlays/OverviewWindow.qml
new file mode 100644
index 0000000..4389971
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/dms/Modules/WorkspaceOverlays/OverviewWindow.qml
@@ -0,0 +1,142 @@
+import QtQuick
+import QtQuick.Effects
+import QtQuick.Layouts
+import Quickshell
+import Quickshell.Wayland
+import qs.Common
+
+Item {
+ id: root
+ property var toplevel
+ property var scale
+ required property bool overviewOpen
+ property var availableWorkspaceWidth
+ property var availableWorkspaceHeight
+ property bool restrictToWorkspace: true
+ property real monitorDpr: 1
+
+ readonly property var windowData: toplevel?.lastIpcObject || null
+ readonly property var monitorObj: toplevel?.monitor
+ readonly property var monitorData: monitorObj?.lastIpcObject || null
+ readonly property real effectiveScale: root.scale / root.monitorDpr
+
+ property real initX: Math.max(((windowData?.at?.[0] ?? 0) - (monitorData?.x ?? 0) - (monitorData?.reserved?.[0] ?? 0)) * effectiveScale, 0) + xOffset
+ property real initY: Math.max(((windowData?.at?.[1] ?? 0) - (monitorData?.y ?? 0) - (monitorData?.reserved?.[1] ?? 0)) * effectiveScale, 0) + yOffset
+ property real xOffset: 0
+ property real yOffset: 0
+ property int widgetMonitorId: 0
+
+ property var targetWindowWidth: (windowData?.size?.[0] ?? 100) * effectiveScale
+ property var targetWindowHeight: (windowData?.size?.[1] ?? 100) * effectiveScale
+ property bool hovered: false
+ property bool pressed: false
+
+ property var iconToWindowRatio: 0.25
+ property var iconToWindowRatioCompact: 0.45
+ property var entry: DesktopEntries.heuristicLookup(Paths.moddedAppId(windowData?.class ?? ""))
+ property var iconPath: Paths.getAppIcon(windowData?.class ?? "", entry) || Quickshell.iconPath("application-x-executable", "image-missing")
+ property bool compactMode: Theme.fontSizeSmall * 4 > targetWindowHeight || Theme.fontSizeSmall * 4 > targetWindowWidth
+
+ x: initX
+ y: initY
+ width: Math.min((windowData?.size?.[0] ?? 100) * effectiveScale, availableWorkspaceWidth)
+ height: Math.min((windowData?.size?.[1] ?? 100) * effectiveScale, availableWorkspaceHeight)
+ opacity: (monitorObj?.id ?? -1) == widgetMonitorId ? 1 : 0.4
+
+ Rectangle {
+ id: maskRect
+ width: root.width
+ height: root.height
+ radius: Theme.cornerRadius
+ visible: false
+ layer.enabled: true
+ }
+
+ layer.enabled: true
+ layer.effect: MultiEffect {
+ maskEnabled: true
+ maskSource: maskRect
+ maskSpreadAtMin: 1
+ maskThresholdMin: 0.5
+ }
+
+ Behavior on x {
+ NumberAnimation {
+ duration: Theme.expressiveDurations.expressiveDefaultSpatial
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: Theme.expressiveCurves.emphasizedDecel
+ }
+ }
+ Behavior on y {
+ NumberAnimation {
+ duration: Theme.expressiveDurations.expressiveDefaultSpatial
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: Theme.expressiveCurves.emphasizedDecel
+ }
+ }
+ Behavior on width {
+ NumberAnimation {
+ duration: Theme.expressiveDurations.expressiveDefaultSpatial
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: Theme.expressiveCurves.emphasizedDecel
+ }
+ }
+ Behavior on height {
+ NumberAnimation {
+ duration: Theme.expressiveDurations.expressiveDefaultSpatial
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: Theme.expressiveCurves.emphasizedDecel
+ }
+ }
+
+ ScreencopyView {
+ id: windowPreview
+ anchors.fill: parent
+ captureSource: root.overviewOpen ? root.toplevel?.wayland : null
+ live: true
+
+ Rectangle {
+ anchors.fill: parent
+ radius: Theme.cornerRadius
+ color: pressed ? Theme.withAlpha(Theme.surfaceContainerHigh, 0.5) :
+ hovered ? Theme.withAlpha(Theme.surfaceVariant, 0.3) :
+ Theme.withAlpha(Theme.surfaceContainer, 0.1)
+ border.color: Theme.withAlpha(Theme.outline, 0.3)
+ border.width: 1
+ }
+
+ ColumnLayout {
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.left: parent.left
+ anchors.right: parent.right
+ spacing: Theme.fontSizeSmall * 0.5
+
+ Image {
+ id: windowIcon
+ property var iconSize: {
+ return Math.min(targetWindowWidth, targetWindowHeight) * (root.compactMode ? root.iconToWindowRatioCompact : root.iconToWindowRatio) / (root.monitorData?.scale ?? 1)
+ }
+ Layout.alignment: Qt.AlignHCenter
+ source: root.iconPath
+ width: iconSize
+ height: iconSize
+ sourceSize: Qt.size(iconSize, iconSize)
+
+ Behavior on width {
+ NumberAnimation {
+ duration: Theme.expressiveDurations.expressiveDefaultSpatial
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: Theme.expressiveCurves.emphasizedDecel
+ }
+ }
+ Behavior on height {
+ NumberAnimation {
+ duration: Theme.expressiveDurations.expressiveDefaultSpatial
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: Theme.expressiveCurves.emphasizedDecel
+ }
+ }
+ }
+ }
+ }
+}