diff --git a/.config/quickshell/modules/sidebarRight/SidebarRight.qml b/.config/quickshell/modules/sidebarRight/SidebarRight.qml index 11aae1d9..e9ef5ffd 100644 --- a/.config/quickshell/modules/sidebarRight/SidebarRight.qml +++ b/.config/quickshell/modules/sidebarRight/SidebarRight.qml @@ -21,176 +21,187 @@ Scope { id: sidebarVariants model: Quickshell.screens - PanelWindow { - id: sidebarRoot - visible: false - focusable: true - - onVisibleChanged: { - GlobalStates.sidebarRightOpenCount += visible ? 1 : -1 - } - + Loader { + id: sidebarLoader + active: false property var modelData - - 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 + onActiveChanged: { + GlobalStates.sidebarRightOpenCount += active ? 1 : -1 } - HyprlandFocusGrab { - id: grab - windows: [ sidebarRoot ] - active: false - onCleared: () => { - if (!active) sidebarRoot.visible = false + PanelWindow { + id: sidebarRoot + visible: sidebarLoader.active + focusable: true + + onVisibleChanged: { + if (!visible) sidebarLoader.active = false } - } - Connections { - target: sidebarRoot - function onVisibleChanged() { - delayedGrabTimer.start() + function hide() { + sidebarLoader.active = false } - } - Timer { - id: delayedGrabTimer - interval: ConfigOptions.hacks.arbitraryRaceConditionDelay - repeat: false - onTriggered: { - grab.active = sidebarRoot.visible + 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 } - } - // 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.visible = false; + HyprlandFocusGrab { + id: grab + windows: [ sidebarRoot ] + active: false + onCleared: () => { + if (!active) sidebarRoot.hide() } } - ColumnLayout { - anchors.fill: parent - anchors.margins: sidebarPadding - - spacing: sidebarPadding + Connections { + target: sidebarRoot + function onVisibleChanged() { + delayedGrabTimer.start() + } + } - RowLayout { - Layout.fillHeight: false - spacing: 10 - Layout.margins: 10 - Layout.topMargin: 5 - Layout.bottomMargin: 0 + Timer { + id: delayedGrabTimer + interval: ConfigOptions.hacks.arbitraryRaceConditionDelay + repeat: false + onTriggered: { + grab.active = sidebarRoot.visible + } + } - Item { - implicitWidth: distroIcon.width - implicitHeight: distroIcon.height - CustomIcon { - id: distroIcon - width: 25 - height: 25 - source: SystemInfo.distroIcon + // 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 + } } - ColorOverlay { - anchors.fill: distroIcon - source: distroIcon + + 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") + } } } - StyledText { - font.pixelSize: Appearance.font.pixelSize.normal - color: Appearance.colors.colOnLayer0 - text: `Uptime: ${DateTime.uptime}` - textFormat: Text.MarkdownText + 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 {} + + } } - Item { + // Center widget group + CenterWidgetGroup { + focus: sidebarRoot.visible + Layout.alignment: Qt.AlignHCenter + Layout.fillHeight: true Layout.fillWidth: true } - QuickToggleButton { - toggled: false - buttonIcon: "power_settings_new" - onClicked: { - Hyprland.dispatch("global quickshell:sessionOpen") - } - StyledToolTip { - content: qsTr("Session") - } + BottomWidgetGroup { + Layout.alignment: Qt.AlignHCenter + Layout.fillHeight: false + Layout.fillWidth: true + Layout.preferredHeight: implicitHeight } } - - 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 - } + // 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 + } + } } } @@ -200,30 +211,22 @@ Scope { function toggle(): void { for (let i = 0; i < sidebarVariants.instances.length; i++) { - let panelWindow = sidebarVariants.instances[i]; - if (panelWindow.modelData.name == Hyprland.focusedMonitor.name) { - panelWindow.visible = !panelWindow.visible; - if(panelWindow.visible) Notifications.timeoutAll(); - } + let loader = sidebarVariants.instances[i]; + loader.active = !loader.active; } } function close(): void { for (let i = 0; i < sidebarVariants.instances.length; i++) { - let panelWindow = sidebarVariants.instances[i]; - if (panelWindow.modelData.name == Hyprland.focusedMonitor.name) { - panelWindow.visible = false; - } + let loader = sidebarVariants.instances[i]; + loader.active = false; } } function open(): void { for (let i = 0; i < sidebarVariants.instances.length; i++) { - let panelWindow = sidebarVariants.instances[i]; - if (panelWindow.modelData.name == Hyprland.focusedMonitor.name) { - panelWindow.visible = true; - if(panelWindow.visible) Notifications.timeoutAll(); - } + let loader = sidebarVariants.instances[i]; + loader.active = true; } } } @@ -234,11 +237,8 @@ Scope { onPressed: { for (let i = 0; i < sidebarVariants.instances.length; i++) { - let panelWindow = sidebarVariants.instances[i]; - if (panelWindow.modelData.name == Hyprland.focusedMonitor.name) { - panelWindow.visible = !panelWindow.visible; - if(panelWindow.visible) Notifications.timeoutAll(); - } + let loader = sidebarVariants.instances[i]; + loader.active = !loader.active; } } } @@ -248,11 +248,8 @@ Scope { onPressed: { for (let i = 0; i < sidebarVariants.instances.length; i++) { - let panelWindow = sidebarVariants.instances[i]; - if (panelWindow.modelData.name == Hyprland.focusedMonitor.name) { - panelWindow.visible = true; - if(panelWindow.visible) Notifications.timeoutAll(); - } + let loader = sidebarVariants.instances[i]; + loader.active = true; } } } @@ -262,11 +259,8 @@ Scope { onPressed: { for (let i = 0; i < sidebarVariants.instances.length; i++) { - let panelWindow = sidebarVariants.instances[i]; - if (panelWindow.modelData.name == Hyprland.focusedMonitor.name) { - panelWindow.visible = false; - if(panelWindow.visible) Notifications.timeoutAll(); - } + let loader = sidebarVariants.instances[i]; + loader.active = false; } } }