diff --git a/shell/plugins/bar/FirstPartyWidgets.qml b/shell/plugins/bar/FirstPartyWidgets.qml index ac8cc70c..e035aa5e 100644 --- a/shell/plugins/bar/FirstPartyWidgets.qml +++ b/shell/plugins/bar/FirstPartyWidgets.qml @@ -24,7 +24,8 @@ QtObject { { value: "StayAwake", label: "Stay awake", description: "Idle lock and screensaver override" }, { value: "ScreenRecording", label: "Screen recording", description: "GPU screen recorder status" }, { value: "Dictation", label: "Dictation", description: "Voice typing status" } - ] } + ] }, + { key: "alwaysShow", type: "boolean", label: "Always Show", description: "Show inactive indicators without waiting for hover.", defaultValue: false } ] }, "NotificationCenter": { displayName: "Notification center", description: "Recent notifications + DND", category: "Status", allowMultiple: false }, "SystemUpdate": { displayName: "System update", description: "Indicates available system updates", category: "System", allowMultiple: false }, diff --git a/shell/plugins/bar/README.md b/shell/plugins/bar/README.md index 22119a87..da47cbfd 100644 --- a/shell/plugins/bar/README.md +++ b/shell/plugins/bar/README.md @@ -76,7 +76,7 @@ Example `shell.json` (bar subtree only shown): | `panels.bluetooth` | Bluetooth icon + popup with device list, connect/disconnect, battery | left = popup · right = toggle radio · middle = bluetoothctl TUI | | `panels.monitor` | Brightness and laptop display controls | left = popup | -The `Indicators` widget loads individual bar indicators from `indicators/`. Omit `items` (or set it to an empty array) to show all indicators in the default order, or set `items` to a subset such as `["Dnd", "NightLight"]`. Multiple `Indicators` instances are allowed, so different sections can show different subsets. Rich panels such as `PowerPanel`, `NetworkPanel`, and `AudioPanel` live in `../panels/` above. +The `Indicators` widget loads individual bar indicators from `indicators/`. Omit `items` (or set it to an empty array) to show all indicators in the default order, or set `items` to a subset such as `["Dnd", "NightLight"]`. Set `alwaysShow` to `true` to keep inactive indicators visible instead of revealing them only on hover. Multiple `Indicators` instances are allowed, so different sections can show different subsets. Rich panels such as `PowerPanel`, `NetworkPanel`, and `AudioPanel` live in `../panels/` above. ## Orientation diff --git a/shell/plugins/bar/widgets/Indicators.qml b/shell/plugins/bar/widgets/Indicators.qml index bfd5bc02..b04e9a2c 100644 --- a/shell/plugins/bar/widgets/Indicators.qml +++ b/shell/plugins/bar/widgets/Indicators.qml @@ -16,7 +16,8 @@ BarWidget { property var indicatorActiveStates: ({}) property bool indicatorAreaHovered: false property bool indicatorItemHovered: false - readonly property bool revealInactiveIndicators: indicatorAreaHovered || indicatorItemHovered + readonly property bool alwaysShowIndicators: setting("alwaysShow", false) === true + readonly property bool revealInactiveIndicators: alwaysShowIndicators || indicatorAreaHovered || indicatorItemHovered signal refreshRequested() diff --git a/shell/plugins/settings/SettingsPanel.qml b/shell/plugins/settings/SettingsPanel.qml index 146f6336..1283589d 100644 --- a/shell/plugins/settings/SettingsPanel.qml +++ b/shell/plugins/settings/SettingsPanel.qml @@ -486,6 +486,8 @@ Item { var copy = Util.cloneJson(widgetDialogEntry) copy[key] = value widgetDialogEntry = copy + if (widgetDialogFormLoader.item && "entry" in widgetDialogFormLoader.item) + widgetDialogFormLoader.item.entry = widgetDialogEntry } FloatingWindow { diff --git a/shell/plugins/settings/components/DynamicSettingsForm.qml b/shell/plugins/settings/components/DynamicSettingsForm.qml index 4419d994..b697a03f 100644 --- a/shell/plugins/settings/components/DynamicSettingsForm.qml +++ b/shell/plugins/settings/components/DynamicSettingsForm.qml @@ -80,7 +80,7 @@ Column { spacing: Style.spacing.labelGap Text { - visible: text !== "" + visible: text !== "" && String(modelData && modelData.type ? modelData.type : "") !== "boolean" text: modelData && modelData.label ? modelData.label : (modelData && modelData.key ? modelData.key : "") color: Qt.darker(root.foreground, 1.3) font.family: root.fontFamily @@ -89,7 +89,7 @@ Column { } Text { - visible: !!(modelData && modelData.description) + visible: !!(modelData && modelData.description) && String(modelData && modelData.type ? modelData.type : "") !== "boolean" text: modelData ? (modelData.description || "") : "" color: Qt.darker(root.foreground, 1.6) font.family: root.fontFamily @@ -155,7 +155,8 @@ Column { property var field: ({}) width: parent.width - label: "Enabled" + label: field && field.label ? String(field.label) : "Enabled" + description: field && field.description ? String(field.description) : "" foreground: root.foreground accent: root.accent fontFamily: root.fontFamily