diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java index 92307d183f..68c1b3a10f 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java @@ -283,6 +283,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { if (mouseOver) { dragging = true; + setFocused(true); handleX = lastMouseX - x; handleY = lastMouseY - y; @@ -298,6 +299,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { public boolean onMouseReleased(Click click) { if (dragging) { dragging = false; + setFocused(false); } return false; @@ -555,6 +557,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { if (mouseOver) { dragging = true; + setFocused(true); handleX = lastMouseX - x; calculateHueAngleFromHandleX(); @@ -570,6 +573,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { public boolean onMouseReleased(Click click) { if (dragging) { dragging = false; + setFocused(false); } return mouseOver; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java index a0aae7c300..873f9b01ef 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java @@ -25,6 +25,7 @@ public abstract class WWidget implements BaseWidget { public String tooltip; public boolean mouseOver; + public boolean focused; protected boolean instantTooltips; protected double mouseOverTimer; @@ -143,11 +144,19 @@ protected WWidget getRoot() { return parent != null ? parent.getRoot() : (this instanceof WRoot ? this : null); } - protected WView getView() { + public WView getView() { return this instanceof WView ? (WView) this : (parent != null ? parent.getView() : null); } public boolean isOver(double x, double y) { return x >= this.x && x <= this.x + width && y >= this.y && y <= this.y + height; } + + public boolean isFocused() { + return focused; + } + + public void setFocused(boolean focused) { + if (this.focused != focused) this.focused = focused; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WContainer.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WContainer.java index 632d76cb30..5d02d163ae 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WContainer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WContainer.java @@ -62,6 +62,12 @@ public void moveCells(double deltaX, double deltaY) { } } + @Override + public boolean isFocused() { + for (Cell cell : cells) if (cell.widget().isFocused()) return true; + return false; + } + // Layout @Override @@ -107,13 +113,15 @@ public boolean render(GuiRenderer renderer, double mouseX, double mouseY, double if (super.render(renderer, mouseX, mouseY, delta)) return true; WView view = getView(); + double windowHeight = getWindowHeight(); for (Cell cell : cells) { - double y = cell.widget().y; - if (y > getWindowHeight()) break; - if (view != null && !view.isWidgetInView(cell.widget())) continue; + WWidget widget = cell.widget(); + + if (widget.y > windowHeight) break; + if (widget.y + widget.height <= 0) continue; - if (y + cell.widget().height > 0) renderWidget(cell.widget(), renderer, mouseX, mouseY, delta); + if (shouldRenderWidget(widget, view)) renderWidget(widget, renderer, mouseX, mouseY, delta); } return false; @@ -123,6 +131,17 @@ protected void renderWidget(WWidget widget, GuiRenderer renderer, double mouseX, widget.render(renderer, mouseX, mouseY, delta); } + private boolean shouldRenderWidget(WWidget widget, WView view) { + if (view == null) return true; + if (!view.isWidgetInView(widget)) return false; + + if (widget.mouseOver && !view.mouseOver) { + widget.mouseOver = false; + } + + return true; + } + // Events protected boolean propagateEvents(WWidget widget) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java index 829579e215..e717cbe500 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java @@ -164,11 +164,7 @@ else if (targetScroll < scroll) { @Override protected boolean propagateEvents(WWidget widget) { - return ((widget.y >= y && widget.y <= y + height) || (widget.y + widget.height >= y && widget.y + widget.height <= y + height)) || ((y >= widget.y && y <= widget.y + widget.height) || (y + height >= widget.y && y + height <= widget.y + widget.height)); - } - - protected boolean isWidgetInView(WWidget widget) { - return widget.y < y + height && widget.y + widget.height > y; + return (mouseOver && isWidgetInView(widget)) || widget.isFocused(); } protected double handleWidth() { @@ -186,4 +182,8 @@ protected double handleX() { protected double handleY() { return y + (height - handleHeight()) * (scroll / (actualHeight - height)); } + + public boolean isWidgetInView(WWidget widget) { + return widget.y < y + height && widget.y + widget.height > y; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDropdown.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDropdown.java index c6df1859ce..484297aefd 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDropdown.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDropdown.java @@ -9,6 +9,7 @@ import meteordevelopment.meteorclient.gui.utils.Cell; import meteordevelopment.meteorclient.gui.widgets.WRoot; import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; +import meteordevelopment.meteorclient.gui.widgets.containers.WView; import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; import net.minecraft.client.gui.Click; import net.minecraft.client.input.CharInput; @@ -84,6 +85,8 @@ protected void onCalculateWidgetPositions() { @Override protected void onPressed(int button) { expanded = !expanded; + root.setFocused(expanded); + setFocused(expanded); } public T get() { @@ -108,7 +111,10 @@ public boolean render(GuiRenderer renderer, double mouseX, double mouseY, double animProgress += (expanded ? 1 : -1) * delta * 14; animProgress = MathHelper.clamp(animProgress, 0, 1); - if (!render && animProgress > 0) { + WView view = getView(); + boolean rootInView = view == null || view.isWidgetInView(root); + + if (!render && animProgress > 0 && rootInView) { renderer.absolutePost(() -> { renderer.scissorStart(x, y + height, width, root.height * animProgress); root.render(renderer, mouseX, mouseY, delta); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WSlider.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WSlider.java index 2cfd3d78bd..a0ae60e4d0 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WSlider.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WSlider.java @@ -53,6 +53,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { if (action != null) action.run(); dragging = true; + setFocused(true); return true; } @@ -112,6 +113,7 @@ public boolean onMouseReleased(Click click) { } dragging = false; + setFocused(false); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java index d7b1d6b553..9067254eec 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java @@ -39,7 +39,6 @@ public abstract class WTextBox extends WWidget { protected final Renderer renderer; - protected boolean focused; protected DoubleList textWidths = new DoubleArrayList(); protected int cursor; @@ -669,10 +668,7 @@ public void set(String text) { cursorChanged(); } - public boolean isFocused() { - return focused; - } - + @Override public void setFocused(boolean focused) { if (this.focused && !focused && actionOnUnfocused != null) actionOnUnfocused.run();