From fd0dd85bad0ddeb340e0810b88b7d51615e2219d Mon Sep 17 00:00:00 2001 From: Dreyri Date: Mon, 19 Mar 2018 20:40:20 -0400 Subject: [PATCH 1/2] Broadcast widget hidden changed recursively for each child too --- .../net/runelite/mixins/RSWidgetMixin.java | 58 +++++++++++++++++-- .../java/net/runelite/rs/api/RSWidget.java | 2 + 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java index 16e9ab0d1a..fd24972e29 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java @@ -351,6 +351,44 @@ public abstract class RSWidgetMixin implements RSWidget return bounds != null && bounds.contains(new java.awt.Point(point.getX(), point.getY())); } + @Inject + @Override + public void broadcastHidden(boolean hidden) + { + WidgetHiddenChanged event = new WidgetHiddenChanged(); + event.setWidget(this); + event.setHidden(hidden); + + eventBus.post(event); + + RSWidget[] children = getChildren(); + + if (children != null) + { + // recursive through children + for (RSWidget child : children) + { + // if the widget is hidden it will not magically unhide from its parent changing + if (child == null || child.isSelfHidden()) + continue; + + child.broadcastHidden(hidden); + } + } + + // make sure we iterate nested children as well + // cannot be null + Widget[] nestedChildren = getNestedChildren(); + + for (Widget nestedChild : nestedChildren) + { + if (nestedChild == null || nestedChild.isSelfHidden()) + continue; + + ((RSWidget) nestedChild).broadcastHidden(hidden); + } + } + @FieldHook("isHidden") @Inject public void onHiddenChanged(int idx) @@ -362,12 +400,22 @@ public abstract class RSWidgetMixin implements RSWidget return; } - boolean hidden = isHidden(); + Widget parent = getParent(); - WidgetHiddenChanged event = new WidgetHiddenChanged(); - event.setWidget(this); - event.setHidden(hidden); + // if the parent is hidden then changes in this widget don't have any visual effect + // so ignore them + if (parent != null) + { + if (parent.isHidden()) + { + return; + } + } + else if (TO_GROUP(id) != client.getWidgetRoot()) + { + return; + } - eventBus.post(event); + broadcastHidden(isSelfHidden()); } } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java index ae59ab017b..d323ae10cd 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java @@ -225,4 +225,6 @@ public interface RSWidget extends Widget @Import("paddingY") @Override void setPaddingY(int paddingY); + + void broadcastHidden(boolean hidden); } From 57c0770ffe65cb35bc5868ddb5ccecdf4c655f45 Mon Sep 17 00:00:00 2001 From: Dreyri Date: Mon, 19 Mar 2018 20:40:58 -0400 Subject: [PATCH 2/2] Use isLocalHidden in attack indicator plugin --- .../client/plugins/attackindicator/AttackIndicatorPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/attackindicator/AttackIndicatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackindicator/AttackIndicatorPlugin.java index 8e8af011dd..aa2f564741 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/attackindicator/AttackIndicatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/attackindicator/AttackIndicatorPlugin.java @@ -128,7 +128,7 @@ public class AttackIndicatorPlugin extends Plugin @Subscribe public void hideWidgets(WidgetHiddenChanged event) { - if (event.getWidget().isHidden() || TO_GROUP(event.getWidget().getId()) != COMBAT_GROUP_ID) + if (event.getWidget().isSelfHidden() || TO_GROUP(event.getWidget().getId()) != COMBAT_GROUP_ID) { return; }