From 6878cefadcd0c2e75a2d19b3f6b8cc755ce51a41 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 4 Sep 2020 22:58:10 +0200 Subject: [PATCH] Add type-to-filter functionality to Replay Viewer list --- .../replay/gui/screen/GuiReplayViewer.java | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) 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 c00321ef..32e6feda 100644 --- a/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java +++ b/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java @@ -4,7 +4,10 @@ import com.google.common.base.Supplier; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.SettableFuture; +import de.johni0702.minecraft.gui.GuiRenderer; +import de.johni0702.minecraft.gui.RenderInfo; import de.johni0702.minecraft.gui.versions.Image; +import net.minecraft.client.font.TextRenderer; import net.minecraft.util.Formatting; import com.replaymod.core.ReplayMod; import com.replaymod.core.SettingsRegistry; @@ -58,6 +61,7 @@ import java.util.Map; import java.util.Optional; import static com.replaymod.replay.ReplayModReplay.LOGGER; +import static de.johni0702.minecraft.gui.versions.MCVer.getFontRenderer; //#if MC>=11400 import net.minecraft.text.TranslatableText; @@ -329,6 +333,10 @@ public class GuiReplayViewer extends GuiScreen { public static class GuiReplayList extends AbstractGuiResourceLoadingList implements Typeable { private File folder = null; + // Not actually a child of this element, we just use it for text manipulation + private final GuiTextField filterTextField = new GuiTextField() + .setFocused(true); + public GuiReplayList(GuiContainer container) { super(container); } @@ -361,7 +369,15 @@ public class GuiReplayViewer extends GuiScreen { final ReplayMetaData metaData = replayFile.getMetaData(); if (metaData != null) { - results.consume(() -> new GuiReplayEntry(file, metaData, thumb)); + results.consume(() -> new GuiReplayEntry(file, metaData, thumb) { + @Override + public ReadableDimension calcMinSize() { + if (isFiltered(this)) { + return new Dimension(-4, -4); + } + return super.calcMinSize(); + } + }); } } catch (Exception e) { LOGGER.error("Could not load Replay File {}", file.getName(), e); @@ -374,6 +390,14 @@ public class GuiReplayViewer extends GuiScreen { this.folder = folder; } + private boolean isFiltered(GuiReplayEntry entry) { + String filter = filterTextField.getText().toLowerCase(); + if (filter.isEmpty()) { + return false; + } + return !entry.name.getText().toLowerCase().contains(filter); + } + @Override public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) { if (keyCode == Keyboard.KEY_F1) { @@ -382,9 +406,42 @@ public class GuiReplayViewer extends GuiScreen { reg.save(); load(); } + + if (filterTextField.typeKey(mousePosition, keyCode, keyChar, ctrlDown, shiftDown)) { + scrollY(0); // ensure we scroll to top if most entries are filtered + return true; + } + return false; } + @Override + public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { + super.draw(renderer, size, renderInfo); + + String filter = filterTextField.getText(); + if (!filter.isEmpty()) { + boolean anyMatches = getListPanel().calcMinSize().getHeight() > 0; + + TextRenderer fontRenderer = getFontRenderer(); + int filterTextWidth = fontRenderer.getWidth(filter); + int filterTextHeight = fontRenderer.fontHeight; + renderer.drawRect( + size.getWidth() - 3 - 2 - filterTextWidth - 2, + size.getHeight() - 3 - 2 - filterTextHeight - 2, + 2 + filterTextWidth + 2, + 2 + filterTextHeight + 2, + Colors.WHITE + ); + renderer.drawString( + size.getWidth() - 3 - 2 - filterTextWidth, + size.getHeight() - 3 - 2 - filterTextHeight, + anyMatches ? Colors.BLACK : Colors.DARK_RED, + filter + ); + } + } + @Override protected GuiReplayList getThis() { return this;