pragma ComponentBehavior: Bound import Quickshell import Quickshell.Hyprland import QtQuick import QtQuick.Layouts import qs.Components import qs.Modules import qs.Config import qs.Helpers import qs.Modules.UPower import qs.Modules.Network RowLayout { id: root required property PanelWindow bar required property Wrapper popouts required property ShellScreen screen readonly property int vPadding: 6 required property PersistentProperties visibilities function checkPopout(x: real): void { const ch = childAt(x, 2) as WrappedLoader; if (!ch) { if (!popouts.currentName.includes("traymenu")) popouts.hasCurrent = false; return; } if (visibilities.sidebar || visibilities.dashboard) return; const id = ch.id; const top = ch.x; const item = ch.item; const itemWidth = item.implicitWidth; if (id === "audio" && Config.barConfig.popouts.audio) { popouts.currentName = "audio"; popouts.currentCenter = Qt.binding(() => item.mapToItem(root, itemWidth / 2, 0).x); popouts.hasCurrent = true; } else if (id === "resources" && Config.barConfig.popouts.resources) { popouts.currentName = "resources"; popouts.currentCenter = Qt.binding(() => item.mapToItem(root, itemWidth / 2, 0).x); popouts.hasCurrent = true; } else if (id === "tray" && Config.barConfig.popouts.tray) { const index = Math.floor(((x - top) / item.implicitWidth) * item.items.count); const trayItem = item.items.itemAt(index); if (trayItem) { // popouts.currentName = `traymenu${ index }`; // popouts.currentCenter = Qt.binding( () => trayItem.mapToItem( root, trayItem.implicitWidth / 2, 0 ).x ); // popouts.hasCurrent = true; } else { // popouts.hasCurrent = false; } } else if (id === "clock" && Config.barConfig.popouts.clock) { // Calendar.displayYear = new Date().getFullYear(); // Calendar.displayMonth = new Date().getMonth(); // popouts.currentName = "calendar"; // popouts.currentCenter = Qt.binding( () => item.mapToItem( root, itemWidth / 2, 0 ).x ); // popouts.hasCurrent = true; } else if (id === "network" && Config.barConfig.popouts.network) { popouts.currentName = "network"; popouts.currentCenter = Qt.binding(() => item.mapToItem(root, itemWidth / 2, 0).x); popouts.hasCurrent = true; } else if (id === "upower" && Config.barConfig.popouts.upower) { popouts.currentName = "upower"; popouts.currentCenter = Qt.binding(() => item.mapToItem(root, itemWidth / 2, 0).x); popouts.hasCurrent = true; } } anchors.fill: parent CustomShortcut { name: "toggle-overview" onPressed: { Hyprland.refreshWorkspaces(); Hyprland.refreshMonitors(); if (root.popouts.hasCurrent && root.popouts.currentName === "overview") { root.popouts.hasCurrent = false; } else { root.popouts.currentName = "overview"; root.popouts.currentCenter = root.width / 2; root.popouts.hasCurrent = true; } } } Repeater { id: repeater model: Config.barConfig.entries DelegateChooser { role: "id" DelegateChoice { roleValue: "spacer" delegate: WrappedLoader { Layout.fillWidth: true } } DelegateChoice { roleValue: "workspaces" delegate: WrappedLoader { sourceComponent: Workspaces { bar: root.bar } } } DelegateChoice { roleValue: "audio" delegate: WrappedLoader { sourceComponent: AudioWidget { } } } DelegateChoice { roleValue: "tray" delegate: WrappedLoader { sourceComponent: TrayWidget { bar: root.bar loader: root popouts: root.popouts } } } DelegateChoice { roleValue: "resources" delegate: WrappedLoader { sourceComponent: Resources { } } } DelegateChoice { roleValue: "updates" delegate: WrappedLoader { sourceComponent: UpdatesWidget { } } } DelegateChoice { roleValue: "notifBell" delegate: WrappedLoader { sourceComponent: NotifBell { popouts: root.popouts visibilities: root.visibilities } } } DelegateChoice { roleValue: "clock" delegate: WrappedLoader { sourceComponent: Clock { loader: root popouts: root.popouts visibilities: root.visibilities } } } DelegateChoice { roleValue: "activeWindow" delegate: WrappedLoader { sourceComponent: WindowTitle { bar: root monitor: Brightness.getMonitorForScreen(root.screen) } } } DelegateChoice { roleValue: "upower" delegate: WrappedLoader { sourceComponent: UPowerWidget { } } } DelegateChoice { roleValue: "network" delegate: WrappedLoader { sourceComponent: NetworkWidget { } } } // DelegateChoice { // roleValue: "dash" // delegate: WrappedLoader { // sourceComponent: DashWidget { // visibilities: root.visibilities // } // } // } } } component WrappedLoader: Loader { required property bool enabled required property string id required property int index function findFirstEnabled(): Item { const count = repeater.count; for (let i = 0; i < count; i++) { const item = repeater.itemAt(i); if (item?.enabled) return item; } return null; } function findLastEnabled(): Item { for (let i = repeater.count - 1; i >= 0; i--) { const item = repeater.itemAt(i); if (item?.enabled) return item; } return null; } Layout.alignment: Qt.AlignVCenter Layout.fillHeight: true Layout.leftMargin: findFirstEnabled() === this ? root.vPadding : 0 Layout.rightMargin: findLastEnabled() === this ? root.vPadding : 0 active: enabled visible: enabled } }