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 "./quickToggles/" import "./quickToggles/classicStyle/" import "./wifiNetworks/" import "./bluetoothDevices/" import "./volumeMixer/" Item { id: root property int sidebarWidth: Appearance.sizes.sidebarWidth property int sidebarPadding: 10 property string settingsQmlPath: Quickshell.shellPath("settings.qml") property bool showWifiDialog: false property bool showBluetoothDialog: false property bool showAudioOutputDialog: false property bool showAudioInputDialog: 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 { id: wifiDialogLoader shownPropertyString: "showWifiDialog" dialog: WifiDialog {} onShownChanged: { if (!shown) return; Network.enableWifi(); Network.rescanWifi(); } } ToggleDialog { id: bluetoothDialogLoader shownPropertyString: "showBluetoothDialog" dialog: BluetoothDialog {} onShownChanged: { if (!shown) { Bluetooth.defaultAdapter.discovering = false; } else { Bluetooth.defaultAdapter.enabled = true; Bluetooth.defaultAdapter.discovering = true; } } } ToggleDialog { id: audioOutputDialogLoader shownPropertyString: "showAudioOutputDialog" dialog: VolumeDialog { isSink: true } } ToggleDialog { id: audioInputDialogLoader shownPropertyString: "showAudioInputDialog" dialog: VolumeDialog { isSink: false } } 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 onOpenWifiDialog() { root.showWifiDialog = true; } function onOpenBluetoothDialog() { root.showBluetoothDialog = true; } function onOpenAudioOutputDialog() { root.showAudioOutputDialog = true; } function onOpenAudioInputDialog() { root.showAudioInputDialog = 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") } } } } }