From 9eb69375bddf81f556c6e1de9d463fe0fbf3be97 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 4 Sep 2020 23:41:01 +0200 Subject: [PATCH] Add multi-select to Replay Viewer list (closes #354) --- jGui | 2 +- .../replaymod/editor/handler/GuiHandler.java | 2 +- .../replay/gui/screen/GuiReplayViewer.java | 52 ++++++++++++------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/jGui b/jGui index 73254943..19bd7ec0 160000 --- a/jGui +++ b/jGui @@ -1 +1 @@ -Subproject commit 73254943162bc62821eece049fb1299c9ff89fc7 +Subproject commit 19bd7ec052c98698ca0fec4f9abe6105f2369a99 diff --git a/src/main/java/com/replaymod/editor/handler/GuiHandler.java b/src/main/java/com/replaymod/editor/handler/GuiHandler.java index 599da527..7f5f4727 100644 --- a/src/main/java/com/replaymod/editor/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/editor/handler/GuiHandler.java @@ -43,7 +43,7 @@ public class GuiHandler extends EventRegistrations { replayViewer.replaySpecificButtons.add(new GuiButton(replayViewer.editorButton).onClick(() -> { if (Utils.ifMinimalModeDoPopup(replayViewer, () -> {})) return; try { - new GuiEditReplay(replayViewer, replayViewer.list.getSelected().file.toPath()) { + new GuiEditReplay(replayViewer, replayViewer.list.getSelected().get(0).file.toPath()) { @Override protected void close() { super.close(); diff --git a/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java b/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java index 32e6feda..162469ab 100644 --- a/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java +++ b/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java @@ -72,15 +72,7 @@ import net.minecraft.text.TranslatableText; public class GuiReplayViewer extends GuiScreen { private final ReplayModReplay mod; - public final GuiReplayList list = new GuiReplayList(this).onSelectionChanged(new Runnable() { - @Override - public void run() { - replaySpecificButtons.forEach(b -> b.setEnabled(list.getSelected() != null)); - if (list.getSelected() != null && list.getSelected().incompatible) { - loadButton.setDisabled(); - } - } - }).onSelectionDoubleClicked(() -> { + public final GuiReplayList list = new GuiReplayList(this).onSelectionChanged(this::updateButtons).onSelectionDoubleClicked(() -> { if (this.loadButton.isEnabled()) { this.loadButton.onClick(); } @@ -90,7 +82,7 @@ public class GuiReplayViewer extends GuiScreen { @Override public void run() { try { - mod.startReplay(list.getSelected().file); + mod.startReplay(list.getSelected().get(0).file); } catch (IOException e) { e.printStackTrace(); } finally { @@ -116,7 +108,7 @@ public class GuiReplayViewer extends GuiScreen { public final GuiButton renameButton = new GuiButton().onClick(new Runnable() { @Override public void run() { - final File file = list.getSelected().file; + final File file = list.getSelected().get(0).file; String name = Utils.fileNameToReplayName(file.getName()); final GuiTextField nameField = new GuiTextField().setSize(200, 20).setFocused(true).setText(name); final GuiYesNoPopup popup = GuiYesNoPopup.open(GuiReplayViewer.this, @@ -172,10 +164,9 @@ public class GuiReplayViewer extends GuiScreen { }); } }).setSize(73, 20).setI18nLabel("replaymod.gui.rename").setDisabled(); - public final GuiButton deleteButton = new GuiButton().onClick(new Runnable() { - @Override - public void run() { - String name = list.getSelected().name.getText(); + public final GuiButton deleteButton = new GuiButton().onClick(() -> { + for (GuiReplayEntry entry : list.getSelected()) { + String name = entry.name.getText(); GuiYesNoPopup popup = GuiYesNoPopup.open(GuiReplayViewer.this, new GuiLabel().setI18nText("replaymod.gui.viewer.delete.linea").setColor(Colors.BLACK), new GuiLabel().setI18nText("replaymod.gui.viewer.delete.lineb", name + Formatting.RESET).setColor(Colors.BLACK) @@ -185,7 +176,7 @@ public class GuiReplayViewer extends GuiScreen { public void onSuccess(Boolean delete) { if (delete) { try { - FileUtils.forceDelete(list.getSelected().file); + FileUtils.forceDelete(entry.file); } catch (IOException e) { e.printStackTrace(); } @@ -215,7 +206,7 @@ public class GuiReplayViewer extends GuiScreen { }).setSize(73, 20).setI18nLabel("replaymod.gui.cancel"); public final List replaySpecificButtons = new ArrayList<>(); - { replaySpecificButtons.addAll(Arrays.asList(loadButton, renameButton, deleteButton)); } + { replaySpecificButtons.addAll(Arrays.asList(loadButton, renameButton)); } public final GuiPanel editorButton = new GuiPanel(); public final GuiPanel upperButtonPanel = new GuiPanel().setLayout(new HorizontalLayout().setSpacing(5)) @@ -253,6 +244,17 @@ public class GuiReplayViewer extends GuiScreen { return mod; } + private void updateButtons() { + List selected = list.getSelected(); + int count = selected.size(); + + replaySpecificButtons.forEach(b -> b.setEnabled(count == 1)); + deleteButton.setEnabled(count > 0); + if (count == 1 && selected.get(0).incompatible) { + loadButton.setDisabled(); + } + } + private static final GuiImage DEFAULT_THUMBNAIL = new GuiImage().setTexture(Utils.DEFAULT_THUMBNAIL); public static class GuiSelectReplayPopup extends AbstractGuiPopup { @@ -281,10 +283,10 @@ public class GuiReplayViewer extends GuiScreen { acceptButton.setEnabled(list.getSelected() != null); }).onSelectionDoubleClicked(() -> { close(); - future.set(list.getSelected().file); + future.set(list.getSelected().get(0).file); }); acceptButton.onClick(() -> { - future.set(list.getSelected().file); + future.set(list.getSelected().get(0).file); close(); }); cancelButton.onClick(() -> { @@ -407,7 +409,17 @@ public class GuiReplayViewer extends GuiScreen { load(); } - if (filterTextField.typeKey(mousePosition, keyCode, keyChar, ctrlDown, shiftDown)) { + boolean filterHasPriority = !filterTextField.getText().isEmpty(); + if (filterHasPriority && filterTextField.typeKey(mousePosition, keyCode, keyChar, ctrlDown, shiftDown)) { + scrollY(0); // ensure we scroll to top if most entries are filtered + return true; + } + + if (super.typeKey(mousePosition, keyCode, keyChar, ctrlDown, shiftDown)) { + return true; + } + + if (!filterHasPriority && filterTextField.typeKey(mousePosition, keyCode, keyChar, ctrlDown, shiftDown)) { scrollY(0); // ensure we scroll to top if most entries are filtered return true; }