Skip to content

Commit a8649eb

Browse files
authored
Improve setting screen abstractions (#5580)
1 parent 5cd1b05 commit a8649eb

20 files changed

+494
-392
lines changed

src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ private void screenHandlerListW(WTable table, ScreenHandlerListSetting setting)
337337

338338
private void blockDataW(WTable table, BlockDataSetting<?> setting) {
339339
WButton button = table.add(theme.button(GuiRenderer.EDIT)).expandCellX().widget();
340-
button.action = () -> mc.setScreen(new BlockDataSettingScreen(theme, setting));
340+
button.action = () -> mc.setScreen(new BlockDataSettingScreen<>(theme, setting));
341341

342342
reset(table, setting, null);
343343
}

src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java

Lines changed: 40 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66
package meteordevelopment.meteorclient.gui.screens.settings;
77

88
import meteordevelopment.meteorclient.gui.GuiTheme;
9-
import meteordevelopment.meteorclient.gui.WindowScreen;
109
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
11-
import meteordevelopment.meteorclient.gui.widgets.containers.WTable;
12-
import meteordevelopment.meteorclient.gui.widgets.input.WTextBox;
10+
import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionMapSettingScreen;
11+
import meteordevelopment.meteorclient.gui.widgets.WWidget;
1312
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
1413
import meteordevelopment.meteorclient.settings.BlockDataSetting;
1514
import meteordevelopment.meteorclient.settings.IBlockData;
@@ -18,84 +17,59 @@
1817
import meteordevelopment.meteorclient.utils.misc.ISerializable;
1918
import meteordevelopment.meteorclient.utils.misc.Names;
2019
import net.minecraft.block.Block;
20+
import net.minecraft.block.Blocks;
21+
import net.minecraft.client.gui.DrawContext;
2122
import net.minecraft.registry.Registries;
22-
import org.apache.commons.lang3.StringUtils;
23-
24-
import java.util.ArrayList;
25-
import java.util.List;
23+
import org.jetbrains.annotations.Nullable;
2624

2725
import static meteordevelopment.meteorclient.MeteorClient.mc;
2826

29-
public class BlockDataSettingScreen extends WindowScreen {
30-
private static final List<Block> BLOCKS = new ArrayList<>(100);
31-
32-
private final BlockDataSetting<?> setting;
33-
34-
private WTable table;
35-
private String filterText = "";
27+
public class BlockDataSettingScreen<T extends ICopyable<T> & ISerializable<T> & IChangeable & IBlockData<T>> extends CollectionMapSettingScreen<Block, T> {
28+
private final BlockDataSetting<T> setting;
29+
private boolean invalidate;
3630

37-
public BlockDataSettingScreen(GuiTheme theme, BlockDataSetting<?> setting) {
38-
super(theme, "Configure Blocks");
31+
public BlockDataSettingScreen(GuiTheme theme, BlockDataSetting<T> setting) {
32+
super(theme, "Configure Blocks", setting, setting.get(), Registries.BLOCK);
3933

4034
this.setting = setting;
4135
}
4236

4337
@Override
44-
public void initWidgets() {
45-
WTextBox filter = add(theme.textBox("")).minWidth(400).expandX().widget();
46-
filter.setFocused(true);
47-
filter.action = () -> {
48-
filterText = filter.get().trim();
49-
50-
table.clear();
51-
initTable();
52-
};
53-
54-
table = add(theme.table()).expandX().widget();
55-
56-
initTable();
38+
protected boolean includeValue(Block value) {
39+
return value != Blocks.AIR;
5740
}
5841

59-
@SuppressWarnings("unchecked")
60-
public <T extends ICopyable<T> & ISerializable<T> & IChangeable & IBlockData<T>> void initTable() {
61-
for (Block block : Registries.BLOCK) {
62-
T blockData = (T) setting.get().get(block);
63-
64-
if (blockData != null && blockData.isChanged()) BLOCKS.addFirst(block);
65-
else BLOCKS.add(block);
66-
}
67-
68-
for (Block block : BLOCKS) {
69-
String name = Names.get(block);
70-
if (!StringUtils.containsIgnoreCase(name, filterText)) continue;
71-
72-
T blockData = (T) setting.get().get(block);
73-
74-
table.add(theme.itemWithLabel(block.asItem().getDefaultStack(), Names.get(block))).expandCellX();
75-
table.add(theme.label((blockData != null && blockData.isChanged()) ? "*" : " "));
76-
77-
WButton edit = table.add(theme.button(GuiRenderer.EDIT)).widget();
78-
edit.action = () -> {
79-
T data = blockData;
80-
if (data == null) data = (T) setting.defaultData.get().copy();
81-
82-
mc.setScreen(data.createScreen(theme, block, (BlockDataSetting<T>) setting));
83-
};
84-
85-
WButton reset = table.add(theme.button(GuiRenderer.RESET)).widget();
86-
reset.action = () -> {
87-
setting.get().remove(block);
88-
setting.onChanged();
42+
@Override
43+
protected WWidget getValueWidget(Block block) {
44+
return theme.itemWithLabel(block.asItem().getDefaultStack(), Names.get(block));
45+
}
8946

90-
if (blockData != null && blockData.isChanged()) {
91-
table.clear();
92-
initTable();
93-
}
94-
};
47+
@Override
48+
protected WWidget getDataWidget(Block block, @Nullable T blockData) {
49+
WButton edit = theme.button(GuiRenderer.EDIT);
50+
edit.action = () -> {
51+
T data = blockData;
52+
if (data == null) data = setting.defaultData.get().copy();
53+
54+
mc.setScreen(data.createScreen(theme, block, setting));
55+
invalidate = true;
56+
};
57+
return edit;
58+
}
9559

96-
table.row();
60+
@Override
61+
protected void onRenderBefore(DrawContext drawContext, float delta) {
62+
if (invalidate) {
63+
this.invalidateTable();
64+
invalidate = false;
9765
}
66+
}
9867

99-
BLOCKS.clear();
68+
@Override
69+
protected String[] getValueNames(Block block) {
70+
return new String[]{
71+
Names.get(block),
72+
Registries.BLOCK.getId(block).toString()
73+
};
10074
}
10175
}

src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,28 @@
66
package meteordevelopment.meteorclient.gui.screens.settings;
77

88
import meteordevelopment.meteorclient.gui.GuiTheme;
9+
import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen;
910
import meteordevelopment.meteorclient.gui.widgets.WWidget;
10-
import meteordevelopment.meteorclient.mixin.IdentifierAccessor;
1111
import meteordevelopment.meteorclient.settings.BlockListSetting;
12-
import meteordevelopment.meteorclient.settings.Setting;
1312
import meteordevelopment.meteorclient.utils.misc.Names;
1413
import net.minecraft.block.Block;
1514
import net.minecraft.block.Blocks;
1615
import net.minecraft.registry.Registries;
1716
import net.minecraft.util.Identifier;
1817

19-
import java.util.List;
2018
import java.util.function.Predicate;
2119

2220
public class BlockListSettingScreen extends CollectionListSettingScreen<Block> {
23-
private static final Identifier ID = Identifier.of("minecraft", "");
24-
25-
public BlockListSettingScreen(GuiTheme theme, Setting<List<Block>> setting) {
21+
public BlockListSettingScreen(GuiTheme theme, BlockListSetting setting) {
2622
super(theme, "Select Blocks", setting, setting.get(), Registries.BLOCK);
2723
}
2824

2925
@Override
3026
protected boolean includeValue(Block value) {
27+
if (Registries.BLOCK.getId(value).getPath().endsWith("_wall_banner")) {
28+
return false;
29+
}
30+
3131
Predicate<Block> filter = ((BlockListSetting) setting).filter;
3232

3333
if (filter == null) return value != Blocks.AIR;
@@ -36,25 +36,22 @@ protected boolean includeValue(Block value) {
3636

3737
@Override
3838
protected WWidget getValueWidget(Block value) {
39-
return theme.itemWithLabel(value.asItem().getDefaultStack(), getValueName(value));
40-
}
41-
42-
@Override
43-
protected String getValueName(Block value) {
44-
return Names.get(value);
39+
return theme.itemWithLabel(value.asItem().getDefaultStack(), Names.get(value));
4540
}
4641

4742
@Override
48-
protected boolean skipValue(Block value) {
49-
return Registries.BLOCK.getId(value).getPath().endsWith("_wall_banner");
43+
protected String[] getValueNames(Block value) {
44+
return new String[]{
45+
Names.get(value),
46+
Registries.BLOCK.getId(value).toString()
47+
};
5048
}
5149

5250
@Override
5351
protected Block getAdditionalValue(Block value) {
5452
String path = Registries.BLOCK.getId(value).getPath();
5553
if (!path.endsWith("_banner")) return null;
5654

57-
((IdentifierAccessor) (Object) ID).meteor$setPath(path.substring(0, path.length() - 6) + "wall_banner");
58-
return Registries.BLOCK.get(ID);
55+
return Registries.BLOCK.get(Identifier.ofVanilla(path.substring(0, path.length() - 6) + "wall_banner"));
5956
}
6057
}

src/main/java/meteordevelopment/meteorclient/gui/screens/settings/DynamicRegistryListSettingScreen.java

Lines changed: 0 additions & 182 deletions
This file was deleted.

0 commit comments

Comments
 (0)