@@ -13,6 +13,7 @@ import arc.util.Reflect
13
13
import arc.util.Time
14
14
import mindustry.Vars
15
15
import mindustry.gen.Icon
16
+ import mindustry.graphics.Pal
16
17
import mindustry.ui.Styles
17
18
import mindustry.ui.dialogs.BaseDialog
18
19
@@ -23,22 +24,22 @@ import mindustry.ui.dialogs.BaseDialog
23
24
*/
24
25
25
26
object SettingsV2 {
26
- data class Data <T >(val name : String , val def : T , val ext : SettingExt <T >, var persistentProvider : PersistentProvider ? = PersistentProvider .Arc ) {
27
+ data class Data <T >(val name : String , val def : T , val ext : SettingExt <T >, var persistentProvider : PersistentProvider = PersistentProvider .Arc ) {
27
28
private val changedSet = mutableSetOf<String >()
28
29
var value: T = def
29
30
set(value) {
30
31
val v = ext.transformValue(value)
31
32
if (v == field) return
32
33
field = value
33
- persistentProvider? .set(name, value)
34
+ persistentProvider.set(name, value)
34
35
changedSet.clear()
35
36
}
36
37
37
38
init {
38
39
if (name in ALL )
39
40
Log .warn(" Settings initialized!: $name " )
40
41
ALL [name] = this
41
- persistentProvider? .run {
42
+ persistentProvider.run {
42
43
value = get(name, def)
43
44
}
44
45
}
@@ -49,31 +50,42 @@ object SettingsV2 {
49
50
}
50
51
51
52
// util
53
+ val category: String get() = name.substringBefore(' .' , " " )
52
54
val title: String get() = Core .bundle.get(" settingV2.${name} .name" , name)
53
55
fun resetDefault () {
54
- persistentProvider? .reset(name)
56
+ persistentProvider.reset(name)
55
57
value = def
56
58
}
57
59
58
60
fun buildUI (table : Table ) {
59
- Table ().apply {
61
+ Table ().left(). apply {
60
62
button(Icon .undo, Styles .clearNonei) { resetDefault() }.tooltip(" @settings.reset" )
61
63
.fillY().disabled { value == def }
62
64
ext.build(this @Data, this )
63
65
64
66
Core .bundle.getOrNull(" settingV2.${name} .description" )?.let {
65
67
Vars .ui.addDescTooltip(this , it)
66
68
}
67
- table.add(this ).left ().row()
69
+ table.add(this ).fillX ().row()
68
70
}
69
71
}
72
+
73
+ fun addFallbackName (name : String ) {
74
+ persistentProvider = PersistentProvider .WithFallback (name, persistentProvider)
75
+ }
70
76
}
71
77
72
78
sealed interface PersistentProvider {
73
79
fun <T > get (name : String , def : T ): T
74
80
fun <T > set (name : String , value : T )
75
81
fun reset (name : String )
76
82
83
+ data object Noop : PersistentProvider {
84
+ override fun <T > get (name : String , def : T ): T = def
85
+ override fun <T > set (name : String , value : T ) {}
86
+ override fun reset (name : String ) {}
87
+ }
88
+
77
89
data object Arc : PersistentProvider {
78
90
override fun <T > get (name : String , def : T ): T {
79
91
@Suppress(" UNCHECKED_CAST" )
@@ -88,6 +100,21 @@ object SettingsV2 {
88
100
Core .settings.remove(name)
89
101
}
90
102
}
103
+
104
+ class WithFallback (private val fallback : String , private val impl : PersistentProvider ) : PersistentProvider {
105
+ override fun <T > get (name : String , def : T ): T {
106
+ return impl.get(name, impl.get(fallback, def))
107
+ }
108
+
109
+ override fun <T > set (name : String , value : T ) {
110
+ impl.set(name, value)
111
+ }
112
+
113
+ override fun reset (name : String ) {
114
+ impl.reset(name)
115
+ impl.reset(fallback)
116
+ }
117
+ }
91
118
}
92
119
93
120
sealed interface SettingExt <T > {
@@ -96,7 +123,7 @@ object SettingsV2 {
96
123
97
124
// util
98
125
fun create (name : String , def : T ) = Data (name, def, this )
99
- fun create (name : String , def : T , persistentProvider : PersistentProvider ? ) = Data (name, def, this , persistentProvider)
126
+ fun create (name : String , def : T , persistentProvider : PersistentProvider ) = Data (name, def, this , persistentProvider)
100
127
}
101
128
102
129
data object CheckPref : SettingExt <Boolean > {
@@ -185,6 +212,42 @@ object SettingsV2 {
185
212
}
186
213
}
187
214
215
+ private var settingSearch: String = " "
216
+
217
+ @JvmStatic
218
+ fun buildSettingsTable (table : Table ) {
219
+ table.clearChildren()
220
+ val searchTable = table.table().fillX().get()
221
+ table.row()
222
+ val contentTable = table.table().fillX().get()
223
+ table.row()
224
+
225
+ fun rebuildContent () {
226
+ contentTable.clearChildren()
227
+ ALL .values.groupBy { it.category }.toSortedMap().forEach { (c, settings0) ->
228
+ val category = Core .bundle.get(" settingV2.$c .category" )
229
+ val categoryMatch = c.contains(settingSearch, ignoreCase = true ) || category.contains(settingSearch, ignoreCase = true )
230
+ val settings = if (categoryMatch) settings0 else settings0.filter {
231
+ if (" @modified" in settingSearch) return @filter it.changed()
232
+ it.name.contains(settingSearch, true ) || it.title.contains(settingSearch, true )
233
+ }
234
+ if (c.isNotEmpty() && settings.isNotEmpty()) {
235
+ contentTable.add(category).color(Pal .accent).padTop(10f ).padBottom(5f ).center().row()
236
+ contentTable.image().color(Pal .accent).fillX().height(3f ).padBottom(10f ).row()
237
+ }
238
+ settings.forEach { it.buildUI(contentTable) }
239
+ }
240
+ }
241
+ searchTable.apply {
242
+ image(Icon .zoom)
243
+ field(settingSearch, {
244
+ settingSearch = it
245
+ rebuildContent()
246
+ }).growX()
247
+ }
248
+ rebuildContent()
249
+ }
250
+
188
251
@JvmStatic
189
252
fun bindQuickSettings (button : Button , settings : Iterable <Data <* >>) {
190
253
button.removeListener(button.clickListener)
0 commit comments