Position recording control buttons relative to Exit (fixes #281)

This commit is contained in:
Jonas Herzig
2020-07-25 18:43:33 +02:00
parent 35cc78c70c
commit a4b6e92627
2 changed files with 66 additions and 21 deletions

View File

@@ -42,6 +42,12 @@ import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.AbstractButtonWidget;
import java.util.concurrent.CompletableFuture;
//#if MC>=11600
//$$ import net.minecraft.text.TranslatableText;
//#else
import net.minecraft.client.resource.language.I18n;
//#endif
//#else
//$$ import com.google.common.util.concurrent.FutureCallback;
//$$ import com.google.common.util.concurrent.Futures;
@@ -119,6 +125,7 @@ import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.function.Consumer;
import java.util.Optional;
/**
* Abstraction over things that have changed between different MC versions.
@@ -603,6 +610,31 @@ public class MCVer {
//#endif
}
//#if MC>=11400
public static Optional<AbstractButtonWidget> findButton(List<AbstractButtonWidget> buttonList, @SuppressWarnings("unused") String text, @SuppressWarnings("unused") int id) {
//#if MC>=11600
//$$ final TranslatableText message = new TranslatableText(text);
//#else
final String message = I18n.translate(text);
//#endif
for (AbstractButtonWidget b : buttonList) {
if (message.equals(b.getMessage())) {
return Optional.of(b);
}
}
return Optional.empty();
}
//#else
//$$ public static Optional<GuiButton> findButton(List<GuiButton> buttonList, @SuppressWarnings("unused") String text, int id) {
//$$ for (GuiButton b : buttonList) {
//$$ if (b.id == id) {
//$$ return Optional.of(b);
//$$ }
//$$ }
//$$ return Optional.empty();
//$$ }
//#endif
//#if MC>=11400
public static void processKeyBinds() {
((MinecraftMethodAccessor) getMinecraft()).replayModProcessKeyBinds();

View File

@@ -7,13 +7,13 @@ import com.replaymod.editor.gui.MarkerProcessor;
import com.replaymod.recording.Setting;
import com.replaymod.recording.packet.PacketListener;
import de.johni0702.minecraft.gui.container.GuiPanel;
import de.johni0702.minecraft.gui.container.GuiScreen;
import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
import de.johni0702.minecraft.gui.element.GuiButton;
import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.gui.screen.GameMenuScreen;
import net.minecraft.client.gui.screen.Screen;
//#if FABRIC>=1
import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
@@ -25,6 +25,14 @@ import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
//$$ import static com.replaymod.core.versions.MCVer.getGui;
//#endif
//#if MC>=11400
import net.minecraft.client.gui.widget.AbstractButtonWidget;
//#endif
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
public class GuiRecordingControls extends EventRegistrations {
private ReplayMod core;
private PacketListener packetListener;
@@ -70,21 +78,6 @@ public class GuiRecordingControls extends EventRegistrations {
updateState();
}
//#if FABRIC>=1
{ on(InitScreenCallback.EVENT, (screen, buttons) -> {
if (screen instanceof GameMenuScreen) {
show((GameMenuScreen) screen);
}
}); }
//#else
//$$ @SubscribeEvent
//$$ public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) {
//$$ if (getGui(event) instanceof IngameMenuScreen) {
//$$ show((IngameMenuScreen) getGui(event));
//$$ }
//$$ }
//#endif
private void updateState() {
buttonPauseResume.setI18nLabel("replaymod.gui.recording." + (paused ? "resume" : "pause"));
buttonStartStop.setI18nLabel("replaymod.gui.recording." + (stopped ? "start" : "stop"));
@@ -92,12 +85,32 @@ public class GuiRecordingControls extends EventRegistrations {
buttonPauseResume.setEnabled(!stopped);
}
public void show(GameMenuScreen gui) {
int modMenuOffset = MCVer.isModLoaded("modmenu") ? 12 : 0;
VanillaGuiScreen.setup(gui).setLayout(new CustomLayout<GuiScreen>() {
//#if FABRIC>=1
{ on(InitScreenCallback.EVENT, this::injectIntoIngameMenu); }
private void injectIntoIngameMenu(Screen guiScreen, List<AbstractButtonWidget> buttonList) {
//#else
//$$ @SubscribeEvent
//$$ public void injectIntoIngameMenu(GuiScreenEvent.InitGuiEvent.Post event) {
//$$ Screen guiScreen = getGui(event);
//#if MC>=11400
//$$ List<Widget> buttonList = MCVer.getButtonList(event);
//#else
//$$ List<net.minecraft.client.gui.GuiButton> buttonList = MCVer.getButtonList(event);
//#endif
//#endif
if (!(guiScreen instanceof GameMenuScreen)) {
return;
}
Function<Integer, Integer> yPos =
MCVer.findButton(buttonList, "menu.returnToMenu", 1)
.map(Optional::of)
.orElse(MCVer.findButton(buttonList, "menu.disconnect", 1))
.<Function<Integer, Integer>>map(it -> (height) -> it.y)
.orElse((height) -> height / 4 + 120 - 16);
VanillaGuiScreen.setup(guiScreen).setLayout(new CustomLayout<de.johni0702.minecraft.gui.container.GuiScreen>() {
@Override
protected void layout(GuiScreen container, int width, int height) {
pos(panel, width / 2 - 100, height / 4 + 128 + modMenuOffset);
protected void layout(de.johni0702.minecraft.gui.container.GuiScreen container, int width, int height) {
pos(panel, width / 2 - 100, yPos.apply(height) + 16 + 8);
}
}).addElements(null, panel);
}