@@ -29,6 +29,7 @@ const registry = new Map();
2929const events = eventEmitter ( ) ;
3030const configs = new Map ( ) ;
3131let dialog = null ;
32+ let updateLock = false ;
3233
3334/**
3435 * @returns {tabManager }
@@ -81,13 +82,18 @@ function init(page) {
8182}
8283
8384function createSetting ( setting = defaultSetting ) {
85+ // TODO: hidden creates a hidden setting?
8486 if ( setting . hidden ) return null ;
8587 const ret = $ ( '<div>' ) . addClass ( 'flex-start' ) ;
8688 const { key, type } = setting ;
89+ events . emit ( `create:${ key } ` ) ;
8790 ret . addClass ( getCSSName ( type . name ) ) ;
88- const current = value ( key ) ;
8991 const container = $ ( `<div>` ) . addClass ( 'flex-stretch' ) ;
90- const el = $ ( type . element ( current , ( ...args ) => setting . update ( ...args ) , {
92+ const el = $ ( type . element ( setting . value , ( ...args ) => {
93+ if ( ! updateLock ) updateLock = setting ;
94+ setting . update ( ...args ) ;
95+ if ( updateLock === setting ) updateLock = false ;
96+ } , {
9197 data : setting . data ,
9298 remove : setting . remove ,
9399 container,
@@ -101,11 +107,6 @@ function createSetting(setting = defaultSetting) {
101107 } ) ;
102108
103109 const label = $ ( `<label for="${ key } ">` ) . html ( translateText ( setting . name ) ) ;
104- // TODO: Allow disabling progmatically, not just on setting load
105- if ( setting . disabled ) {
106- el . prop ( 'disabled' , true ) ;
107- label . addClass ( 'disabled' ) ;
108- }
109110 const labelPlacement = type . labelFirst ( ) ;
110111 if ( labelPlacement ) {
111112 ret . append ( label , ' ' , el ) ;
@@ -133,6 +134,16 @@ function createSetting(setting = defaultSetting) {
133134 ret . append ( ' ' , reset ) ;
134135 }
135136 ret . append ( container ) ;
137+
138+ function refresh ( ) {
139+ // TODO: hidden is technically dynamic
140+ // TODO: reset is technically dynamic
141+ el . prop ( 'disabled' , setting . disabled ) ;
142+ label . toggleClass ( 'disabled' , setting . disabled ) ;
143+ }
144+ refresh ( ) ;
145+ untilClose ( `refresh:${ key } ` , refresh , `create:${ key } ` ) ;
146+
136147 return ret ;
137148}
138149
@@ -153,8 +164,17 @@ function getMessage(page) {
153164 return categories [ name ] || createCategory ( name ) ;
154165 }
155166 category ( ) ;
156- each ( pageSettings , ( data ) => {
157- category ( data . category ) . append ( createSetting ( data ) ) ;
167+ each ( pageSettings , ( data = defaultSetting ) => {
168+ let element = createSetting ( data ) ;
169+ category ( data . category ) . append ( element ) ;
170+
171+ function refresh ( ) {
172+ if ( updateLock === data ) return ; // Setting is updating itself
173+ const newElement = createSetting ( data ) ;
174+ element . replaceWith ( newElement ) ;
175+ element = newElement ;
176+ }
177+ untilClose ( data . key , refresh ) ;
158178 } ) ;
159179 if ( ! category ( 'N/A' ) . html ( ) ) {
160180 category ( 'N/A' ) . remove ( ) ;
@@ -381,3 +401,10 @@ each(types, (Type) => registerType(new Type()));
381401function getCSSName ( name = '' , prefix = 'setting-' ) {
382402 return `${ prefix } ${ name . replaceAll ( / [ ^ _ a - z A - Z 0 - 9 - ] / g, '-' ) } ` ;
383403}
404+
405+ function untilClose ( key , callback , extra = '' ) {
406+ events . on ( key , callback ) ;
407+ events . once ( [ 'close' , extra ] . join ( ' ' ) . trim ( ) , ( ) => {
408+ events . off ( key , callback ) ;
409+ } ) ;
410+ }
0 commit comments