Skip to content

Improve setting screen abstractions #5580

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ private void screenHandlerListW(WTable table, ScreenHandlerListSetting setting)

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

reset(table, setting, null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@
package meteordevelopment.meteorclient.gui.screens.settings;

import meteordevelopment.meteorclient.gui.GuiTheme;
import meteordevelopment.meteorclient.gui.WindowScreen;
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
import meteordevelopment.meteorclient.gui.widgets.containers.WTable;
import meteordevelopment.meteorclient.gui.widgets.input.WTextBox;
import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionMapSettingScreen;
import meteordevelopment.meteorclient.gui.widgets.WWidget;
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
import meteordevelopment.meteorclient.settings.BlockDataSetting;
import meteordevelopment.meteorclient.settings.IBlockData;
Expand All @@ -18,84 +17,48 @@
import meteordevelopment.meteorclient.utils.misc.ISerializable;
import meteordevelopment.meteorclient.utils.misc.Names;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.registry.Registries;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import org.jetbrains.annotations.Nullable;

import static meteordevelopment.meteorclient.MeteorClient.mc;

public class BlockDataSettingScreen extends WindowScreen {
private static final List<Block> BLOCKS = new ArrayList<>(100);

private final BlockDataSetting<?> setting;

private WTable table;
private String filterText = "";
public class BlockDataSettingScreen<T extends ICopyable<T> & ISerializable<T> & IChangeable & IBlockData<T>> extends CollectionMapSettingScreen<Block, T> {
private final BlockDataSetting<T> setting;

public BlockDataSettingScreen(GuiTheme theme, BlockDataSetting<?> setting) {
super(theme, "Configure Blocks");
public BlockDataSettingScreen(GuiTheme theme, BlockDataSetting<T> setting) {
super(theme, "Configure Blocks", setting, setting.get(), Registries.BLOCK);

this.setting = setting;
}

@Override
public void initWidgets() {
WTextBox filter = add(theme.textBox("")).minWidth(400).expandX().widget();
filter.setFocused(true);
filter.action = () -> {
filterText = filter.get().trim();

table.clear();
initTable();
};

table = add(theme.table()).expandX().widget();

initTable();
protected boolean includeValue(Block value) {
return value != Blocks.AIR;
}

@SuppressWarnings("unchecked")
public <T extends ICopyable<T> & ISerializable<T> & IChangeable & IBlockData<T>> void initTable() {
for (Block block : Registries.BLOCK) {
T blockData = (T) setting.get().get(block);

if (blockData != null && blockData.isChanged()) BLOCKS.addFirst(block);
else BLOCKS.add(block);
}

for (Block block : BLOCKS) {
String name = Names.get(block);
if (!StringUtils.containsIgnoreCase(name, filterText)) continue;

T blockData = (T) setting.get().get(block);

table.add(theme.itemWithLabel(block.asItem().getDefaultStack(), Names.get(block))).expandCellX();
table.add(theme.label((blockData != null && blockData.isChanged()) ? "*" : " "));

WButton edit = table.add(theme.button(GuiRenderer.EDIT)).widget();
edit.action = () -> {
T data = blockData;
if (data == null) data = (T) setting.defaultData.get().copy();

mc.setScreen(data.createScreen(theme, block, (BlockDataSetting<T>) setting));
};

WButton reset = table.add(theme.button(GuiRenderer.RESET)).widget();
reset.action = () -> {
setting.get().remove(block);
setting.onChanged();
@Override
protected WWidget getValueWidget(Block block) {
return theme.itemWithLabel(block.asItem().getDefaultStack(), Names.get(block));
}

if (blockData != null && blockData.isChanged()) {
table.clear();
initTable();
}
};
@Override
protected WWidget getDataWidget(Block block, @Nullable T blockData) {
WButton edit = theme.button(GuiRenderer.EDIT);
edit.action = () -> {
T data = blockData;
if (data == null) data = setting.defaultData.get().copy();

table.row();
}
mc.setScreen(data.createScreen(theme, block, setting));
};
return edit;
}

BLOCKS.clear();
@Override
protected String[] getValueNames(Block block) {
return new String[]{
Names.get(block),
Registries.BLOCK.getId(block).toString()
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,28 @@
package meteordevelopment.meteorclient.gui.screens.settings;

import meteordevelopment.meteorclient.gui.GuiTheme;
import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen;
import meteordevelopment.meteorclient.gui.widgets.WWidget;
import meteordevelopment.meteorclient.mixin.IdentifierAccessor;
import meteordevelopment.meteorclient.settings.BlockListSetting;
import meteordevelopment.meteorclient.settings.Setting;
import meteordevelopment.meteorclient.utils.misc.Names;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.registry.Registries;
import net.minecraft.util.Identifier;

import java.util.List;
import java.util.function.Predicate;

public class BlockListSettingScreen extends CollectionListSettingScreen<Block> {
private static final Identifier ID = Identifier.of("minecraft", "");

public BlockListSettingScreen(GuiTheme theme, Setting<List<Block>> setting) {
public BlockListSettingScreen(GuiTheme theme, BlockListSetting setting) {
super(theme, "Select Blocks", setting, setting.get(), Registries.BLOCK);
}

@Override
protected boolean includeValue(Block value) {
if (Registries.BLOCK.getId(value).getPath().endsWith("_wall_banner")) {
return false;
}

Predicate<Block> filter = ((BlockListSetting) setting).filter;

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

@Override
protected WWidget getValueWidget(Block value) {
return theme.itemWithLabel(value.asItem().getDefaultStack(), getValueName(value));
}

@Override
protected String getValueName(Block value) {
return Names.get(value);
return theme.itemWithLabel(value.asItem().getDefaultStack(), Names.get(value));
}

@Override
protected boolean skipValue(Block value) {
return Registries.BLOCK.getId(value).getPath().endsWith("_wall_banner");
protected String[] getValueNames(Block value) {
return new String[]{
Names.get(value),
Registries.BLOCK.getId(value).toString()
};
}

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

((IdentifierAccessor) (Object) ID).setPath(path.substring(0, path.length() - 6) + "wall_banner");
return Registries.BLOCK.get(ID);
return Registries.BLOCK.get(Identifier.ofVanilla(path.substring(0, path.length() - 6) + "wall_banner"));
}
}

This file was deleted.

Loading