Skip to content

Commit b660f78

Browse files
committed
Refresh conditional setting visibility for module and HUD settings
This makes conditional setting visibility updates systemic instead of value-only. Backend setting-change broadcasts now include a full visibility map for the affected module/HUD element. Frontend stores apply that visibility map on each setting update, so dependent controls refresh immediately when parent modes/options change. This fixes stale UI for mode-dependent settings (NoFall was just one visible symptom) across Meteor and addon modules.
1 parent 3aa8130 commit b660f78

6 files changed

Lines changed: 59 additions & 14 deletions

File tree

src/main/java/com/cope/meteorwebgui/mapping/HudMapper.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,17 @@ public static JsonObject createHudSettingChangeMessage(HudElement element, Setti
132132
data.addProperty("elementName", getElementIdentifier(element));
133133
data.addProperty("settingName", setting.name);
134134
data.add("value", SettingsReflector.getSettingValue(setting, SettingsReflector.detectSettingType(setting)));
135+
data.add("visibility", createSettingVisibilityMap(element));
135136
return data;
136137
}
138+
139+
private static JsonObject createSettingVisibilityMap(HudElement element) {
140+
JsonObject visibility = new JsonObject();
141+
for (SettingGroup group : element.settings) {
142+
for (Setting<?> setting : group) {
143+
visibility.addProperty(setting.name, setting.isVisible());
144+
}
145+
}
146+
return visibility;
147+
}
137148
}

src/main/java/com/cope/meteorwebgui/mapping/ModuleMapper.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,20 @@ public static JsonObject createSettingChangeMessage(Module module, Setting<?> se
139139
data.addProperty("moduleName", module.name);
140140
data.addProperty("settingName", setting.name);
141141
data.add("value", SettingsReflector.getSettingValue(setting, SettingsReflector.detectSettingType(setting)));
142+
data.add("visibility", createSettingVisibilityMap(module));
142143
return data;
143144
}
144145

146+
private static JsonObject createSettingVisibilityMap(Module module) {
147+
JsonObject visibility = new JsonObject();
148+
for (SettingGroup group : module.settings) {
149+
for (Setting<?> setting : group) {
150+
visibility.addProperty(setting.name, setting.isVisible());
151+
}
152+
}
153+
return visibility;
154+
}
155+
145156
/**
146157
* Get list of all favorite module names
147158
*/

webui/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webui/src/stores/hud.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,22 @@ export const useHudStore = defineStore('hud', () => {
9999
if (typeof payload.height === 'number') element.height = payload.height
100100
}
101101

102-
function updateSettingValue(elementName: string, settingName: string, value: any) {
102+
function updateSettingValue(
103+
elementName: string,
104+
settingName: string,
105+
value: any,
106+
visibility?: Record<string, boolean>
107+
) {
103108
const element = elements.value[elementName]
104109
if (!element?.settingGroups) return
105110
for (const group of element.settingGroups) {
106-
const setting = group.settings.find(s => s.name === settingName)
107-
if (setting) {
108-
setting.value = value
109-
return
111+
for (const setting of group.settings) {
112+
if (setting.name === settingName) {
113+
setting.value = value
114+
}
115+
if (visibility && Object.prototype.hasOwnProperty.call(visibility, setting.name)) {
116+
setting.visible = Boolean(visibility[setting.name])
117+
}
110118
}
111119
}
112120
}

webui/src/stores/modules.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,18 +76,27 @@ export const useModulesStore = defineStore('modules', () => {
7676
}
7777
}
7878

79-
function updateSettingValue(moduleName: string, settingName: string, value: any) {
79+
function updateSettingValue(
80+
moduleName: string,
81+
settingName: string,
82+
value: any,
83+
visibility?: Record<string, boolean>
84+
) {
8085
// Find the module and update the setting
8186
for (const category in byCategory.value) {
8287
const module = byCategory.value[category].find(m => m.name === moduleName)
8388
if (module && module.settingGroups) {
8489
for (const group of module.settingGroups) {
85-
const setting = group.settings.find(s => s.name === settingName)
86-
if (setting) {
87-
setting.value = value
88-
return
90+
for (const setting of group.settings) {
91+
if (setting.name === settingName) {
92+
setting.value = value
93+
}
94+
if (visibility && Object.prototype.hasOwnProperty.call(visibility, setting.name)) {
95+
setting.visible = Boolean(visibility[setting.name])
96+
}
8997
}
9098
}
99+
return
91100
}
92101
}
93102
}

webui/src/stores/websocket.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ export const useWebSocketStore = defineStore('websocket', () => {
128128
modulesStore.updateSettingValue(
129129
message.data.moduleName,
130130
message.data.settingName,
131-
message.data.value
131+
message.data.value,
132+
message.data.visibility
132133
)
133134
break
134135

@@ -169,7 +170,12 @@ export const useWebSocketStore = defineStore('websocket', () => {
169170
break
170171

171172
case 'hud.setting.value.changed':
172-
hudStore.updateSettingValue(message.data.elementName, message.data.settingName, message.data.value)
173+
hudStore.updateSettingValue(
174+
message.data.elementName,
175+
message.data.settingName,
176+
message.data.value,
177+
message.data.visibility
178+
)
173179
break
174180

175181
case 'error':

0 commit comments

Comments
 (0)