From e8d4ff38cba79d1e26f68a2e9fb4899c6736f3de Mon Sep 17 00:00:00 2001 From: trimbe <19672127+trimbe@users.noreply.github.com> Date: Mon, 20 Jul 2020 23:42:27 -0700 Subject: [PATCH] banktags: Remove tab separators from tag tabs --- .../main/java/net/runelite/api/ScriptID.java | 9 ++ .../net/runelite/api/widgets/WidgetID.java | 1 + .../net/runelite/api/widgets/WidgetInfo.java | 1 + .../plugins/banktags/BankTagsConfig.java | 11 +++ .../plugins/banktags/BankTagsPlugin.java | 89 +++++++++++++++++++ 5 files changed, 111 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java index af79f87a2f..520150c27c 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -284,4 +284,13 @@ public final class ScriptID */ @ScriptArguments(integer = 4, string = 1) public static final int XPDROPS_SETDROPSIZE = 996; + + /** + * Main layout script for the bank + * + */ + @ScriptArguments(integer = 17) + public static final int BANKMAIN_BUILD = 277; } diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index be4e856996..bf4dcd9c7a 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -259,6 +259,7 @@ public class WidgetID static final int CONTENT_CONTAINER = 9; static final int TAB_CONTAINER = 10; static final int ITEM_CONTAINER = 12; + static final int SCROLLBAR = 13; static final int SEARCH_BUTTON_BACKGROUND = 39; static final int DEPOSIT_INVENTORY = 41; static final int DEPOSIT_EQUIPMENT = 43; diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index a8ba4b369e..178768fa5d 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -146,6 +146,7 @@ public enum WidgetInfo BANK_ITEM_COUNT_TOP(WidgetID.BANK_GROUP_ID, WidgetID.Bank.ITEM_COUNT_TOP), BANK_ITEM_COUNT_BAR(WidgetID.BANK_GROUP_ID, WidgetID.Bank.ITEM_COUNT_BAR), BANK_ITEM_COUNT_BOTTOM(WidgetID.BANK_GROUP_ID, WidgetID.Bank.ITEM_COUNT_BOTTOM), + BANK_SCROLLBAR(WidgetID.BANK_GROUP_ID, WidgetID.Bank.SCROLLBAR), BANK_PIN_CONTAINER(WidgetID.BANK_PIN_GROUP_ID, WidgetID.BankPin.CONTAINER), BANK_SETTINGS_BUTTON(WidgetID.BANK_GROUP_ID, WidgetID.Bank.SETTINGS_BUTTON), BANK_TUTORIAL_BUTTON(WidgetID.BANK_GROUP_ID, WidgetID.Bank.TUTORIAL_BUTTON), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsConfig.java index 61b734c836..00951fdce3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsConfig.java @@ -53,6 +53,17 @@ public interface BankTagsConfig extends Config return true; } + @ConfigItem( + keyName = "removeTabSeparators", + name = "Remove tab separators", + description = "Remove the tab separators normally present in tag tabs", + position = 3 + ) + default boolean removeSeparators() + { + return false; + } + @ConfigItem( keyName = "position", name = "", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java index 607861bfd8..f28f86fec8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java @@ -26,6 +26,7 @@ */ package net.runelite.client.plugins.banktags; +import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.primitives.Shorts; import com.google.inject.Provides; @@ -33,6 +34,7 @@ import java.awt.event.MouseWheelEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -48,6 +50,8 @@ import net.runelite.api.ItemContainer; import net.runelite.api.KeyCode; import net.runelite.api.MenuAction; import net.runelite.api.MenuEntry; +import net.runelite.api.ScriptID; +import net.runelite.api.SpriteID; import net.runelite.api.VarClientInt; import net.runelite.api.VarClientStr; import net.runelite.api.events.DraggingWidgetChanged; @@ -56,6 +60,7 @@ import net.runelite.api.events.GrandExchangeSearched; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.ScriptPostFired; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.vars.InputType; import net.runelite.api.widgets.Widget; @@ -96,6 +101,10 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener public static final String ICON_SEARCH = "icon_"; public static final String TAG_TABS_CONFIG = "tagtabs"; public static final String VAR_TAG_SUFFIX = "*"; + private static final int ITEMS_PER_ROW = 8; + private static final int ITEM_VERTICAL_SPACING = 36; + private static final int ITEM_HORIZONTAL_SPACING = 48; + private static final int ITEM_ROW_START = 51; private static final int MAX_RESULT_COUNT = 250; @@ -450,6 +459,86 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener } } + private boolean isSearching() + { + return client.getVar(VarClientInt.INPUT_TYPE) == InputType.SEARCH.getType() + || (client.getVar(VarClientInt.INPUT_TYPE) <= 0 + && !Strings.isNullOrEmpty(client.getVar(VarClientStr.INPUT_TEXT))); + } + + @Subscribe + public void onScriptPostFired(ScriptPostFired event) + { + if (event.getScriptId() != ScriptID.BANKMAIN_BUILD || !config.removeSeparators()) + { + return; + } + + // allow time for the tab interface to become active + clientThread.invokeLater(() -> + { + if (!isSearching() || !tabInterface.isActive()) + { + return; + } + + Widget itemContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER); + if (itemContainer == null) + { + return; + } + + int items = 0; + + Widget[] containerChildren = itemContainer.getDynamicChildren(); + + // sort the child array as the items are not in the displayed order + Arrays.sort(containerChildren, Comparator.comparing(Widget::getOriginalY) + .thenComparing(Widget::getOriginalX)); + + for (Widget child : containerChildren) + { + if (child.getItemId() != -1 && !child.isHidden()) + { + // calculate correct item position as if this was a normal tab + int adjYOffset = (items / ITEMS_PER_ROW) * ITEM_VERTICAL_SPACING; + int adjXOffset = (items % ITEMS_PER_ROW) * ITEM_HORIZONTAL_SPACING + ITEM_ROW_START; + + if (child.getOriginalY() != adjYOffset) + { + child.setOriginalY(adjYOffset); + child.revalidate(); + } + + if (child.getOriginalX() != adjXOffset) + { + child.setOriginalX(adjXOffset); + child.revalidate(); + } + + items++; + } + + // separator line or tab text + if (child.getSpriteId() == SpriteID.RESIZEABLE_MODE_SIDE_PANEL_BACKGROUND + || child.getText().contains("Tab")) + { + child.setHidden(true); + } + } + + int itemContainerHeight = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER).getHeight(); + // add a second row of height here to allow users to scroll down when the last row is partially visible + int adjustedScrollHeight = (items / ITEMS_PER_ROW) * ITEM_VERTICAL_SPACING + ITEM_VERTICAL_SPACING; + itemContainer.setScrollHeight(Math.max(adjustedScrollHeight, itemContainerHeight)); + + client.runScript(ScriptID.UPDATE_SCROLLBAR, + WidgetInfo.BANK_SCROLLBAR.getId(), + WidgetInfo.BANK_ITEM_CONTAINER.getId(), + 0); + }); + } + @Subscribe public void onGameTick(GameTick event) {