package com.replaymod.extras; import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.ReplayMod; import com.replaymod.replay.events.ReplayOpenedCallback; import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import de.johni0702.minecraft.gui.GuiRenderer; import de.johni0702.minecraft.gui.RenderInfo; import de.johni0702.minecraft.gui.container.GuiContainer; import de.johni0702.minecraft.gui.container.GuiPanel; import de.johni0702.minecraft.gui.element.GuiButton; import de.johni0702.minecraft.gui.element.GuiElement; import de.johni0702.minecraft.gui.element.GuiLabel; import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.GridLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.LayoutData; import de.johni0702.minecraft.gui.utils.EventRegistrations; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import net.minecraft.client.resource.language.I18n; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Map; public class HotkeyButtons extends EventRegistrations implements Extra { private ReplayMod mod; @Override public void register(ReplayMod mod) { this.mod = mod; register(); } { on(ReplayOpenedCallback.EVENT, replayHandler -> new Gui(mod, replayHandler.getOverlay())); } public static final class Gui { private final GuiButton toggleButton; private final GridLayout panelLayout; private final GuiPanel panel; private boolean open; public Gui(ReplayMod mod, GuiReplayOverlay overlay) { toggleButton = new GuiButton(overlay).setSize(20, 20) .setTexture(ReplayMod.TEXTURE, ReplayMod.TEXTURE_SIZE).setSpriteUV(0, 120) .onClick(new Runnable() { @Override public void run() { open = !open; } }); panel = new GuiPanel(overlay) { @Override public Collection getChildren() { return open ? super.getChildren() : Collections.emptyList(); } @Override public Map getElements() { return open ? super.getElements() : Collections.emptyMap(); } }.setLayout(panelLayout = new GridLayout().setSpacingX(5).setSpacingY(5).setColumns(1)); final KeyBindingRegistry keyBindingRegistry = mod.getKeyBindingRegistry(); keyBindingRegistry.getBindings().values().stream() .sorted(Comparator.comparing(it -> I18n.translate(it.name))) .forEachOrdered(keyBinding -> { GuiButton button = new GuiButton(){ @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { // There doesn't seem to be an KeyBindingUpdate event, so we'll just update it every time setLabel(keyBinding.getBoundKey()); super.draw(renderer, size, renderInfo); } }.onClick(keyBinding::trigger); panel.addElements(null, new GuiPanel().setSize(150, 20).setLayout(new HorizontalLayout().setSpacing(2)) .addElements(new HorizontalLayout.Data(0.5), new GuiPanel().setLayout(new CustomLayout() { @Override protected void layout(GuiPanel container, int width, int height) { size(button, width, height); } @Override public ReadableDimension calcMinSize(GuiContainer container) { return new Dimension(Math.max(10, button.getMinSize().getWidth()) + 10, 20); } }).addElements(null, button), new GuiLabel().setI18nText(keyBinding.name) )); }); overlay.setLayout(new CustomLayout(overlay.getLayout()) { @Override protected void layout(GuiReplayOverlay container, int width, int height) { panelLayout.setColumns(Math.max(1, (width - 10) / 155)); size(panel, panel.getMinSize()); pos(toggleButton, 5, height - 25); pos(panel, 5, y(toggleButton) - 5 - height(panel)); } }); } } }