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.ii.sidebarRight.quickToggles import qs.modules.ii.sidebarRight.quickToggles.classicStyle import qs.modules.ii.sidebarRight.bluetoothDevices import qs.modules.ii.sidebarRight.nightLight import qs.modules.ii.sidebarRight.volumeMixer import qs.modules.ii.sidebarRight.wifiNetworks Item { id: root property int sidebarWidth: Appearance.sizes.sidebarWidth property int sidebarPadding: 10 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 } } Item { Layout.fillHeight: true Layout.fillWidth: true clip: true CenterWidgetGroup { id: centerGroup anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right anchors.bottom: bottomGroup.top anchors.bottomMargin: root.sidebarPadding opacity: bottomGroup.collapsed ? 1 : 0 visible: opacity > 0 Behavior on opacity { NumberAnimation { duration: Appearance.animation.elementMove.duration easing.type: Appearance.animation.elementMove.type easing.bezierCurve: Appearance.animation.elementMove.bezierCurve } } } BottomWidgetGroup { id: bottomGroup anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom height: bottomGroup.collapsed ? bottomGroup.collapsedHeight : parent.height Behavior on height { NumberAnimation { duration: Appearance.animation.elementMove.duration easing.type: Appearance.animation.elementMove.type easing.bezierCurve: Appearance.animation.elementMove.bezierCurve } } } } } } 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 ? item.Layout.alignment : Qt.AlignHCenter Layout.fillWidth: item ? 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: { Quickshell.execDetached(["hyprctl", "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") } } } } }