Skip to content

Commit 04dd3e0

Browse files
committed
Fixed widgets registering clicks when not visible (Someone PR this to meteor frfr)
(cherry picked from commit b379c1c)
1 parent 03d590c commit 04dd3e0

File tree

5 files changed

+83
-0
lines changed

5 files changed

+83
-0
lines changed

src/main/java/me/pindour/catpuccin/gui/themes/catpuccin/widgets/WCatpuccinSection.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
import me.pindour.catpuccin.gui.themes.catpuccin.CatpuccinGuiTheme;
77
import me.pindour.catpuccin.gui.themes.catpuccin.CatpuccinWidget;
88
import me.pindour.catpuccin.gui.themes.catpuccin.icons.CatpuccinIcons;
9+
import me.pindour.catpuccin.mixininterface.IWContainer;
10+
import me.pindour.catpuccin.utils.WidgetUtils;
911
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
1012
import meteordevelopment.meteorclient.gui.widgets.WWidget;
1113
import meteordevelopment.meteorclient.gui.widgets.containers.WSection;
14+
import meteordevelopment.meteorclient.gui.widgets.containers.WView;
1215
import meteordevelopment.meteorclient.utils.render.color.Color;
1316

1417
public class WCatpuccinSection extends WSection implements CatpuccinWidget {
@@ -74,6 +77,15 @@ protected void renderWidget(WWidget widget, GuiRenderer renderer, double mouseX,
7477
}
7578
}
7679

80+
@Override
81+
protected boolean propagateEvents(WWidget widget) {
82+
WView parentView = ((IWContainer)this).catpuccin$getParentView();
83+
84+
if (parentView == null) parentView = WidgetUtils.findParentView(this);
85+
86+
return (expanded || widget instanceof WHeader) && WidgetUtils.isWidgetInside(widget, parentView);
87+
}
88+
7789
@Override
7890
public void setExpanded(boolean expanded) {
7991
super.setExpanded(expanded);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package me.pindour.catpuccin.mixin.meteorclient;
2+
3+
import me.pindour.catpuccin.mixininterface.IWContainer;
4+
import me.pindour.catpuccin.utils.WidgetUtils;
5+
import meteordevelopment.meteorclient.gui.widgets.WWidget;
6+
import meteordevelopment.meteorclient.gui.widgets.containers.WContainer;
7+
import meteordevelopment.meteorclient.gui.widgets.containers.WView;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.Unique;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.Inject;
12+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
13+
14+
@Mixin(value = WContainer.class, remap = false)
15+
public abstract class WContainerMixin extends WWidget implements IWContainer {
16+
17+
@Unique
18+
WView parentView;
19+
20+
@Inject(method = "propagateEvents", at = @At("HEAD"), cancellable = true)
21+
private void onPropagateEvents(WWidget widget, CallbackInfoReturnable<Boolean> cir) {
22+
// There's probably a better way to do this, but initializing parent view on widget init is too early so deal with it
23+
if (parentView == null) parentView = WidgetUtils.findParentView(this);
24+
if (parentView != null) cir.setReturnValue(WidgetUtils.isWidgetInside(widget, parentView));
25+
}
26+
27+
@Override
28+
public WView catpuccin$getParentView() {
29+
return parentView;
30+
}
31+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package me.pindour.catpuccin.mixininterface;
2+
3+
import meteordevelopment.meteorclient.gui.widgets.containers.WView;
4+
5+
public interface IWContainer {
6+
WView catpuccin$getParentView();
7+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package me.pindour.catpuccin.utils;
2+
3+
import me.pindour.catpuccin.mixininterface.IWContainer;
4+
import meteordevelopment.meteorclient.gui.widgets.WWidget;
5+
import meteordevelopment.meteorclient.gui.widgets.containers.WContainer;
6+
import meteordevelopment.meteorclient.gui.widgets.containers.WView;
7+
import meteordevelopment.meteorclient.gui.widgets.containers.WWindow;
8+
import org.jetbrains.annotations.Nullable;
9+
10+
public class WidgetUtils {
11+
public static boolean isWidgetInside(WWidget inner, WWidget outer) {
12+
if (inner == null || outer == null) return true;
13+
return ((inner.y >= outer.y && inner.y <= outer.y + outer.height) ||
14+
(inner.y + inner.height >= outer.y && inner.y + inner.height <= outer.y + outer.height)) ||
15+
((outer.y >= inner.y && outer.y <= inner.y + inner.height) ||
16+
(outer.y + outer.height >= inner.y && outer.y + outer.height <= inner.y + inner.height));
17+
}
18+
19+
@Nullable
20+
public static WView findParentView(WWidget widget) {
21+
return switch (widget) {
22+
case null -> null;
23+
case WView view -> view;
24+
case WWindow window -> window.view;
25+
case WContainer container -> {
26+
WView view = ((IWContainer)container).catpuccin$getParentView();
27+
yield view != null ? view : findParentView(widget.parent);
28+
}
29+
default -> findParentView(widget.parent);
30+
};
31+
}
32+
}

src/main/resources/catpuccin.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"mixins": [
1111
"meteorclient.FontsMixin",
1212
"meteorclient.GuiRendererMixin",
13+
"meteorclient.WContainerMixin",
1314
"meteorclient.WHeaderMixin"
1415
]
1516
}

0 commit comments

Comments
 (0)