Skip to content

Commit 3cc94f8

Browse files
committed
✨ SettingsV2统一设置界面
1 parent 72e215d commit 3cc94f8

File tree

5 files changed

+107
-14
lines changed

5 files changed

+107
-14
lines changed

assets/bundles/bundle-mdtx.properties

+7-3
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,19 @@ setting.limitupdate.name = 限制更新
118118
setting.limitdst.name = 限制更新-额外范围
119119
#end Settings
120120
#SettingsV2
121+
settings.category.settingV2 = [gold]MindustryX V2
121122
settingV2.reset = [red]恢复默认设置
123+
settingV2.autoFill.category = 快速装填
122124
settingV2.autoFill.cooldown.name = 操作冷却(ms)
123125
settingV2.autoFill.cooldown.description = 过小的值可能导致被服务器踢出
124126
settingV2.autoFill.minFill.name = 最小装填个数
125127
settingV2.autoFill.fillStorageBlock.name = 允许往容器/仓库内填充
126128
settingV2.autoFill.fillDistribution.name = 允许往塑钢/桥中填充
127-
settingV2.radarMode.name = [acid]雷达模式
128-
settingV2.radarSize.name = [acid]雷达大小
129-
settingV2.coreItems.name = 资源显示总开关
129+
settingV2.radar.category = ARC雷达扫描
130+
settingV2.radar.mode.name = 扫描速度
131+
settingV2.radar.size.name = 雷达大小
132+
settingV2.coreItems.category = 队伍资源显示
133+
settingV2.coreItems.enable.name = 总开关
130134
settingV2.coreItems.columns.name = 显示列数
131135
settingV2.coreItems.showItem.name = 显示核心物品
132136
settingV2.coreItems.showUnit.name = 显示单位数量

src/mindustryX/features/ArcRadar.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,18 @@ public class ArcRadar{
5252
case 0 -> "关闭";
5353
case 30 -> "瞬间完成";
5454
default -> "[lightgray]x[white]" + Strings.autoFixed(s * 0.2f, 1) + "倍搜索速度";
55-
}).create("radarMode", 1),
55+
}).create("radar.mode", 1),
5656
size = new SliderPref(0, 50, 1, s -> {
5757
if(s == 0) return "固定大小";
5858
return "[lightgray]x[white]" + Strings.autoFixed(s * 0.1f, 1) + "倍";
59-
}).create("radarSize", 0);
59+
}).create("radar.size", 0);
6060
public static List<SettingsV2.Data<?>> settings = CollectionsKt.listOf(mode, size);
6161

62+
{
63+
mode.addFallbackName("radarMode");
64+
size.addFallbackName("radarSize");
65+
}
66+
6267
static{
6368
Events.on(EventType.WorldLoadEvent.class, event -> scanTime = Math.max(Mathf.dst(world.width(), world.height()) / 20f, 7.5f));
6469
}

src/mindustryX/features/Settings.java

+17
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import arc.*;
44
import arc.func.*;
55
import arc.scene.style.*;
6+
import arc.scene.ui.layout.*;
67
import arc.struct.*;
78
import mindustry.*;
89
import mindustry.game.EventType.*;
@@ -104,6 +105,22 @@ public static void addSettings(){
104105
});
105106
c.sliderPref("limitdst", 10, 0, 100, 1, s -> s + "格");
106107
}));
108+
categories.add(new LazySettingsCategory("@settings.category.settingV2", () -> Icon.box, (c) -> {
109+
}){
110+
@Override
111+
public void init(){
112+
super.init();
113+
//noinspection deprecation
114+
table = new SettingsTable(){
115+
@Override
116+
public Table rebuild2(){
117+
SettingsV2.buildSettingsTable(this);
118+
add().width(500).row();
119+
return this;
120+
}
121+
};
122+
}
123+
});
107124
ArcOld.init(categories);
108125
Events.on(ClientLoadEvent.class, e -> {
109126
categories.each(LazySettingsCategory::init);

src/mindustryX/features/SettingsV2.kt

+70-7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import arc.util.Reflect
1313
import arc.util.Time
1414
import mindustry.Vars
1515
import mindustry.gen.Icon
16+
import mindustry.graphics.Pal
1617
import mindustry.ui.Styles
1718
import mindustry.ui.dialogs.BaseDialog
1819

@@ -23,22 +24,22 @@ import mindustry.ui.dialogs.BaseDialog
2324
*/
2425

2526
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) {
2728
private val changedSet = mutableSetOf<String>()
2829
var value: T = def
2930
set(value) {
3031
val v = ext.transformValue(value)
3132
if (v == field) return
3233
field = value
33-
persistentProvider?.set(name, value)
34+
persistentProvider.set(name, value)
3435
changedSet.clear()
3536
}
3637

3738
init {
3839
if (name in ALL)
3940
Log.warn("Settings initialized!: $name")
4041
ALL[name] = this
41-
persistentProvider?.run {
42+
persistentProvider.run {
4243
value = get(name, def)
4344
}
4445
}
@@ -49,31 +50,42 @@ object SettingsV2 {
4950
}
5051

5152
//util
53+
val category: String get() = name.substringBefore('.', "")
5254
val title: String get() = Core.bundle.get("settingV2.${name}.name", name)
5355
fun resetDefault() {
54-
persistentProvider?.reset(name)
56+
persistentProvider.reset(name)
5557
value = def
5658
}
5759

5860
fun buildUI(table: Table) {
59-
Table().apply {
61+
Table().left().apply {
6062
button(Icon.undo, Styles.clearNonei) { resetDefault() }.tooltip("@settings.reset")
6163
.fillY().disabled { value == def }
6264
ext.build(this@Data, this)
6365

6466
Core.bundle.getOrNull("settingV2.${name}.description")?.let {
6567
Vars.ui.addDescTooltip(this, it)
6668
}
67-
table.add(this).left().row()
69+
table.add(this).fillX().row()
6870
}
6971
}
72+
73+
fun addFallbackName(name: String) {
74+
persistentProvider = PersistentProvider.WithFallback(name, persistentProvider)
75+
}
7076
}
7177

7278
sealed interface PersistentProvider {
7379
fun <T> get(name: String, def: T): T
7480
fun <T> set(name: String, value: T)
7581
fun reset(name: String)
7682

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+
7789
data object Arc : PersistentProvider {
7890
override fun <T> get(name: String, def: T): T {
7991
@Suppress("UNCHECKED_CAST")
@@ -88,6 +100,21 @@ object SettingsV2 {
88100
Core.settings.remove(name)
89101
}
90102
}
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+
}
91118
}
92119

93120
sealed interface SettingExt<T> {
@@ -96,7 +123,7 @@ object SettingsV2 {
96123

97124
//util
98125
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)
100127
}
101128

102129
data object CheckPref : SettingExt<Boolean> {
@@ -185,6 +212,42 @@ object SettingsV2 {
185212
}
186213
}
187214

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+
188251
@JvmStatic
189252
fun bindQuickSettings(button: Button, settings: Iterable<Data<*>>) {
190253
button.removeListener(button.clickListener)

src/mindustryX/features/ui/NewCoreItemsDisplay.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
import mindustryX.features.*;
2424
import mindustryX.features.SettingsV2.*;
2525

26-
import java.util.List;
2726
import java.util.*;
27+
import java.util.List;
2828

2929
import static mindustry.Vars.*;
3030

@@ -44,14 +44,18 @@ public class NewCoreItemsDisplay extends Table{
4444
private final ItemSeq planItems = new ItemSeq();
4545
private final ObjectIntMap<Block> planCounter = new ObjectIntMap<>();
4646

47-
private final SettingsV2.Data<Boolean> enable = CheckPref.INSTANCE.create("coreitems");//Origin Setting
47+
private final SettingsV2.Data<Boolean> enable = CheckPref.INSTANCE.create("coreItems.enable", true);//Origin Setting
4848
private final SettingsV2.Data<Integer> columns = new SettingsV2.SliderPref(4, 15).create("coreItems.columns", 5);
4949
private final SettingsV2.Data<Boolean> showItem = CheckPref.INSTANCE.create("coreItems.showItem", true);
5050
private final SettingsV2.Data<Boolean> showUnit = CheckPref.INSTANCE.create("coreItems.showUnit", true);
5151
private final SettingsV2.Data<Boolean> showPlan = CheckPref.INSTANCE.create("coreItems.showPlan", true);
5252
private final SettingsV2.Data<Boolean> showPower = CheckPref.INSTANCE.create("coreItems.showPower", true);
5353
final List<Data<?>> settings = CollectionsKt.listOf(enable, columns, showItem, showUnit, showPlan, showPower);
5454

55+
{
56+
enable.addFallbackName("coreitems");
57+
}
58+
5559
public NewCoreItemsDisplay(){
5660
itemDelta = new int[content.items().size];
5761
lastItemAmount = new int[content.items().size];

0 commit comments

Comments
 (0)