111 lines
No EOL
4.9 KiB
QML
111 lines
No EOL
4.9 KiB
QML
import "root:/services/"
|
|
import "root:/modules/common"
|
|
import "root:/modules/common/widgets"
|
|
import "root:/modules/common/functions/color_utils.js" as ColorUtils
|
|
import Qt5Compat.GraphicalEffects
|
|
import QtQuick
|
|
import QtQuick.Layouts
|
|
import Quickshell
|
|
import Quickshell.Widgets
|
|
import Quickshell.Io
|
|
import Quickshell.Hyprland
|
|
|
|
Rectangle { // Window
|
|
id: root
|
|
property var windowData
|
|
property var monitorData
|
|
property var scale
|
|
property var availableWorkspaceWidth
|
|
property var availableWorkspaceHeight
|
|
property bool restrictToWorkspace: true``
|
|
property var sourceMonitor: HyprlandData.monitors.find(m => m.id === windowData?.monitor) || HyprlandData.monitors[0] || { scale: 1.0, x: 0, y: 0, reserved: [0,0,0,0] }
|
|
property real monitorScaleFactor: sourceMonitor?.scale || 1.0
|
|
property real targetScaleFactor: monitorData?.scale || monitorScaleFactor || 1.0
|
|
property var focusedMonitor: Hyprland.focusedMonitor
|
|
property real focusedMonitorScale: focusedMonitor?.scale || 1.0
|
|
property real effectiveScale: root.scale * (
|
|
ConfigOptions.overview.showAllMonitors
|
|
? (focusedMonitorScale / monitorScaleFactor) // Scale relative to focused monitor when showing all
|
|
: (targetScaleFactor / monitorScaleFactor) // Scale relative to target monitor normally
|
|
)
|
|
|
|
// Calculate position relative to source monitor
|
|
property real relativeX: (windowData?.at[0] - sourceMonitor?.x - sourceMonitor?.reserved[0]) || 0
|
|
property real relativeY: (windowData?.at[1] - sourceMonitor?.y - sourceMonitor?.reserved[1]) || 0
|
|
|
|
// Scale position based on monitor differences
|
|
property real initX: Math.max(relativeX * effectiveScale, 0) + xOffset
|
|
property real initY: Math.max(relativeY * effectiveScale, 0) + yOffset
|
|
property real xOffset: 0
|
|
property real yOffset: 0
|
|
|
|
// Scale window size based on monitor differences
|
|
property var targetWindowWidth: (windowData?.size[0] || 0) * effectiveScale
|
|
property var targetWindowHeight: (windowData?.size[1] || 0) * effectiveScale
|
|
property bool hovered: false
|
|
property bool pressed: false
|
|
|
|
property var iconToWindowRatio: 0.35
|
|
property var xwaylandIndicatorToIconRatio: 0.35
|
|
property var iconToWindowRatioCompact: 0.6
|
|
property var iconPath: Quickshell.iconPath(AppSearch.guessIcon(windowData?.class), "image-missing")
|
|
property bool compactMode: Appearance.font.pixelSize.textSmall * 4 > targetWindowHeight || Appearance.font.pixelSize.textSmall * 4 > targetWindowWidth
|
|
|
|
property bool indicateXWayland: (ConfigOptions.overview.showXwaylandIndicator && windowData?.xwayland) ?? false
|
|
|
|
x: initX
|
|
y: initY
|
|
width: Math.min(windowData?.size[0] * root.scale, (restrictToWorkspace ? windowData?.size[0] : availableWorkspaceWidth - x + xOffset))
|
|
height: Math.min(windowData?.size[1] * root.scale, (restrictToWorkspace ? windowData?.size[1] : availableWorkspaceHeight - y + yOffset))
|
|
|
|
radius: Appearance.rounding.windowRounding * root.scale
|
|
color: pressed ? Appearance.colors.colLayer2Active : hovered ? Appearance.colors.colLayer2Hover : Appearance.colors.colLayer2
|
|
// border.color : ColorUtils.transparentize(Appearance.m3colors.m3outline, 0.9)
|
|
border.color : ColorUtils.transparentize(Appearance.m3colors.m3borderPrimary, 0.4)
|
|
border.pixelAligned : false
|
|
border.width : 2
|
|
|
|
Behavior on x {
|
|
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
|
}
|
|
Behavior on y {
|
|
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
|
}
|
|
Behavior on width {
|
|
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
|
}
|
|
Behavior on height {
|
|
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
|
}
|
|
|
|
ColumnLayout {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
spacing: Appearance.font.pixelSize.textSmall * 0.5
|
|
|
|
IconImage {
|
|
id: windowIcon
|
|
Layout.alignment: Qt.AlignHCenter
|
|
source: root.iconPath
|
|
implicitSize: Math.min(targetWindowWidth, targetWindowHeight) * (root.compactMode ? root.iconToWindowRatioCompact : root.iconToWindowRatio)
|
|
|
|
Behavior on implicitSize {
|
|
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
|
}
|
|
}
|
|
|
|
StyledText {
|
|
Layout.leftMargin: 10
|
|
Layout.rightMargin: 10
|
|
visible: !compactMode
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
horizontalAlignment: Text.AlignHCenter
|
|
font.pixelSize: Appearance.font.pixelSize.textSmall
|
|
font.italic: indicateXWayland ? true : false
|
|
elide: Text.ElideRight
|
|
text: windowData?.title ?? ""
|
|
}
|
|
}
|
|
} |