pragma ComponentBehavior: Bound import Quickshell import QtQuick import QtQuick.Layouts import qs.Modules import qs.Config import qs.Modules.SysTray import qs.Modules.Network import qs.Modules.Updates RowLayout { id: root required property bool fullscreen required property Wrapper popouts required property ClipWrapper popoutsWrapper required property ShellScreen screen readonly property int vPadding: 6 required property PersistentProperties visibilities function checkPopout(x: real): void { const ch = childAt(x, height / 2) as EntryWrapper; const id = ch?.entryId; if (!ch || id === undefined) { if (!popouts.currentName.startsWith("traymenu") || Config.bar.tray.showOnHover) popouts.hasCurrent = false; return; } if (visibilities.sidebar || visibilities.dashboard || visibilities.resources || visibilities.settings) return; if (id === "statusIcons" && Config.bar.popouts.statusIcons) { const items = (ch.item as StatusIcons).items; const localX = mapToItem(items, x, 0).x; const icon = items.childAt(localX, items.height / 2); if (icon) { popouts.currentName = icon.name; popouts.currentCenter = Qt.binding(() => icon.mapToItem(root, icon.implicitWidth / 2, 0).x); popouts.hasCurrent = true; } } else if (id === "tray" && Config.bar.popouts.tray && Config.bar.tray.showOnHover) { const tray = ch.item as TrayIcons; const layout = tray.layout; const localX = mapToItem(layout, x, 0).x; const trayItem = layout.childAt(localX, layout.height / 2); if (trayItem) { const idx = trayItem.index; popouts.currentName = `traymenu${idx}`; popouts.currentCenter = Qt.binding(() => { const it = tray.items.itemAt(idx); return it ? it.mapToItem(root, it.implicitWidth / 2, 0).x : popouts.currentCenter; }); popouts.hasCurrent = true; } if (!popouts.currentName.startsWith("traymenu")) popouts.hasCurrent = false; } if (id === "updates") { popouts.currentName = "updates"; popouts.currentCenter = Qt.binding(() => ch.item.mapToItem(root, (ch.item as Item).implicitWidth / 2, 0).x); popouts.hasCurrent = true; } } spacing: Appearance.spacing.small Repeater { id: repeater model: ScriptModel { values: Config.bar.entries.filter(e => e.enabled) } DelegateChooser { role: "id" DelegateChoice { roleValue: "hyprsunset" delegate: EntryWrapper { HyprsunsetWidget { visible: !root.fullscreen } } } DelegateChoice { roleValue: "spacer" delegate: EntryWrapper { Layout.fillWidth: true } } DelegateChoice { roleValue: "workspaces" delegate: EntryWrapper { Workspaces { screen: root.screen visible: !root.fullscreen } } } DelegateChoice { roleValue: "tray" delegate: EntryWrapper { TrayIcons { loader: root popouts: root.popouts visible: !root.fullscreen } } } DelegateChoice { roleValue: "statusIcons" delegate: EntryWrapper { StatusIcons { } } } DelegateChoice { roleValue: "resources" delegate: EntryWrapper { Resources { visibilities: root.visibilities visible: !root.fullscreen } } } DelegateChoice { roleValue: "updates" delegate: EntryWrapper { UpdatesWidget { visible: !root.fullscreen } } } DelegateChoice { roleValue: "notifBell" delegate: EntryWrapper { NotifBell { popouts: root.popouts visibilities: root.visibilities visible: !root.fullscreen } } } DelegateChoice { roleValue: "clock" delegate: EntryWrapper { Clock { loader: root popouts: root.popouts visibilities: root.visibilities visible: !root.fullscreen } } } DelegateChoice { roleValue: "activeWindow" delegate: EntryWrapper { WindowTitle { bar: root visible: !root.fullscreen } } } DelegateChoice { roleValue: "network" delegate: EntryWrapper { NetworkWidget { } } } DelegateChoice { roleValue: "media" delegate: EntryWrapper { MediaWidget { visible: !root.fullscreen } } } } } component EntryWrapper: Item { readonly property string entryId: modelData.id required property int index default property Item item required property var modelData Layout.alignment: Qt.AlignVCenter Layout.leftMargin: index === 0 ? root.vPadding : (entryId === "statusIcons") ? -root.spacing + Appearance.spacing.extraSmall : 0 Layout.rightMargin: index === repeater.count - 1 ? root.vPadding : 0 children: item implicitHeight: item?.implicitHeight ?? 0 implicitWidth: item?.implicitWidth ?? 0 } }