Append newly active bar indicators

This commit is contained in:
David Heinemeier Hansson
2026-05-20 15:58:38 +02:00
parent 5110b0d753
commit fca1393c8c
+104 -3
View File
@@ -1122,6 +1122,73 @@ Item {
property string moduleName: "indicators" property string moduleName: "indicators"
property var settings: ({}) property var settings: ({})
readonly property var indicatorEntries: root.indicatorEntriesFromSettings(settings) readonly property var indicatorEntries: root.indicatorEntriesFromSettings(settings)
property var activeIndicatorIds: []
property var indicatorActiveStates: ({})
readonly property var activeIndicatorEntries: activeEntriesFromOrder(activeIndicatorIds)
function hasIndicatorId(id) {
for (var i = 0; i < indicatorEntries.length; i++) {
if (root.entryId(indicatorEntries[i]) === id) return true
}
return false
}
function activeEntriesFromOrder(ids) {
var result = []
for (var i = 0; i < ids.length; i++) {
var id = ids[i]
for (var j = 0; j < indicatorEntries.length; j++) {
var entry = indicatorEntries[j]
if (root.entryId(entry) === id) {
result.push(entry)
break
}
}
}
return result
}
function copyActiveStates() {
var states = {}
for (var id in indicatorActiveStates) {
if (indicatorActiveStates[id] === true) states[id] = true
}
return states
}
function orderedActiveIds(states, preferredOrder) {
var ids = []
for (var i = 0; i < preferredOrder.length; i++) {
var id = preferredOrder[i]
if (ids.indexOf(id) === -1 && hasIndicatorId(id) && states[id] === true) ids.push(id)
}
return ids
}
function setIndicatorActive(entry, active) {
var id = root.entryId(entry)
if (id === "") return
var states = copyActiveStates()
if (active) states[id] = true
else delete states[id]
indicatorActiveStates = states
var ids = orderedActiveIds(states, activeIndicatorIds)
if (active && ids.indexOf(id) === -1 && hasIndicatorId(id)) ids.push(id)
activeIndicatorIds = ids
}
function syncActiveIndicatorOrder() {
activeIndicatorIds = orderedActiveIds(indicatorActiveStates, activeIndicatorIds)
}
onIndicatorEntriesChanged: syncActiveIndicatorOrder()
implicitWidth: root.vertical ? verticalIndicators.implicitWidth : horizontalIndicators.implicitWidth implicitWidth: root.vertical ? verticalIndicators.implicitWidth : horizontalIndicators.implicitWidth
implicitHeight: root.vertical ? verticalIndicators.implicitHeight : horizontalIndicators.implicitHeight implicitHeight: root.vertical ? verticalIndicators.implicitHeight : horizontalIndicators.implicitHeight
@@ -1133,7 +1200,8 @@ Item {
spacing: 0 spacing: 0
IndicatorBlock { IndicatorBlock {
indicatorEntries: indicatorsRoot.indicatorEntries indicatorsModule: indicatorsRoot
indicatorEntries: indicatorsRoot.activeIndicatorEntries
indicatorBlock: "active" indicatorBlock: "active"
horizontal: true horizontal: true
} }
@@ -1149,9 +1217,11 @@ Item {
IndicatorBlock { IndicatorBlock {
id: inactiveHorizontalBlock id: inactiveHorizontalBlock
anchors.fill: parent anchors.fill: parent
indicatorsModule: indicatorsRoot
indicatorEntries: indicatorsRoot.indicatorEntries indicatorEntries: indicatorsRoot.indicatorEntries
indicatorBlock: "inactive" indicatorBlock: "inactive"
horizontal: true horizontal: true
reportActiveState: !root.vertical
} }
HoverHandler { HoverHandler {
@@ -1167,7 +1237,8 @@ Item {
spacing: 0 spacing: 0
IndicatorBlock { IndicatorBlock {
indicatorEntries: indicatorsRoot.indicatorEntries indicatorsModule: indicatorsRoot
indicatorEntries: indicatorsRoot.activeIndicatorEntries
indicatorBlock: "active" indicatorBlock: "active"
horizontal: false horizontal: false
} }
@@ -1183,9 +1254,11 @@ Item {
IndicatorBlock { IndicatorBlock {
id: inactiveVerticalBlock id: inactiveVerticalBlock
anchors.fill: parent anchors.fill: parent
indicatorsModule: indicatorsRoot
indicatorEntries: indicatorsRoot.indicatorEntries indicatorEntries: indicatorsRoot.indicatorEntries
indicatorBlock: "inactive" indicatorBlock: "inactive"
horizontal: false horizontal: false
reportActiveState: root.vertical
} }
HoverHandler { HoverHandler {
@@ -1199,8 +1272,10 @@ Item {
id: indicatorBlockRoot id: indicatorBlockRoot
property var indicatorEntries: [] property var indicatorEntries: []
property var indicatorsModule: null
property string indicatorBlock: "active" property string indicatorBlock: "active"
property bool horizontal: true property bool horizontal: true
property bool reportActiveState: false
implicitWidth: blockLoader.item ? blockLoader.item.childrenRect.width : 0 implicitWidth: blockLoader.item ? blockLoader.item.childrenRect.width : 0
implicitHeight: blockLoader.item ? blockLoader.item.childrenRect.height : 0 implicitHeight: blockLoader.item ? blockLoader.item.childrenRect.height : 0
@@ -1225,8 +1300,10 @@ Item {
IndicatorLoader { IndicatorLoader {
required property var modelData required property var modelData
indicatorsModule: indicatorBlockRoot.indicatorsModule
entry: modelData entry: modelData
indicatorBlock: indicatorBlockRoot.indicatorBlock indicatorBlock: indicatorBlockRoot.indicatorBlock
reportActiveState: indicatorBlockRoot.reportActiveState
} }
} }
} }
@@ -1243,8 +1320,10 @@ Item {
IndicatorLoader { IndicatorLoader {
required property var modelData required property var modelData
indicatorsModule: indicatorBlockRoot.indicatorsModule
entry: modelData entry: modelData
indicatorBlock: indicatorBlockRoot.indicatorBlock indicatorBlock: indicatorBlockRoot.indicatorBlock
reportActiveState: indicatorBlockRoot.reportActiveState
} }
} }
} }
@@ -1255,7 +1334,9 @@ Item {
id: indicatorSlot id: indicatorSlot
required property var entry required property var entry
property var indicatorsModule: null
required property string indicatorBlock required property string indicatorBlock
property bool reportActiveState: false
readonly property string indicatorId: root.entryId(entry) readonly property string indicatorId: root.entryId(entry)
readonly property var indicatorSettings: root.entrySettings(entry) readonly property var indicatorSettings: root.entrySettings(entry)
@@ -1263,18 +1344,33 @@ Item {
implicitHeight: indicatorSource.item && indicatorSource.item.visible ? indicatorSource.item.implicitHeight : 0 implicitHeight: indicatorSource.item && indicatorSource.item.visible ? indicatorSource.item.implicitHeight : 0
width: implicitWidth width: implicitWidth
height: implicitHeight height: implicitHeight
onEntryChanged: {
injectProps()
syncActiveState()
}
onIndicatorBlockChanged: injectProps() onIndicatorBlockChanged: injectProps()
onIndicatorSettingsChanged: injectProps() onIndicatorSettingsChanged: injectProps()
onIndicatorsModuleChanged: syncActiveState()
onReportActiveStateChanged: syncActiveState()
Loader { Loader {
id: indicatorSource id: indicatorSource
anchors.fill: parent anchors.fill: parent
source: indicatorSlot.indicatorId ? Qt.resolvedUrl("indicators/" + indicatorSlot.indicatorId + ".qml") : "" source: indicatorSlot.indicatorId ? Qt.resolvedUrl("indicators/" + indicatorSlot.indicatorId + ".qml") : ""
onLoaded: indicatorSlot.injectProps() onLoaded: {
indicatorSlot.injectProps()
indicatorSlot.syncActiveState()
}
onStatusChanged: if (status === Loader.Error) console.warn("Indicator loader error", indicatorSlot.indicatorId, source) onStatusChanged: if (status === Loader.Error) console.warn("Indicator loader error", indicatorSlot.indicatorId, source)
} }
Connections {
target: indicatorSource.item
ignoreUnknownSignals: true
function onActiveChanged() { indicatorSlot.syncActiveState() }
}
function injectProps() { function injectProps() {
var target = indicatorSource.item var target = indicatorSource.item
if (!target) return if (!target) return
@@ -1283,6 +1379,11 @@ Item {
if ("settings" in target) target.settings = indicatorSettings if ("settings" in target) target.settings = indicatorSettings
if ("indicatorBlock" in target) target.indicatorBlock = indicatorBlock if ("indicatorBlock" in target) target.indicatorBlock = indicatorBlock
} }
function syncActiveState() {
if (!reportActiveState || !indicatorsModule || !indicatorsModule.setIndicatorActive) return
indicatorsModule.setIndicatorActive(entry, !!indicatorSource.item && indicatorSource.item.active === true)
}
} }
component OmarchyModule: ModuleButton { component OmarchyModule: ModuleButton {