From 82ce1a72e26a3ced45949ab459592b97b39b334f Mon Sep 17 00:00:00 2001 From: DeDiamondPro <67508414+DeDiamondPro@users.noreply.github.com> Date: Mon, 16 May 2022 17:48:07 +0200 Subject: block clicks system --- .../cc/polyfrost/oneconfig/gui/OneConfigGui.java | 2 +- .../gui/elements/config/ConfigDropdown.java | 12 ++++++---- .../gui/elements/config/ConfigSlider.java | 6 ++++- .../cc/polyfrost/oneconfig/utils/InputUtils.java | 27 +++++++++++++++++++--- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/main/java/cc/polyfrost/oneconfig/gui/OneConfigGui.java b/src/main/java/cc/polyfrost/oneconfig/gui/OneConfigGui.java index 8becc0c..22b5455 100644 --- a/src/main/java/cc/polyfrost/oneconfig/gui/OneConfigGui.java +++ b/src/main/java/cc/polyfrost/oneconfig/gui/OneConfigGui.java @@ -261,7 +261,7 @@ public class OneConfigGui extends UScreen { @Override public void onScreenClose() { currentPage.finishUpAndClose(); - //instanceToRestore = this; + instanceToRestore = this; INSTANCE = null; super.onScreenClose(); } diff --git a/src/main/java/cc/polyfrost/oneconfig/gui/elements/config/ConfigDropdown.java b/src/main/java/cc/polyfrost/oneconfig/gui/elements/config/ConfigDropdown.java index 199e0f0..1ae585a 100644 --- a/src/main/java/cc/polyfrost/oneconfig/gui/elements/config/ConfigDropdown.java +++ b/src/main/java/cc/polyfrost/oneconfig/gui/elements/config/ConfigDropdown.java @@ -36,10 +36,12 @@ public class ConfigDropdown extends BasicOption { // TODO: chose where dividers if (size == 1) hovered = InputUtils.isAreaHovered(x + 224, y, 256, 32) && isEnabled(); else hovered = InputUtils.isAreaHovered(x + 352, y, 640, 32) && isEnabled(); - if (hovered && InputUtils.isClicked() || opened && InputUtils.isClicked() && + if (hovered && InputUtils.isClicked() || opened && InputUtils.isClicked(true) && (size == 1 && !InputUtils.isAreaHovered(x + 224, y + 40, 256, options.length * 32 + 4) || - size == 2 && !InputUtils.isAreaHovered(x + 352, y + 40, 640, options.length * 32 + 4))) + size == 2 && !InputUtils.isAreaHovered(x + 352, y + 40, 640, options.length * 32 + 4))) { opened = !opened; + InputUtils.blockClicks(opened); + } if (opened) return; backgroundColor = ColorUtils.smoothColor(backgroundColor, OneConfigConfig.GRAY_500, OneConfigConfig.GRAY_400, hovered, 100); @@ -97,12 +99,13 @@ public class ConfigDropdown extends BasicOption { // TODO: chose where dividers RenderManager.drawRoundedRect(vg, x + 228, optionY - 12, 248, 28, OneConfigConfig.BLUE_700, 8); color = OneConfigConfig.WHITE; } - if (optionHovered && InputUtils.isClicked()) { + if (optionHovered && InputUtils.isClicked(true)) { try { set(Arrays.asList(options).indexOf(option)); } catch (IllegalAccessException ignored) { } opened = false; + InputUtils.blockClicks(false); } RenderManager.drawString(vg, option, x + 240, optionY + 4, color, 14, Fonts.MEDIUM); @@ -135,12 +138,13 @@ public class ConfigDropdown extends BasicOption { // TODO: chose where dividers if (!options[options.length - 1].equals(option)) RenderManager.drawLine(vg, x + 360, optionY + 18, x + 984, optionY + 18, 1, new Color(204, 204, 204, 77).getRGB()); - if (optionHovered && InputUtils.isClicked()) { + if (optionHovered && InputUtils.isClicked(true)) { try { set(Arrays.asList(options).indexOf(option)); } catch (IllegalAccessException ignored) { } opened = false; + InputUtils.blockClicks(false); } optionY += 32; } diff --git a/src/main/java/cc/polyfrost/oneconfig/gui/elements/config/ConfigSlider.java b/src/main/java/cc/polyfrost/oneconfig/gui/elements/config/ConfigSlider.java index 29d132a..c9f2691 100644 --- a/src/main/java/cc/polyfrost/oneconfig/gui/elements/config/ConfigSlider.java +++ b/src/main/java/cc/polyfrost/oneconfig/gui/elements/config/ConfigSlider.java @@ -18,6 +18,7 @@ public class ConfigSlider extends BasicOption { private boolean isFloat = true; private final int step; private boolean dragging = false; + private boolean mouseWasDown = false; public ConfigSlider(Field field, Object parent, String name, int size, float min, float max, int step) { super(field, parent, name, size); @@ -34,9 +35,12 @@ public class ConfigSlider extends BasicOption { boolean hovered = InputUtils.isAreaHovered(x + 352, y, 512, 32) && isEnabled(); inputField.disable(!isEnabled()); if (!isEnabled()) NanoVG.nvgGlobalAlpha(vg, 0.5f); - if (hovered && Mouse.isButtonDown(0)) dragging = true; + boolean isMouseDown = Mouse.isButtonDown(0); + if (hovered && isMouseDown && !mouseWasDown) dragging = true; + mouseWasDown = isMouseDown; if (dragging) { xCoordinate = (int) MathUtils.clamp(InputUtils.mouseX(), x + 352, x + 864); + if (step > 0) xCoordinate = getStepCoordinate(xCoordinate, x); value = MathUtils.map(xCoordinate, x + 352, x + 864, min, max); } else if (inputField.isToggled() || inputField.arrowsClicked()) { value = inputField.getCurrentValue(); diff --git a/src/main/java/cc/polyfrost/oneconfig/utils/InputUtils.java b/src/main/java/cc/polyfrost/oneconfig/utils/InputUtils.java index ee0bafd..6053a99 100644 --- a/src/main/java/cc/polyfrost/oneconfig/utils/InputUtils.java +++ b/src/main/java/cc/polyfrost/oneconfig/utils/InputUtils.java @@ -5,6 +5,8 @@ import gg.essential.universal.UResolution; import org.lwjgl.input.Mouse; public class InputUtils { + private static boolean blockClicks = false; + /** * function to determine weather the mouse is currently over a specific region. Uses the current nvgScale to fix to any scale. * @@ -13,15 +15,23 @@ public class InputUtils { public static boolean isAreaHovered(int x, int y, int width, int height) { int mouseX = mouseX(); int mouseY = mouseY(); - return mouseX > x && mouseY > y && mouseX < x + width && mouseY < y + height; // TODO add scaling info + return mouseX > x && mouseY > y && mouseX < x + width && mouseY < y + height; + } + + public static boolean isAreaClicked(int x, int y, int width, int height, boolean ignoreBlock) { + return isAreaHovered(x, y, width, height) && isClicked(ignoreBlock); } public static boolean isAreaClicked(int x, int y, int width, int height) { - return isAreaHovered(x, y, width, height) && isClicked(); + return isAreaClicked(x, y, width, height, false); + } + + public static boolean isClicked(boolean ignoreBlock) { + return OneConfigGui.INSTANCE != null && OneConfigGui.INSTANCE.mouseDown && !Mouse.isButtonDown(0) && (!blockClicks || ignoreBlock); } public static boolean isClicked() { - return OneConfigGui.INSTANCE != null && OneConfigGui.INSTANCE.mouseDown && !Mouse.isButtonDown(0); + return isClicked(false); } public static int mouseX() { @@ -33,4 +43,15 @@ public class InputUtils { if (OneConfigGui.INSTANCE == null) return UResolution.getWindowHeight() - Math.abs(Mouse.getY()); return (int) ((UResolution.getWindowHeight() - Math.abs(Mouse.getY())) / OneConfigGui.INSTANCE.getScaleFactor()); } + + /** + * Should be used if there is something above other components and you don't want it clicking trough + */ + public static void blockClicks(boolean value) { + blockClicks = value; + } + + public static boolean isBlockingClicks() { + return blockClicks; + } } -- cgit