import qs import qs.services import qs.modules.common import qs.modules.common.widgets import QtQuick import QtQuick.Controls import QtQuick.Layouts import Quickshell import Quickshell.Bluetooth import Quickshell.Hyprland import qs.modules.sidebarRight.quickToggles import qs.modules.sidebarRight.quickToggles.classicStyle import qs.modules.sidebarRight.bluetoothDevices import qs.modules.sidebarRight.nightLight import qs.modules.sidebarRight.volumeMixer import qs.modules.sidebarRight.wifiNetworks Item { id: root property int sidebarWidth: Appearance.sizes.sidebarWidth property int sidebarPadding: 10 property string settingsQmlPath: Quickshell.shellPath("settings.qml") property bool showAudioOutputDialog: false property bool showAudioInputDialog: false property bool showBluetoothDialog: false property bool showNightLightDialog: false property bool showWifiDialog: false property bool editMode: false Connections { target: GlobalStates function onSidebarRightOpenChanged() { if (!GlobalStates.sidebarRightOpen) { root.showWifiDialog = false; root.showBluetoothDialog = false; root.showAudioOutputDialog = false; root.showAudioInputDialog = false; } } } implicitHeight: sidebarRightBackground.implicitHeight implicitWidth: sidebarRightBackground.implicitWidth StyledRectangularShadow { target: sidebarRightBackground } Rectangle { id: sidebarRightBackground anchors.fill: parent implicitHeight: parent.height - Appearance.sizes.hyprlandGapsOut * 2 implicitWidth: sidebarWidth - Appearance.sizes.hyprlandGapsOut * 2 color: Appearance.colors.colLayer0 border.width: 1 border.color: Appearance.colors.colLayer0Border radius: Appearance.rounding.screenRounding - Appearance.sizes.hyprlandGapsOut + 1 ColumnLayout { anchors.fill: parent anchors.margins: sidebarPadding spacing: sidebarPadding SystemButtonRow { Layout.fillHeight: false Layout.fillWidth: true // Layout.margins: 10 Layout.topMargin: 5 Layout.bottomMargin: 0 } Loader { id: slidersLoader Layout.fillWidth: true visible: active active: { const configQuickSliders = Config.options.sidebar.quickSliders if (!configQuickSliders.enable) return false if (!configQuickSliders.showMic && !configQuickSliders.showVolume && !configQuickSliders.showBrightness) return false; return true; } sourceComponent: QuickSliders {} } LoaderedQuickPanelImplementation { styleName: "classic" sourceComponent: ClassicQuickPanel {} } LoaderedQuickPanelImplementation { styleName: "android" sourceComponent: AndroidQuickPanel { editMode: root.editMode } } CenterWidgetGroup { Layout.alignment: Qt.AlignHCenter Layout.fillHeight: true Layout.fillWidth: true } BottomWidgetGroup { Layout.alignment: Qt.AlignHCenter Layout.fillHeight: false Layout.fillWidth: true Layout.preferredHeight: implicitHeight } } } ToggleDialog { shownPropertyString: "showAudioOutputDialog" dialog: VolumeDialog { isSink: true } } ToggleDialog { shownPropertyString: "showAudioInputDialog" dialog: VolumeDialog { isSink: false } } ToggleDialog { shownPropertyString: "showBluetoothDialog" dialog: BluetoothDialog {} onShownChanged: { if (!shown) { Bluetooth.defaultAdapter.discovering = false; } else { Bluetooth.defaultAdapter.enabled = true; Bluetooth.defaultAdapter.discovering = true; } } } ToggleDialog { shownPropertyString: "showNightLightDialog" dialog: NightLightDialog {} } ToggleDialog { shownPropertyString: "showWifiDialog" dialog: WifiDialog {} onShownChanged: { if (!shown) return; Network.enableWifi(); Network.rescanWifi(); } } component ToggleDialog: Loader { id: toggleDialogLoader required property string shownPropertyString property alias dialog: toggleDialogLoader.sourceComponent readonly property bool shown: root[shownPropertyString] anchors.fill: parent onShownChanged: if (shown) toggleDialogLoader.active = true; active: shown onActiveChanged: { if (active) { item.show = true; item.forceActiveFocus(); } } Connections { target: toggleDialogLoader.item function onDismiss() { toggleDialogLoader.item.show = false root[toggleDialogLoader.shownPropertyString] = false; } function onVisibleChanged() { if (!toggleDialogLoader.item.visible && !root[toggleDialogLoader.shownPropertyString]) toggleDialogLoader.active = false; } } } component LoaderedQuickPanelImplementation: Loader { id: quickPanelImplLoader required property string styleName Layout.alignment: item?.Layout.alignment ?? Qt.AlignHCenter Layout.fillWidth: item?.Layout.fillWidth ?? false visible: active active: Config.options.sidebar.quickToggles.style === styleName Connections { target: quickPanelImplLoader.item function onOpenAudioOutputDialog() { root.showAudioOutputDialog = true; } function onOpenAudioInputDialog() { root.showAudioInputDialog = true; } function onOpenBluetoothDialog() { root.showBluetoothDialog = true; } function onOpenNightLightDialog() { root.showNightLightDialog = true; } function onOpenWifiDialog() { root.showWifiDialog = true; } } } component SystemButtonRow: Item { implicitHeight: Math.max(uptimeContainer.implicitHeight, systemButtonsRow.implicitHeight) Rectangle { id: uptimeContainer anchors { top: parent.top bottom: parent.bottom left: parent.left } color: Appearance.colors.colLayer1 radius: height / 2 implicitWidth: uptimeRow.implicitWidth + 24 implicitHeight: uptimeRow.implicitHeight + 8 Row { id: uptimeRow anchors.centerIn: parent spacing: 8 CustomIcon { id: distroIcon anchors.verticalCenter: parent.verticalCenter width: 25 height: 25 source: SystemInfo.distroIcon colorize: true color: Appearance.colors.colOnLayer0 } StyledText { anchors.verticalCenter: parent.verticalCenter font.pixelSize: Appearance.font.pixelSize.normal color: Appearance.colors.colOnLayer0 text: Translation.tr("Up %1").arg(DateTime.uptime) textFormat: Text.MarkdownText } } } ButtonGroup { id: systemButtonsRow anchors { top: parent.top bottom: parent.bottom right: parent.right } color: Appearance.colors.colLayer1 padding: 4 QuickToggleButton { toggled: root.editMode visible: Config.options.sidebar.quickToggles.style === "android" buttonIcon: "edit" onClicked: root.editMode = !root.editMode StyledToolTip { text: Translation.tr("Edit quick toggles") + (root.editMode ? Translation.tr("\nLMB to enable/disable\nRMB to toggle size\nScroll to swap position") : "") } } QuickToggleButton { toggled: false buttonIcon: "restart_alt" onClicked: { Hyprland.dispatch("reload"); Quickshell.reload(true); } StyledToolTip { text: Translation.tr("Reload Hyprland & Quickshell") } } QuickToggleButton { toggled: false buttonIcon: "settings" onClicked: { GlobalStates.sidebarRightOpen = false; Quickshell.execDetached(["qs", "-p", root.settingsQmlPath]); } StyledToolTip { text: Translation.tr("Settings") } } QuickToggleButton { toggled: false buttonIcon: "power_settings_new" onClicked: { GlobalStates.sessionOpen = true; } StyledToolTip { text: Translation.tr("Session") } } } } }