Add multi-select to Replay Viewer list (closes #354)

This commit is contained in:
Jonas Herzig
2020-09-04 23:41:01 +02:00
parent 6878cefadc
commit 9eb69375bd
3 changed files with 34 additions and 22 deletions

2
jGui

Submodule jGui updated: 7325494316...19bd7ec052

View File

@@ -43,7 +43,7 @@ public class GuiHandler extends EventRegistrations {
replayViewer.replaySpecificButtons.add(new GuiButton(replayViewer.editorButton).onClick(() -> { replayViewer.replaySpecificButtons.add(new GuiButton(replayViewer.editorButton).onClick(() -> {
if (Utils.ifMinimalModeDoPopup(replayViewer, () -> {})) return; if (Utils.ifMinimalModeDoPopup(replayViewer, () -> {})) return;
try { try {
new GuiEditReplay(replayViewer, replayViewer.list.getSelected().file.toPath()) { new GuiEditReplay(replayViewer, replayViewer.list.getSelected().get(0).file.toPath()) {
@Override @Override
protected void close() { protected void close() {
super.close(); super.close();

View File

@@ -72,15 +72,7 @@ import net.minecraft.text.TranslatableText;
public class GuiReplayViewer extends GuiScreen { public class GuiReplayViewer extends GuiScreen {
private final ReplayModReplay mod; private final ReplayModReplay mod;
public final GuiReplayList list = new GuiReplayList(this).onSelectionChanged(new Runnable() { public final GuiReplayList list = new GuiReplayList(this).onSelectionChanged(this::updateButtons).onSelectionDoubleClicked(() -> {
@Override
public void run() {
replaySpecificButtons.forEach(b -> b.setEnabled(list.getSelected() != null));
if (list.getSelected() != null && list.getSelected().incompatible) {
loadButton.setDisabled();
}
}
}).onSelectionDoubleClicked(() -> {
if (this.loadButton.isEnabled()) { if (this.loadButton.isEnabled()) {
this.loadButton.onClick(); this.loadButton.onClick();
} }
@@ -90,7 +82,7 @@ public class GuiReplayViewer extends GuiScreen {
@Override @Override
public void run() { public void run() {
try { try {
mod.startReplay(list.getSelected().file); mod.startReplay(list.getSelected().get(0).file);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
@@ -116,7 +108,7 @@ public class GuiReplayViewer extends GuiScreen {
public final GuiButton renameButton = new GuiButton().onClick(new Runnable() { public final GuiButton renameButton = new GuiButton().onClick(new Runnable() {
@Override @Override
public void run() { public void run() {
final File file = list.getSelected().file; final File file = list.getSelected().get(0).file;
String name = Utils.fileNameToReplayName(file.getName()); String name = Utils.fileNameToReplayName(file.getName());
final GuiTextField nameField = new GuiTextField().setSize(200, 20).setFocused(true).setText(name); final GuiTextField nameField = new GuiTextField().setSize(200, 20).setFocused(true).setText(name);
final GuiYesNoPopup popup = GuiYesNoPopup.open(GuiReplayViewer.this, final GuiYesNoPopup popup = GuiYesNoPopup.open(GuiReplayViewer.this,
@@ -172,10 +164,9 @@ public class GuiReplayViewer extends GuiScreen {
}); });
} }
}).setSize(73, 20).setI18nLabel("replaymod.gui.rename").setDisabled(); }).setSize(73, 20).setI18nLabel("replaymod.gui.rename").setDisabled();
public final GuiButton deleteButton = new GuiButton().onClick(new Runnable() { public final GuiButton deleteButton = new GuiButton().onClick(() -> {
@Override for (GuiReplayEntry entry : list.getSelected()) {
public void run() { String name = entry.name.getText();
String name = list.getSelected().name.getText();
GuiYesNoPopup popup = GuiYesNoPopup.open(GuiReplayViewer.this, GuiYesNoPopup popup = GuiYesNoPopup.open(GuiReplayViewer.this,
new GuiLabel().setI18nText("replaymod.gui.viewer.delete.linea").setColor(Colors.BLACK), 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) 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) { public void onSuccess(Boolean delete) {
if (delete) { if (delete) {
try { try {
FileUtils.forceDelete(list.getSelected().file); FileUtils.forceDelete(entry.file);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -215,7 +206,7 @@ public class GuiReplayViewer extends GuiScreen {
}).setSize(73, 20).setI18nLabel("replaymod.gui.cancel"); }).setSize(73, 20).setI18nLabel("replaymod.gui.cancel");
public final List<GuiButton> replaySpecificButtons = new ArrayList<>(); public final List<GuiButton> 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 editorButton = new GuiPanel();
public final GuiPanel upperButtonPanel = new GuiPanel().setLayout(new HorizontalLayout().setSpacing(5)) public final GuiPanel upperButtonPanel = new GuiPanel().setLayout(new HorizontalLayout().setSpacing(5))
@@ -253,6 +244,17 @@ public class GuiReplayViewer extends GuiScreen {
return mod; return mod;
} }
private void updateButtons() {
List<GuiReplayEntry> 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); private static final GuiImage DEFAULT_THUMBNAIL = new GuiImage().setTexture(Utils.DEFAULT_THUMBNAIL);
public static class GuiSelectReplayPopup extends AbstractGuiPopup<GuiSelectReplayPopup> { public static class GuiSelectReplayPopup extends AbstractGuiPopup<GuiSelectReplayPopup> {
@@ -281,10 +283,10 @@ public class GuiReplayViewer extends GuiScreen {
acceptButton.setEnabled(list.getSelected() != null); acceptButton.setEnabled(list.getSelected() != null);
}).onSelectionDoubleClicked(() -> { }).onSelectionDoubleClicked(() -> {
close(); close();
future.set(list.getSelected().file); future.set(list.getSelected().get(0).file);
}); });
acceptButton.onClick(() -> { acceptButton.onClick(() -> {
future.set(list.getSelected().file); future.set(list.getSelected().get(0).file);
close(); close();
}); });
cancelButton.onClick(() -> { cancelButton.onClick(() -> {
@@ -407,7 +409,17 @@ public class GuiReplayViewer extends GuiScreen {
load(); 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 scrollY(0); // ensure we scroll to top if most entries are filtered
return true; return true;
} }