diff options
author | isXander <xandersmith2008@gmail.com> | 2023-08-14 23:27:45 +0100 |
---|---|---|
committer | isXander <xandersmith2008@gmail.com> | 2023-08-14 23:27:45 +0100 |
commit | b3355266572deef1a5c3e494ad162c592383e455 (patch) | |
tree | 876510a21e27d0052cb7a1501c0295a427c9dc3c /common/src/main/java/dev/isxander/yacl3/gui | |
parent | d37e147dbb4db44a921533b572aed3e54b5c6a42 (diff) | |
download | YetAnotherConfigLib-b3355266572deef1a5c3e494ad162c592383e455.tar.gz YetAnotherConfigLib-b3355266572deef1a5c3e494ad162c592383e455.tar.bz2 YetAnotherConfigLib-b3355266572deef1a5c3e494ad162c592383e455.zip |
More-or-less complete API for YACL auto-gen
Diffstat (limited to 'common/src/main/java/dev/isxander/yacl3/gui')
-rw-r--r-- | common/src/main/java/dev/isxander/yacl3/gui/controllers/string/StringControllerElement.java | 44 | ||||
-rw-r--r-- | common/src/main/java/dev/isxander/yacl3/gui/utils/UndoRedoHelper.java | 42 |
2 files changed, 81 insertions, 5 deletions
diff --git a/common/src/main/java/dev/isxander/yacl3/gui/controllers/string/StringControllerElement.java b/common/src/main/java/dev/isxander/yacl3/gui/controllers/string/StringControllerElement.java index 86cc7bd..383e188 100644 --- a/common/src/main/java/dev/isxander/yacl3/gui/controllers/string/StringControllerElement.java +++ b/common/src/main/java/dev/isxander/yacl3/gui/controllers/string/StringControllerElement.java @@ -5,6 +5,7 @@ import dev.isxander.yacl3.api.utils.Dimension; import dev.isxander.yacl3.gui.YACLScreen; import dev.isxander.yacl3.gui.controllers.ControllerWidget; import dev.isxander.yacl3.gui.utils.GuiUtils; +import dev.isxander.yacl3.gui.utils.UndoRedoHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; @@ -21,9 +22,10 @@ public class StringControllerElement extends ControllerWidget<IStringController< protected int caretPos; protected int selectionLength; - protected int renderOffset; + protected UndoRedoHelper undoRedoHelper; + protected float ticks; private final Component emptyText; @@ -35,7 +37,9 @@ public class StringControllerElement extends ControllerWidget<IStringController< inputFieldFocused = false; selectionLength = 0; emptyText = Component.literal("Click to type...").withStyle(ChatFormatting.GRAY); - control.option().addListener((opt, val) -> inputField = control.getString()); + control.option().addListener((opt, val) -> { + inputField = control.getString(); + }); setDimension(dim); } @@ -109,6 +113,10 @@ public class StringControllerElement extends ControllerWidget<IStringController< selectionLength = 0; } +// if (undoRedoHelper == null) { +// undoRedoHelper = new UndoRedoHelper(inputField, caretPos, selectionLength); +// } + return true; } else { inputFieldFocused = false; @@ -187,12 +195,26 @@ public class StringControllerElement extends ControllerWidget<IStringController< doDelete(); return true; } +// case InputConstants.KEY_Z -> { +// if (Screen.hasControlDown()) { +// UndoRedoHelper.FieldState updated = Screen.hasShiftDown() ? undoRedoHelper.redo() : undoRedoHelper.undo(); +// if (updated != null) { +// System.out.println("Updated: " + updated); +// if (modifyInput(builder -> builder.replace(0, inputField.length(), updated.text()))) { +// caretPos = updated.cursorPos(); +// selectionLength = updated.selectionLength(); +// checkRenderOffset(); +// } +// } +// return true; +// } +// } } if (Screen.isPaste(keyCode)) { return doPaste(); } else if (Screen.isCopy(keyCode)) { - return doCopy(); + return doCopy(); } else if (Screen.isCut(keyCode)) { return doCut(); } else if (Screen.isSelectAll(keyCode)) { @@ -204,6 +226,7 @@ public class StringControllerElement extends ControllerWidget<IStringController< protected boolean doPaste() { this.write(client.keyboardHandler.getClipboard()); + updateUndoHistory(); return true; } @@ -219,6 +242,7 @@ public class StringControllerElement extends ControllerWidget<IStringController< if (selectionLength != 0) { client.keyboardHandler.setClipboard(getSelection()); this.write(""); + updateUndoHistory(); return true; } return false; @@ -255,9 +279,13 @@ public class StringControllerElement extends ControllerWidget<IStringController< if (!inputFieldFocused) return false; - write(Character.toString(chr)); + if (!Screen.hasControlDown()) { + write(Character.toString(chr)); + updateUndoHistory(); + return true; + } - return true; + return false; } protected void doBackspace() { @@ -269,6 +297,7 @@ public class StringControllerElement extends ControllerWidget<IStringController< checkRenderOffset(); } } + updateUndoHistory(); } protected void doDelete() { @@ -277,6 +306,7 @@ public class StringControllerElement extends ControllerWidget<IStringController< } else if (caretPos < inputField.length()) { modifyInput(builder -> builder.deleteCharAt(caretPos)); } + updateUndoHistory(); } public void write(String string) { @@ -308,6 +338,10 @@ public class StringControllerElement extends ControllerWidget<IStringController< return true; } + protected void updateUndoHistory() { +// undoRedoHelper.save(inputField, caretPos, selectionLength); + } + public int getUnshiftedLength() { if (optionNameString.isEmpty()) return getDimension().width() - getXPadding() * 2; diff --git a/common/src/main/java/dev/isxander/yacl3/gui/utils/UndoRedoHelper.java b/common/src/main/java/dev/isxander/yacl3/gui/utils/UndoRedoHelper.java new file mode 100644 index 0000000..3328c16 --- /dev/null +++ b/common/src/main/java/dev/isxander/yacl3/gui/utils/UndoRedoHelper.java @@ -0,0 +1,42 @@ +package dev.isxander.yacl3.gui.utils; + +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class UndoRedoHelper { + private final List<FieldState> history = new ArrayList<>(); + private int index = 0; + + public UndoRedoHelper(String text, int cursorPos, int selectionLength) { + history.add(new FieldState(text, cursorPos, selectionLength)); + } + + public void save(String text, int cursorPos, int selectionLength) { + int max = history.size(); + history.subList(index, max).clear(); + history.add(new FieldState(text, cursorPos, selectionLength)); + index++; + } + + public @Nullable FieldState undo() { + index--; + index = Math.max(index, 0); + + if (history.isEmpty()) + return null; + return history.get(index); + } + + public @Nullable FieldState redo() { + if (index < history.size() - 1) { + index++; + return history.get(index); + } else { + return null; + } + } + + public record FieldState(String text, int cursorPos, int selectionLength) {} +} |