diff options
author | Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> | 2023-07-04 10:19:20 +0800 |
---|---|---|
committer | Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> | 2023-07-17 12:55:25 +0800 |
commit | 2129c4d2284a4f78d94e74b3e328b8e056607fe9 (patch) | |
tree | 5f435634af47a4706ebb4ee5eabf860f26007f76 /src/main/java/me/xmrvizzy | |
parent | bcf2b072a0d3a868bad745228a88ec18b37ae471 (diff) | |
download | Skyblocker-2129c4d2284a4f78d94e74b3e328b8e056607fe9.tar.gz Skyblocker-2129c4d2284a4f78d94e74b3e328b8e056607fe9.tar.bz2 Skyblocker-2129c4d2284a4f78d94e74b3e328b8e056607fe9.zip |
Refactor ShortcutsConfigListWidget
Diffstat (limited to 'src/main/java/me/xmrvizzy')
3 files changed, 61 insertions, 49 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 903d3992..13272323 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -30,6 +30,8 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.Map; + @Mixin(HandledScreen.class) public abstract class HandledScreenMixin extends Screen { protected HandledScreenMixin(Text title) { @@ -96,7 +98,7 @@ public abstract class HandledScreenMixin extends Screen { superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY); } else if (experimentSolver instanceof UltrasequencerSolver ultrasequencerSolver && slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot()) { int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1; - ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().ifPresentOrElse((entry) -> ultrasequencerSolver.setUltrasequencerNextSlot(entry.getKey()), () -> ultrasequencerSolver.setState(ExperimentSolver.State.END)); + ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().map(Map.Entry::getKey).ifPresentOrElse(ultrasequencerSolver::setUltrasequencerNextSlot, () -> ultrasequencerSolver.setState(ExperimentSolver.State.END)); } } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java index 9fe30a87..f29470bf 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java @@ -11,32 +11,28 @@ import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; +import java.util.stream.Stream; public class ShortcutsConfigListWidget extends ElementListWidget<ShortcutsConfigListWidget.AbstractShortcutEntry> { private final ShortcutsConfigScreen screen; - protected final List<ShortcutCategoryEntry> categories; + private final List<Map<String, String>> shortcutMaps = new ArrayList<>(); public ShortcutsConfigListWidget(MinecraftClient minecraftClient, ShortcutsConfigScreen screen, int width, int height, int top, int bottom, int itemHeight) { super(minecraftClient, width, height, top, bottom, itemHeight); this.screen = screen; - ShortcutCategoryEntry commandCategory = new ShortcutCategoryEntry("skyblocker.shortcuts.command.target", "skyblocker.shortcuts.command.replacement"); - addEntry(commandCategory); - if (!Shortcuts.isShortcutsLoaded()) { - addEntry(new ShortcutLoadingEntry()); + ShortcutCategoryEntry commandCategory = new ShortcutCategoryEntry(Shortcuts.commands, "skyblocker.shortcuts.command.target", "skyblocker.shortcuts.command.replacement"); + if (Shortcuts.isShortcutsLoaded()) { + commandCategory.shortcutsMap.keySet().stream().sorted().forEach(commandTarget -> addEntry(new ShortcutEntry(commandCategory, commandTarget))); } else { - Shortcuts.commands.keySet().stream().sorted().forEach(commandTarget -> addEntry(new ShortcutEntry(commandCategory, commandTarget, Shortcuts.commands.get(commandTarget)))); - } - ShortcutCategoryEntry commandArgCategory = new ShortcutCategoryEntry("skyblocker.shortcuts.commandArg.target", "skyblocker.shortcuts.commandArg.replacement", "skyblocker.shortcuts.commandArg.tooltip"); - addEntry(commandArgCategory); - if (!Shortcuts.isShortcutsLoaded()) { addEntry(new ShortcutLoadingEntry()); + } + ShortcutCategoryEntry commandArgCategory = new ShortcutCategoryEntry(Shortcuts.commandArgs, "skyblocker.shortcuts.commandArg.target", "skyblocker.shortcuts.commandArg.replacement", "skyblocker.shortcuts.commandArg.tooltip"); + if (Shortcuts.isShortcutsLoaded()) { + commandArgCategory.shortcutsMap.keySet().stream().sorted().forEach(commandArgTarget -> addEntry(new ShortcutEntry(commandArgCategory, commandArgTarget))); } else { - Shortcuts.commandArgs.keySet().stream().sorted().forEach(commandArgTarget -> addEntry(new ShortcutEntry(commandArgCategory, commandArgTarget, Shortcuts.commandArgs.get(commandArgTarget)))); + addEntry(new ShortcutLoadingEntry()); } - categories = List.of(commandCategory, commandArgCategory); } @Override @@ -58,14 +54,6 @@ public class ShortcutsConfigListWidget extends ElementListWidget<ShortcutsConfig return Optional.empty(); } - protected Map<String, String> getShortcutsMap(ShortcutCategoryEntry category) { - return switch (categories.indexOf(category)) { - case 0 -> Shortcuts.commands; - case 1 -> Shortcuts.commandArgs; - default -> throw new IllegalStateException("Unexpected category: " + category); - }; - } - @Override public void setSelected(@Nullable ShortcutsConfigListWidget.AbstractShortcutEntry entry) { super.setSelected(entry); @@ -81,39 +69,46 @@ public class ShortcutsConfigListWidget extends ElementListWidget<ShortcutsConfig return super.removeEntry(entry); } + protected boolean hasChanges() { + ShortcutEntry[] notEmptyShortcuts = getNotEmptyShortcuts().toArray(ShortcutEntry[]::new); + return notEmptyShortcuts.length != shortcutMaps.stream().mapToInt(Map::size).sum() || Arrays.stream(notEmptyShortcuts).anyMatch(ShortcutEntry::isChanged); + } + protected void saveShortcuts() { - for (ShortcutCategoryEntry category : categories) { - getShortcutsMap(category).clear(); - } - for (AbstractShortcutEntry entry : children()) { - if (entry instanceof ShortcutEntry shortcutEntry && !shortcutEntry.target.getText().isEmpty() && !shortcutEntry.replacement.getText().isEmpty()) { - getShortcutsMap(shortcutEntry.category).put(shortcutEntry.target.getText(), shortcutEntry.replacement.getText()); - } - } + shortcutMaps.forEach(Map::clear); + getNotEmptyShortcuts().forEach(ShortcutEntry::save); Shortcuts.saveShortcuts(MinecraftClient.getInstance()); // Save shortcuts to disk } + private Stream<ShortcutEntry> getNotEmptyShortcuts() { + return children().stream().filter(ShortcutEntry.class::isInstance).map(ShortcutEntry.class::cast).filter(ShortcutEntry::isNotEmpty); + } + protected static abstract class AbstractShortcutEntry extends ElementListWidget.Entry<AbstractShortcutEntry> { } - protected class ShortcutCategoryEntry extends AbstractShortcutEntry { + private class ShortcutCategoryEntry extends AbstractShortcutEntry { + private final Map<String, String> shortcutsMap; private final Text targetName; private final Text replacementName; @Nullable private final Text tooltip; - private ShortcutCategoryEntry(String targetName, String replacementName) { - this(targetName, replacementName, (Text) null); + private ShortcutCategoryEntry(Map<String, String> shortcutsMap, String targetName, String replacementName) { + this(shortcutsMap, targetName, replacementName, (Text) null); } - private ShortcutCategoryEntry(String targetName, String replacementName, String tooltip) { - this(targetName, replacementName, Text.translatable(tooltip)); + private ShortcutCategoryEntry(Map<String, String> shortcutsMap, String targetName, String replacementName, String tooltip) { + this(shortcutsMap, targetName, replacementName, Text.translatable(tooltip)); } - private ShortcutCategoryEntry(String targetName, String replacementName, @Nullable Text tooltip) { + private ShortcutCategoryEntry(Map<String, String> shortcutsMap, String targetName, String replacementName, @Nullable Text tooltip) { + this.shortcutsMap = shortcutsMap; this.targetName = Text.translatable(targetName); this.replacementName = Text.translatable(replacementName); this.tooltip = tooltip; + shortcutMaps.add(shortcutsMap); + addEntry(this); } @Override @@ -181,24 +176,29 @@ public class ShortcutsConfigListWidget extends ElementListWidget<ShortcutsConfig protected class ShortcutEntry extends AbstractShortcutEntry { private final List<TextFieldWidget> children; - protected final ShortcutCategoryEntry category; - protected final TextFieldWidget target; - protected final TextFieldWidget replacement; + private final ShortcutCategoryEntry category; + private final TextFieldWidget target; + private final TextFieldWidget replacement; - protected ShortcutEntry(ShortcutCategoryEntry category) { - this(category, "", ""); + private ShortcutEntry(ShortcutCategoryEntry category) { + this(category, ""); } - private ShortcutEntry(ShortcutCategoryEntry category, String targetString, String replacementString) { + private ShortcutEntry(ShortcutCategoryEntry category, String targetString) { this.category = category; target = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, width / 2 - 160, 5, 150, 20, category.targetName); replacement = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, width / 2 + 10, 5, 150, 20, category.replacementName); target.setText(targetString); - replacement.setText(replacementString); + replacement.setText(category.shortcutsMap.getOrDefault(targetString, "")); children = List.of(target, replacement); } @Override + public String toString() { + return target.getText() + " → " + replacement.getText(); + } + + @Override public List<? extends Element> children() { return children; } @@ -208,6 +208,18 @@ public class ShortcutsConfigListWidget extends ElementListWidget<ShortcutsConfig return children; } + private boolean isNotEmpty() { + return !target.getText().isEmpty() && !replacement.getText().isEmpty(); + } + + private boolean isChanged() { + return !category.shortcutsMap.containsKey(target.getText()) || !category.shortcutsMap.get(target.getText()).equals(replacement.getText()); + } + + private void save() { + category.shortcutsMap.put(target.getText(), replacement.getText()); + } + @Override public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { target.setY(y); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java index 49511068..dec23d36 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java @@ -17,7 +17,6 @@ public class ShortcutsConfigScreen extends Screen { private ButtonWidget buttonNew; private ButtonWidget buttonDone; private boolean initialized; - private boolean saved; private double scrollAmount; public ShortcutsConfigScreen() { @@ -45,7 +44,7 @@ public class ShortcutsConfigScreen extends Screen { buttonDelete = ButtonWidget.builder(Text.translatable("selectServer.delete"), button -> { if (client != null && shortcutsConfigListWidget.getSelectedOrNull() instanceof ShortcutsConfigListWidget.ShortcutEntry shortcutEntry) { scrollAmount = shortcutsConfigListWidget.getScrollAmount(); - client.setScreen(new ConfirmScreen(this::deleteEntry, Text.translatable("skyblocker.shortcuts.deleteQuestion"), Text.translatable("skyblocker.shortcuts.deleteWarning", shortcutEntry.target.getText() + " → " + shortcutEntry.replacement.getText()), Text.translatable("selectServer.deleteButton"), ScreenTexts.CANCEL)); + client.setScreen(new ConfirmScreen(this::deleteEntry, Text.translatable("skyblocker.shortcuts.deleteQuestion"), Text.translatable("skyblocker.shortcuts.deleteWarning", shortcutEntry), Text.translatable("selectServer.deleteButton"), ScreenTexts.CANCEL)); } }).build(); adder.add(buttonDelete); @@ -58,7 +57,6 @@ public class ShortcutsConfigScreen extends Screen { }).build()); buttonDone = ButtonWidget.builder(ScreenTexts.DONE, button -> { shortcutsConfigListWidget.saveShortcuts(); - saved = true; if (client != null) { close(); } @@ -88,7 +86,7 @@ public class ShortcutsConfigScreen extends Screen { @Override public void close() { - if (!saved && client != null) { + if (client != null && shortcutsConfigListWidget.hasChanges()) { client.setScreen(new ConfirmScreen(confirmedAction -> { if (confirmedAction) { super.close(); |