aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2023-07-04 10:19:20 +0800
committerKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2023-07-17 12:55:25 +0800
commit2129c4d2284a4f78d94e74b3e328b8e056607fe9 (patch)
tree5f435634af47a4706ebb4ee5eabf860f26007f76 /src/main/java
parentbcf2b072a0d3a868bad745228a88ec18b37ae471 (diff)
downloadSkyblocker-2129c4d2284a4f78d94e74b3e328b8e056607fe9.tar.gz
Skyblocker-2129c4d2284a4f78d94e74b3e328b8e056607fe9.tar.bz2
Skyblocker-2129c4d2284a4f78d94e74b3e328b8e056607fe9.zip
Refactor ShortcutsConfigListWidget
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java100
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java6
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();