Lift setting / vertical / barSize onto BarWidget

Six widgets (clock, daytime, keyboardLayout, lockKeys, activeWindow,
media) shipped identical copies of `function setting(name, fallback)`.
Eight widgets reimplemented `readonly property bool vertical`, and
three reimplemented `readonly property int barSize`. Move all three
onto the BarWidget base so widgets read the same wiring everyone else
gets for free.

While in here, drop the dead `setting()` declaration on media.qml — it
was defined but never called.
This commit is contained in:
David Heinemeier Hansson
2026-05-20 19:50:10 +02:00
parent 4d58dfa27a
commit 16604c67b3
12 changed files with 23 additions and 51 deletions
+16
View File
@@ -1,4 +1,5 @@
import QtQuick
import qs.Commons
// Base item every bar widget extends. Codifies the three properties the
// bar host injects into each widget slot:
@@ -14,4 +15,19 @@ Item {
property QtObject bar: null
property string moduleName: ""
property var settings: ({})
// Bar geometry, lifted off the host. Widgets read these constantly to pick
// between horizontal/vertical layouts; defining them on the base keeps the
// `bar ? bar.x : fallback` ternary out of every widget body.
readonly property bool vertical: bar ? bar.vertical : false
readonly property int barSize: bar ? bar.barSize : Style.bar.sizeHorizontal
// Read a single value from this widget's inline shell.json entry, with a
// fallback for missing/null values. Every widget that takes user-tunable
// settings needs this; defining it once on the base keeps the wiring
// consistent.
function setting(name, fallback) {
var value = settings ? settings[name] : undefined
return value === undefined || value === null ? fallback : value
}
}
+1 -8
View File
@@ -9,20 +9,13 @@ BarWidget {
moduleName: "activeWindow"
function setting(name, fallback) {
var value = settings ? settings[name] : undefined
return value === undefined || value === null ? fallback : value
}
readonly property var toplevel: ToplevelManager.activeToplevel
readonly property string title: toplevel ? (toplevel.title || toplevel.appId || "") : ""
readonly property int maxLabelWidth: Number(setting("maxWidth", 280))
readonly property bool vertical: bar ? bar.vertical : false
visible: title !== "" && !vertical
implicitWidth: visible ? Math.min(maxLabelWidth, labelText.implicitWidth) + Style.spacing.controlPaddingX * 2 : 0
implicitHeight: bar ? bar.barSize : 26
implicitHeight: barSize
Behavior on implicitWidth {
NumberAnimation { duration: 180; easing.type: Easing.OutCubic }
-5
View File
@@ -9,11 +9,6 @@ BarWidget {
property bool alt: false
function setting(name, fallback) {
var value = settings ? settings[name] : undefined
return value === undefined || value === null ? fallback : value
}
function label() {
if (alt) return Qt.formatDateTime(clock.date, String(setting("formatAlt", "dd MMMM 'W'ww yyyy")))
if (bar && bar.vertical) return Qt.formatDateTime(clock.date, String(setting("verticalFormat", "HH\n—\nmm")))
-5
View File
@@ -9,11 +9,6 @@ BarWidget {
property date now: new Date()
function setting(name, fallback) {
var value = settings ? settings[name] : undefined
return value === undefined || value === null ? fallback : value
}
function formatLabel() {
if (!bar) return ""
var fmt = bar.vertical
-2
View File
@@ -8,8 +8,6 @@ BarWidget {
id: root
moduleName: "indicators"
readonly property bool vertical: bar ? bar.vertical : false
readonly property int barSize: bar ? bar.barSize : Style.bar.sizeHorizontal
readonly property int indicatorSlotExtent: Style.space(22)
readonly property int inactiveSlotExtent: indicatorEntries.length * indicatorSlotExtent
readonly property var indicatorEntries: indicatorEntriesFromSettings(settings)
@@ -13,11 +13,6 @@ BarWidget {
property string layoutLabel: ""
property string layoutFull: ""
function setting(name, fallback) {
var value = settings ? settings[name] : undefined
return value === undefined || value === null ? fallback : value
}
function refresh() {
if (!queryProc.running) queryProc.running = true
}
+2 -9
View File
@@ -14,11 +14,6 @@ BarWidget {
property bool scrollOn: false
property bool hideWhenOff: true
function setting(name, fallback) {
var value = settings ? settings[name] : undefined
return value === undefined || value === null ? fallback : value
}
Component.onCompleted: {
hideWhenOff = setting("hideWhenOff", true) === true
refresh()
@@ -58,10 +53,8 @@ BarWidget {
readonly property bool anyOn: capsOn || numOn || scrollOn
visible: ledsAvailable && (hideWhenOff ? anyOn : true)
readonly property bool vertical: bar ? bar.vertical : false
implicitWidth: vertical ? (bar ? bar.barSize : Style.bar.sizeVertical) : (lay.item ? lay.item.implicitWidth + Style.spacing.controlGap : 0)
implicitHeight: vertical ? (lay.item ? lay.item.implicitHeight + Style.spacing.controlGap : 0) : (bar ? bar.barSize : Style.bar.sizeHorizontal)
implicitWidth: vertical ? barSize : (lay.item ? lay.item.implicitWidth + Style.spacing.controlGap : 0)
implicitHeight: vertical ? (lay.item ? lay.item.implicitHeight + Style.spacing.controlGap : 0) : barSize
Loader {
id: lay
+1 -6
View File
@@ -9,11 +9,6 @@ BarWidget {
moduleName: "media"
function setting(name, fallback) {
var value = settings ? settings[name] : undefined
return value === undefined || value === null ? fallback : value
}
readonly property var players: Mpris.players ? Mpris.players.values : []
readonly property var activePlayer: {
var playing = null
@@ -38,7 +33,7 @@ BarWidget {
visible: hasMedia
implicitWidth: hasMedia ? row.implicitWidth + Style.space(14) : 0
implicitHeight: bar ? bar.barSize : 26
implicitHeight: barSize
Row {
id: row
+2 -4
View File
@@ -5,11 +5,9 @@ BarWidget {
id: root
moduleName: "spacer"
readonly property bool vertical: bar ? bar.vertical : false
readonly property int span: settings && settings.size !== undefined ? Number(settings.size) : 12
implicitWidth: vertical ? (bar ? bar.barSize : 28) : span
implicitHeight: vertical ? span : (bar ? bar.barSize : 26)
implicitWidth: vertical ? barSize : span
implicitHeight: vertical ? span : barSize
visible: span > 0
}
+1 -2
View File
@@ -116,8 +116,7 @@ BarWidget {
onTriggered: root.refresh()
}
readonly property bool vertical: bar ? bar.vertical : false
readonly property color statColor: bar ? bar.foreground : "#cacccc"
readonly property color statColor: bar ? bar.foreground : Color.foreground
implicitWidth: button.implicitWidth
implicitHeight: button.implicitHeight
-2
View File
@@ -10,8 +10,6 @@ BarWidget {
property bool expanded: false
property bool managePopupOpen: false
readonly property bool vertical: bar ? bar.vertical : false
readonly property int barSize: bar ? bar.barSize : Style.bar.sizeHorizontal
readonly property color foreground: bar ? bar.foreground : Color.foreground
readonly property string fontFamily: bar ? bar.fontFamily : Style.font.family
readonly property var pinnedIds: Array.isArray(settings.pinned) ? settings.pinned : []
-3
View File
@@ -8,9 +8,6 @@ BarWidget {
id: root
moduleName: "workspaces"
readonly property bool vertical: bar ? bar.vertical : false
readonly property int barSize: bar ? bar.barSize : Style.bar.sizeHorizontal
function workspaceById(id) {
var values = Hyprland.workspaces.values
for (var i = 0; i < values.length; i++) {