From ab7256dff5d6d37488081ba7a01b36d3ee9ef563 Mon Sep 17 00:00:00 2001 From: DeDiamondPro <67508414+DeDiamondPro@users.noreply.github.com> Date: Sun, 5 Jun 2022 17:43:23 +0200 Subject: refactor (#36) * refactor * fix vig compat * fix nanovg thingy * e * finalize * gui utils package thingy --- .../cc/polyfrost/oneconfig/utils/gui/GuiUtils.java | 63 +++++++++ .../polyfrost/oneconfig/utils/gui/OneUIScreen.java | 147 +++++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 src/main/java/cc/polyfrost/oneconfig/utils/gui/GuiUtils.java create mode 100644 src/main/java/cc/polyfrost/oneconfig/utils/gui/OneUIScreen.java (limited to 'src/main/java/cc/polyfrost/oneconfig/utils/gui') diff --git a/src/main/java/cc/polyfrost/oneconfig/utils/gui/GuiUtils.java b/src/main/java/cc/polyfrost/oneconfig/utils/gui/GuiUtils.java new file mode 100644 index 0000000..973e003 --- /dev/null +++ b/src/main/java/cc/polyfrost/oneconfig/utils/gui/GuiUtils.java @@ -0,0 +1,63 @@ +package cc.polyfrost.oneconfig.utils.gui; + +import cc.polyfrost.oneconfig.events.EventManager; +import cc.polyfrost.oneconfig.events.event.RenderEvent; +import cc.polyfrost.oneconfig.events.event.Stage; +import cc.polyfrost.oneconfig.utils.TickDelay; +import gg.essential.universal.UMinecraft; +import gg.essential.universal.UScreen; +import me.kbrewster.eventbus.Subscribe; +import net.minecraft.client.gui.GuiScreen; + +/** + * A class containing utility methods for working with GuiScreens. + */ +public final class GuiUtils { + private static long time = -1L; + private static long deltaTime = 17L; + + static { + EventManager.INSTANCE.register(new GuiUtils()); + } + + /** + * Displays a screen after a tick, preventing mouse sync issues. + * + * @param screen the screen to display. + */ + public static void displayScreen(GuiScreen screen) { + new TickDelay(() -> UScreen.displayScreen(screen), 1); + } + + /** + * Close the current open GUI screen. + */ + public static void closeScreen() { + UScreen.displayScreen(null); + } + + /** + * Gets the delta time (in milliseconds) between frames. + *
+ * Not to be confused with Minecraft deltaTicks / renderPartialTicks, which can be gotten via + * {@link cc.polyfrost.oneconfig.events.event.TimerUpdateEvent} + *
+ * + * @return the delta time. + */ + public static float getDeltaTime() { + return deltaTime; + } + + @Subscribe + private void onRenderEvent(RenderEvent event) { + if (event.stage == Stage.START) { + if (time == -1) time = UMinecraft.getTime(); + else { + long currentTime = UMinecraft.getTime(); + deltaTime = currentTime - time; + time = currentTime; + } + } + } +} diff --git a/src/main/java/cc/polyfrost/oneconfig/utils/gui/OneUIScreen.java b/src/main/java/cc/polyfrost/oneconfig/utils/gui/OneUIScreen.java new file mode 100644 index 0000000..c06f6f3 --- /dev/null +++ b/src/main/java/cc/polyfrost/oneconfig/utils/gui/OneUIScreen.java @@ -0,0 +1,147 @@ +package cc.polyfrost.oneconfig.utils.gui; + +import cc.polyfrost.oneconfig.renderer.RenderManager; +import cc.polyfrost.oneconfig.utils.InputUtils; +import gg.essential.universal.UMatrixStack; +import gg.essential.universal.UScreen; +import net.minecraft.client.gui.GuiScreen; +import org.jetbrains.annotations.NotNull; +import org.lwjgl.input.Mouse; + +/** + *It also contains methods for mouse input. (see {@link InputUtils} for more utils). + *
+ * Use {@link GuiUtils#displayScreen(GuiScreen)} to display a screen; and {@link GuiUtils#closeScreen()} to close it. + */ +public abstract class OneUIScreen extends UScreen { + private boolean mouseDown; + private boolean blockClicks; + + /** + * Create a new OneUIScreen. + * + * @param restoreGuiOnClose use this to declare weather or not to open the Gui that was open before it when this screen is closed. + */ + public OneUIScreen(boolean restoreGuiOnClose) { + super(restoreGuiOnClose); + } + + /** + * Create a new OneUIScreen. + */ + public OneUIScreen() { + super(false); + } + + @Override + public void onDrawScreen(@NotNull UMatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { + super.onDrawScreen(matrixStack, mouseX, mouseY, partialTicks); + RenderManager.setupAndDraw(ignoreMinecraftScale(), vg -> draw(vg, partialTicks)); + mouseDown = Mouse.isButtonDown(0); + } + + /** + * This method is called when the screen is first opened. You can use it to set variables, initialize things, etc. + */ + public abstract void onScreenOpen(); + + /** + * Use this method to draw things on the screen. It is called every render tick, and has a handyvg
(NanoVG context) that can be used with the {@link RenderManager} to draw things.
+ *
+ * For example: {@link RenderManager#drawRoundedRect(long, float, float, float, float, int, float)}
+ *
+ * @param vg the NanoVG context you can use to render things with
+ * @param partialTicks the time between ticks (You can use this as a deltaTime equivalent)
+ */
+ public abstract void draw(long vg, float partialTicks);
+
+ /**
+ * This method is called when the screen is closed. You can use it to clean up things, etc.
+ */
+ @Override
+ public abstract void onScreenClose();
+
+ @Override
+ public void initScreen(int width, int height) {
+ onScreenOpen();
+ }
+
+ /**
+ * Use this method to set weather or not to use the Minecraft scale on the GUI. Its default is true, and that is recommended for the NanoVG rendering.
+ */
+ public boolean ignoreMinecraftScale() {
+ return true;
+ }
+
+ /**
+ * Use this method to declare weather or not this Screen pauses the game when it is open. (Single-player only) Its default is false.
+ */
+ public boolean doesScreenPauseGame() {
+ return false;
+ }
+
+ @Override
+ public boolean doesGuiPauseGame() {
+ return doesScreenPauseGame();
+ }
+
+
+ /**
+ * Get the current x position of the mouse.
+ */
+ public int getMouseX() {
+ return InputUtils.mouseX();
+ }
+
+ /**
+ * Get the current y position of the mouse.
+ */
+ public int getMouseY() {
+ return InputUtils.mouseY();
+ }
+
+ @Override
+ public void onMouseClicked(double mouseX, double mouseY, int mouseButton) {
+ super.onMouseClicked(mouseX, mouseY, mouseButton);
+ }
+
+ /**
+ * Retrieve the click status of the mouse. This method uses a boolean to store the status of the mouse, so it will only return true once per click. (very useful)
+ *
+ * @param ignoreBlockClicks whether to ignore the current click blocker.
+ */
+ public boolean isClicked(boolean ignoreBlockClicks) {
+ return mouseDown && !Mouse.isButtonDown(0) && (!blockClicks || ignoreBlockClicks);
+ }
+
+ /**
+ * Retrieve the click status of the mouse. This method uses a boolean to store the status of the mouse, so it will only return true once per click. (very useful)
+ */
+ public boolean isClicked() {
+ return isClicked(false);
+ }
+
+ /**
+ * Retrieve weather or not the mouse is currently down. Will constantly return true if its clicked. See {@link #isClicked()} for a method that only executes once per tick.
+ */
+ public boolean isMouseDown() {
+ return Mouse.isButtonDown(0);
+ }
+
+ /**
+ * Click blocking can be useful when you are drawing buttons for example over the top of other elements, so a click blocker can be used to ensure that the mouse doesn't click through things.
+ */
+ public void shouldBlockClicks(boolean state) {
+ blockClicks = state;
+ }
+
+ /**
+ * Click blocking can be useful when you are drawing buttons for example over the top of other elements, so a click blocker can be used to ensure that the mouse doesn't click through things.
+ */
+ public boolean isBlockingClicks() {
+ return blockClicks;
+ }
+}
--
cgit