!7 module VoiceMatrix extends DynObjectTable { SS map; // module lib ID => "+" or "-" S defaultValue = "+"; bool defaultOn = true; // for new modules void update { setData(syncMap(map, func(S moduleID, S value) { litorderedmap( "Module ID" := moduleID, "Speech Output Enabled" := eq(value, "+") ? "Yes" : eq(value, "-" : "No" : "Default (" + (defaultOn ? "Yes" : "No") + ")") })); } visualize { ret withCenteredButtons(super.visualize(), "Enable", r { setValue((S) firstValue(selected()), "+") }, "Disable", r { setValue((S) firstValue(selected()), "-") }); } void setValue(S moduleID, S value) { if (syncPut_trueIfChanged(map, moduleID, value)) persistMe(); } }