Files
homelab/dotfiles/quickshell/widgets/bar/DenseBar.qml
T

87 lines
3.0 KiB
QML

pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Hyprland
import Quickshell.Services.Pipewire
import Quickshell.Services.SystemTray
import QtQuick
import qs.widgets.vitals
// Production/layer-shell adapter. All visual composition lives in the
// Item-rooted DenseBarContent so the exact bar can be rendered headlessly.
Scope {
id: root
readonly property PwNode sink: Pipewire.defaultAudioSink
readonly property real volume: sink?.audio?.volume ?? 0
readonly property bool muted: sink?.audio?.muted ?? false
readonly property var workspaceIds: Hyprland.workspaces.values
.filter(workspace => workspace.id > 0)
.map(workspace => workspace.id)
readonly property int activeWorkspaceId: Hyprland.focusedWorkspace?.id ?? 1
readonly property var rootDisk: vitals.disks.length > 0 ? vitals.disks[0] : null
PwObjectTracker {
objects: [root.sink]
}
VitalsData {
id: vitals
active: true
}
Variants {
model: Quickshell.screens
PanelWindow {
id: window
required property var modelData
screen: modelData
color: "transparent"
implicitHeight: 164
anchors {
top: true
left: true
right: true
}
DenseBarContent {
anchors.fill: parent
hostName: vitals.host || "LOCAL"
telemetryReady: vitals.ready && !vitals.failed
ratesReady: vitals.ratesReady && !vitals.failed
cpuFraction: vitals.cpu
cpuThreads: vitals.cpuThreads
memoryFraction: vitals.memTotal > 0 ? vitals.memUsed / vitals.memTotal : 0
memoryUsedText: vitals.fmtBytes(vitals.memUsed)
temperatureCelsius: vitals.cpuTemp
networkInterface: vitals.netIface || "NET"
networkRxText: vitals.fmtRate(vitals.netRx)
networkTxText: vitals.fmtRate(vitals.netTx)
storageFraction: root.rootDisk && root.rootDisk.size > 0
? root.rootDisk.used / root.rootDisk.size : 0
storageFreeText: root.rootDisk
? vitals.fmtBytes(root.rootDisk.size - root.rootDisk.used) + " FREE"
: "-- FREE"
workspaceIds: root.workspaceIds.length > 0 ? root.workspaceIds : [1, 2, 3, 4]
activeWorkspaceId: root.activeWorkspaceId
trayCount: SystemTray.items.values.length
audioFraction: Math.max(0, Math.min(1, root.volume))
audioMuted: root.muted
onWorkspaceActivated: workspaceId => {
const workspace = Hyprland.workspaces.values.find(item => item.id === workspaceId);
if (workspace)
workspace.activate();
else
Hyprland.dispatch("workspace " + workspaceId);
}
}
}
}
}