From e7e08cda591a3a3f74fa6bf5e8314282965abbbf Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 17 May 2025 23:19:41 +0200 Subject: [PATCH] right sidebar: dont create multiple for each monitor --- .../modules/sidebarRight/SidebarRight.qml | 393 ++++++++---------- 1 file changed, 184 insertions(+), 209 deletions(-) diff --git a/.config/quickshell/modules/sidebarRight/SidebarRight.qml b/.config/quickshell/modules/sidebarRight/SidebarRight.qml index e9ef5ffd..713a80ce 100644 --- a/.config/quickshell/modules/sidebarRight/SidebarRight.qml +++ b/.config/quickshell/modules/sidebarRight/SidebarRight.qml @@ -17,217 +17,201 @@ Scope { property int sidebarWidth: Appearance.sizes.sidebarWidth property int sidebarPadding: 15 - Variants { - id: sidebarVariants - model: Quickshell.screens - - Loader { - id: sidebarLoader - active: false - property var modelData - onActiveChanged: { - GlobalStates.sidebarRightOpenCount += active ? 1 : -1 - } - - PanelWindow { - id: sidebarRoot - visible: sidebarLoader.active - focusable: true - - onVisibleChanged: { - if (!visible) sidebarLoader.active = false - } - - function hide() { - sidebarLoader.active = false - } - - screen: modelData - exclusiveZone: 0 - implicitWidth: sidebarWidth - WlrLayershell.namespace: "quickshell:sidebarRight" - // Hyprland 0.49: Focus is always exclusive and setting this breaks mouse focus grab - // WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive - color: "transparent" - - anchors { - top: true - right: true - bottom: true - } - - HyprlandFocusGrab { - id: grab - windows: [ sidebarRoot ] - active: false - onCleared: () => { - if (!active) sidebarRoot.hide() - } - } - - Connections { - target: sidebarRoot - function onVisibleChanged() { - delayedGrabTimer.start() - } - } - - Timer { - id: delayedGrabTimer - interval: ConfigOptions.hacks.arbitraryRaceConditionDelay - repeat: false - onTriggered: { - grab.active = sidebarRoot.visible - } - } - - // Background - Rectangle { - id: sidebarRightBackground - - anchors.centerIn: parent - width: parent.width - Appearance.sizes.hyprlandGapsOut * 2 - height: parent.height - Appearance.sizes.hyprlandGapsOut * 2 - color: Appearance.colors.colLayer0 - radius: Appearance.rounding.screenRounding - Appearance.sizes.elevationMargin + 1 - - Keys.onPressed: (event) => { - if (event.key === Qt.Key_Escape) { - sidebarRoot.hide(); - } - } - - ColumnLayout { - anchors.fill: parent - anchors.margins: sidebarPadding - - spacing: sidebarPadding - - RowLayout { - Layout.fillHeight: false - spacing: 10 - Layout.margins: 10 - Layout.topMargin: 5 - Layout.bottomMargin: 0 - - Item { - implicitWidth: distroIcon.width - implicitHeight: distroIcon.height - CustomIcon { - id: distroIcon - width: 25 - height: 25 - source: SystemInfo.distroIcon - } - ColorOverlay { - anchors.fill: distroIcon - source: distroIcon - color: Appearance.colors.colOnLayer0 - } - } - - StyledText { - font.pixelSize: Appearance.font.pixelSize.normal - color: Appearance.colors.colOnLayer0 - text: `Uptime: ${DateTime.uptime}` - textFormat: Text.MarkdownText - } - - Item { - Layout.fillWidth: true - } - - QuickToggleButton { - toggled: false - buttonIcon: "power_settings_new" - onClicked: { - Hyprland.dispatch("global quickshell:sessionOpen") - } - StyledToolTip { - content: qsTr("Session") - } - } - } - - Rectangle { - Layout.alignment: Qt.AlignHCenter - Layout.fillHeight: false - radius: Appearance.rounding.full - color: Appearance.colors.colLayer1 - implicitWidth: sidebarQuickControlsRow.implicitWidth + 10 - implicitHeight: sidebarQuickControlsRow.implicitHeight + 10 - - - RowLayout { - id: sidebarQuickControlsRow - anchors.fill: parent - anchors.margins: 5 - spacing: 5 - - NetworkToggle {} - BluetoothToggle {} - NightLight {} - GameMode {} - IdleInhibitor {} - - } - } - - // Center widget group - CenterWidgetGroup { - focus: sidebarRoot.visible - Layout.alignment: Qt.AlignHCenter - Layout.fillHeight: true - Layout.fillWidth: true - } - - BottomWidgetGroup { - Layout.alignment: Qt.AlignHCenter - Layout.fillHeight: false - Layout.fillWidth: true - Layout.preferredHeight: implicitHeight - } - } - } - - // Shadow - DropShadow { - anchors.fill: sidebarRightBackground - horizontalOffset: 0 - verticalOffset: 2 - radius: Appearance.sizes.elevationMargin - samples: Appearance.sizes.elevationMargin * 2 + 1 // Ideally should be 2 * radius + 1, see qt docs - color: Appearance.colors.colShadow - source: sidebarRightBackground - } - - } + Loader { + id: sidebarLoader + active: false + property var modelData + onActiveChanged: { + GlobalStates.sidebarRightOpenCount += active ? 1 : -1 } + PanelWindow { + id: sidebarRoot + visible: sidebarLoader.active + focusable: true + + onVisibleChanged: { + if (!visible) sidebarLoader.active = false + } + + function hide() { + sidebarLoader.active = false + } + + exclusiveZone: 0 + implicitWidth: sidebarWidth + WlrLayershell.namespace: "quickshell:sidebarRight" + // Hyprland 0.49: Focus is always exclusive and setting this breaks mouse focus grab + // WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive + color: "transparent" + + anchors { + top: true + right: true + bottom: true + } + + HyprlandFocusGrab { + id: grab + windows: [ sidebarRoot ] + active: false + onCleared: () => { + if (!active) sidebarRoot.hide() + } + } + + Connections { + target: sidebarRoot + function onVisibleChanged() { + delayedGrabTimer.start() + } + } + + Timer { + id: delayedGrabTimer + interval: ConfigOptions.hacks.arbitraryRaceConditionDelay + repeat: false + onTriggered: { + grab.active = sidebarRoot.visible + } + } + + // Background + Rectangle { + id: sidebarRightBackground + + anchors.centerIn: parent + width: parent.width - Appearance.sizes.hyprlandGapsOut * 2 + height: parent.height - Appearance.sizes.hyprlandGapsOut * 2 + color: Appearance.colors.colLayer0 + radius: Appearance.rounding.screenRounding - Appearance.sizes.elevationMargin + 1 + + Keys.onPressed: (event) => { + if (event.key === Qt.Key_Escape) { + sidebarRoot.hide(); + } + } + + ColumnLayout { + anchors.fill: parent + anchors.margins: sidebarPadding + + spacing: sidebarPadding + + RowLayout { + Layout.fillHeight: false + spacing: 10 + Layout.margins: 10 + Layout.topMargin: 5 + Layout.bottomMargin: 0 + + Item { + implicitWidth: distroIcon.width + implicitHeight: distroIcon.height + CustomIcon { + id: distroIcon + width: 25 + height: 25 + source: SystemInfo.distroIcon + } + ColorOverlay { + anchors.fill: distroIcon + source: distroIcon + color: Appearance.colors.colOnLayer0 + } + } + + StyledText { + font.pixelSize: Appearance.font.pixelSize.normal + color: Appearance.colors.colOnLayer0 + text: `Uptime: ${DateTime.uptime}` + textFormat: Text.MarkdownText + } + + Item { + Layout.fillWidth: true + } + + QuickToggleButton { + toggled: false + buttonIcon: "power_settings_new" + onClicked: { + Hyprland.dispatch("global quickshell:sessionOpen") + } + StyledToolTip { + content: qsTr("Session") + } + } + } + + Rectangle { + Layout.alignment: Qt.AlignHCenter + Layout.fillHeight: false + radius: Appearance.rounding.full + color: Appearance.colors.colLayer1 + implicitWidth: sidebarQuickControlsRow.implicitWidth + 10 + implicitHeight: sidebarQuickControlsRow.implicitHeight + 10 + + + RowLayout { + id: sidebarQuickControlsRow + anchors.fill: parent + anchors.margins: 5 + spacing: 5 + + NetworkToggle {} + BluetoothToggle {} + NightLight {} + GameMode {} + IdleInhibitor {} + + } + } + + // Center widget group + CenterWidgetGroup { + focus: sidebarRoot.visible + Layout.alignment: Qt.AlignHCenter + Layout.fillHeight: true + Layout.fillWidth: true + } + + BottomWidgetGroup { + Layout.alignment: Qt.AlignHCenter + Layout.fillHeight: false + Layout.fillWidth: true + Layout.preferredHeight: implicitHeight + } + } + } + + // Shadow + DropShadow { + anchors.fill: sidebarRightBackground + horizontalOffset: 0 + verticalOffset: 2 + radius: Appearance.sizes.elevationMargin + samples: Appearance.sizes.elevationMargin * 2 + 1 // Ideally should be 2 * radius + 1, see qt docs + color: Appearance.colors.colShadow + source: sidebarRightBackground + } + + } } IpcHandler { target: "sidebarRight" function toggle(): void { - for (let i = 0; i < sidebarVariants.instances.length; i++) { - let loader = sidebarVariants.instances[i]; - loader.active = !loader.active; - } + sidebarLoader.active = !sidebarLoader.active; } function close(): void { - for (let i = 0; i < sidebarVariants.instances.length; i++) { - let loader = sidebarVariants.instances[i]; - loader.active = false; - } + sidebarLoader.active = false; } function open(): void { - for (let i = 0; i < sidebarVariants.instances.length; i++) { - let loader = sidebarVariants.instances[i]; - loader.active = true; - } + sidebarLoader.active = true; } } @@ -236,10 +220,7 @@ Scope { description: "Toggles right sidebar on press" onPressed: { - for (let i = 0; i < sidebarVariants.instances.length; i++) { - let loader = sidebarVariants.instances[i]; - loader.active = !loader.active; - } + sidebarLoader.active = !sidebarLoader.active; } } GlobalShortcut { @@ -247,10 +228,7 @@ Scope { description: "Opens right sidebar on press" onPressed: { - for (let i = 0; i < sidebarVariants.instances.length; i++) { - let loader = sidebarVariants.instances[i]; - loader.active = true; - } + sidebarLoader.active = true; } } GlobalShortcut { @@ -258,10 +236,7 @@ Scope { description: "Closes right sidebar on press" onPressed: { - for (let i = 0; i < sidebarVariants.instances.length; i++) { - let loader = sidebarVariants.instances[i]; - loader.active = false; - } + sidebarLoader.active = false; } }