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 e1e40eac59..3b54331496 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 @@ -30,10 +30,14 @@ import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; +import java.awt.event.KeyEvent; import java.awt.event.MouseWheelEvent; +import java.util.ArrayList; import java.util.Arrays; -import java.util.List; +import java.util.Collection; import java.util.Objects; +import java.util.regex.Pattern; +import java.util.stream.Collectors; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.InventoryID; @@ -45,6 +49,7 @@ import net.runelite.api.MenuEntry; import net.runelite.api.VarClientStr; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.DraggingWidgetChanged; +import net.runelite.api.events.FocusChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuOptionClicked; @@ -57,6 +62,8 @@ import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.game.ChatboxInputManager; import net.runelite.client.game.ItemManager; +import net.runelite.client.input.KeyListener; +import net.runelite.client.input.KeyManager; import net.runelite.client.input.MouseManager; import net.runelite.client.input.MouseWheelListener; import net.runelite.client.plugins.Plugin; @@ -72,7 +79,7 @@ import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; tags = {"searching", "tagging"} ) @PluginDependency(ClueScrollPlugin.class) -public class BankTagsPlugin extends Plugin implements MouseWheelListener +public class BankTagsPlugin extends Plugin implements MouseWheelListener, KeyListener { public static final Splitter SPLITTER = Splitter.on(",").omitEmptyStrings().trimResults(); public static final Joiner JOINER = Joiner.on(",").skipNulls(); @@ -80,6 +87,7 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener public static final String TAG_SEARCH = "tag:"; public static final String EDIT_TAGS_MENU_OPTION = "Edit-tags"; public static final String ICON_SEARCH = "icon_"; + public static final String VAR_TAG_SUFFIX = "*"; private static final String SEARCH_BANK_INPUT_TEXT = "Show items whose names or tags contain the following text:
" + @@ -112,6 +120,11 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener @Inject private TabInterface tabInterface; + @Inject + private KeyManager keyManager; + + private boolean shiftPressed = false; + @Provides BankTagsConfig getConfig(ConfigManager configManager) { @@ -121,6 +134,7 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener @Override public void startUp() { + keyManager.registerKeyListener(this); mouseManager.registerMouseWheelListener(this); clientThread.invokeLater(tabInterface::init); client.getSpriteOverrides().putAll(TabSprites.toMap(client)); @@ -129,6 +143,7 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener @Override public void shutDown() { + keyManager.unregisterKeyListener(this); mouseManager.unregisterMouseWheelListener(this); clientThread.invokeLater(tabInterface::destroy); @@ -136,6 +151,8 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener { client.getSpriteOverrides().remove(value.getSpriteId()); } + + shiftPressed = false; } @Subscribe @@ -202,11 +219,13 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener Widget item = container.getChild(event.getActionParam0()); int itemID = item.getItemId(); String text = EDIT_TAGS_MENU_OPTION; - int tagCount = tagManager.getTags(itemID).size(); + int tagCount = tagManager.getTags(itemID, false).size() + tagManager.getTags(itemID, true).size(); + if (tagCount > 0) { text += " (" + tagCount + ")"; } + MenuEntry editTags = new MenuEntry(); editTags.setParam0(event.getActionParam0()); editTags.setParam1(event.getActionParam1()); @@ -249,24 +268,40 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener int itemId = item.getId(); ItemComposition itemComposition = itemManager.getItemComposition(itemId); - String itemName = itemComposition.getName(); - String initialValue = tagManager.getTagString(itemId); + String name = itemComposition.getName(); - chatboxInputManager.openInputWindow(itemName + " tags:", initialValue, (newTags) -> + // Get both tags and vartags and append * to end of vartags name + Collection tags = tagManager.getTags(itemId, false); + tagManager.getTags(itemId, true).stream() + .map(i -> i + "*") + .forEach(tags::add); + + // Create initial value string + String initialValue = JOINER.join(tags); + + chatboxInputManager.openInputWindow(name + " tags:
(append " + VAR_TAG_SUFFIX + " for variation tag)", initialValue, (newValue) -> { - if (!Objects.equals(newTags, client.getVar(VarClientStr.INPUT_TEXT))) + if (!Objects.equals(newValue, client.getVar(VarClientStr.INPUT_TEXT))) { return; } - tagManager.setTagString(itemId, newTags); + // Split inputted tags to vartags (ending with *) and regular tags + final Collection newTags = new ArrayList<>(SPLITTER.splitToList(newValue.toLowerCase())); + final Collection newVarTags = new ArrayList<>(newTags).stream().filter(s -> s.endsWith(VAR_TAG_SUFFIX)).map(s -> + { + newTags.remove(s); + return s.substring(0, s.length() - VAR_TAG_SUFFIX.length()); + }).collect(Collectors.toList()); + + // And save them + tagManager.setTagString(itemId, JOINER.join(newTags), false); + tagManager.setTagString(itemId, JOINER.join(newVarTags), true); // Check both previous and current tags in case the tag got removed in new tags or in case // the tag got added in new tags - final List initialTags = SPLITTER.splitToList(initialValue.toLowerCase()); - final List tags = SPLITTER.splitToList(newTags.toLowerCase()); - tabInterface.updateTabIfActive(initialTags); - tabInterface.updateTabIfActive(tags); + tabInterface.updateTabIfActive(SPLITTER.splitToList(initialValue.toLowerCase().replaceAll(Pattern.quote(VAR_TAG_SUFFIX), ""))); + tabInterface.updateTabIfActive(SPLITTER.splitToList(newValue.toLowerCase().replaceAll(Pattern.quote(VAR_TAG_SUFFIX), ""))); }); } else @@ -300,7 +335,7 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener @Subscribe public void onDraggingWidgetChanged(DraggingWidgetChanged event) { - tabInterface.handleDrag(event.isDraggingWidget()); + tabInterface.handleDrag(event.isDraggingWidget(), shiftPressed); } @Subscribe @@ -312,10 +347,42 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener } } + @Subscribe + public void onFocusChanged(FocusChanged event) + { + if (!event.isFocused()) + { + shiftPressed = false; + } + } + @Override public MouseWheelEvent mouseWheelMoved(MouseWheelEvent event) { tabInterface.handleWheel(event); return event; } + + @Override + public void keyTyped(KeyEvent e) + { + } + + @Override + public void keyPressed(KeyEvent e) + { + if (e.getKeyCode() == KeyEvent.VK_SHIFT) + { + shiftPressed = true; + } + } + + @Override + public void keyReleased(KeyEvent e) + { + if (e.getKeyCode() == KeyEvent.VK_SHIFT) + { + shiftPressed = false; + } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/TagManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/TagManager.java index c26a41b00d..74f6f2219c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/TagManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/TagManager.java @@ -35,6 +35,7 @@ import javax.inject.Singleton; import net.runelite.api.ItemID; import net.runelite.client.config.ConfigManager; import net.runelite.client.game.ItemManager; +import net.runelite.client.game.ItemVariationMapping; import static net.runelite.client.plugins.banktags.BankTagsPlugin.CONFIG_GROUP; import static net.runelite.client.plugins.banktags.BankTagsPlugin.JOINER; import static net.runelite.client.plugins.banktags.BankTagsPlugin.SPLITTER; @@ -52,22 +53,25 @@ import net.runelite.client.util.Text; public class TagManager { private static final String ITEM_KEY_PREFIX = "item_"; - private final ItemManager itemManager; private final ConfigManager configManager; - + private final ItemManager itemManager; private final ClueScrollService clueScrollService; @Inject - private TagManager(final ItemManager itemManager, final ConfigManager configManager, final ClueScrollService clueScrollService) + private TagManager( + final ItemManager itemManager, + final ConfigManager configManager, + final ClueScrollService clueScrollService) { this.itemManager = itemManager; this.configManager = configManager; this.clueScrollService = clueScrollService; } - String getTagString(int itemId) + String getTagString(int itemId, boolean variation) { - itemId = itemManager.canonicalize(itemId); + itemId = getItemId(itemId, variation); + String config = configManager.getConfiguration(CONFIG_GROUP, ITEM_KEY_PREFIX + itemId); if (config == null) { @@ -77,14 +81,15 @@ public class TagManager return config; } - Collection getTags(int itemId) + Collection getTags(int itemId, boolean variation) { - return new LinkedHashSet<>(SPLITTER.splitToList(getTagString(itemId).toLowerCase())); + return new LinkedHashSet<>(SPLITTER.splitToList(getTagString(itemId, variation).toLowerCase())); } - void setTagString(int itemId, String tags) + void setTagString(int itemId, String tags, boolean variation) { - itemId = itemManager.canonicalize(itemId); + itemId = getItemId(itemId, variation); + if (Strings.isNullOrEmpty(tags)) { configManager.unsetConfiguration(CONFIG_GROUP, ITEM_KEY_PREFIX + itemId); @@ -95,27 +100,27 @@ public class TagManager } } - public void addTags(int itemId, final Collection t) + public void addTags(int itemId, final Collection t, boolean variation) { - final Collection tags = getTags(itemId); + final Collection tags = getTags(itemId, variation); if (tags.addAll(t)) { - setTags(itemId, tags); + setTags(itemId, tags, variation); } } - public void addTag(int itemId, String tag) + public void addTag(int itemId, String tag, boolean variation) { - final Collection tags = getTags(itemId); + final Collection tags = getTags(itemId, variation); if (tags.add(Text.standardize(tag))) { - setTags(itemId, tags); + setTags(itemId, tags, variation); } } - private void setTags(int itemId, Collection tags) + private void setTags(int itemId, Collection tags, boolean variation) { - setTagString(itemId, JOINER.join(tags)); + setTagString(itemId, JOINER.join(tags), variation); } boolean findTag(int itemId, String search) @@ -125,7 +130,9 @@ public class TagManager return true; } - return getTags(itemId).stream().anyMatch(tag -> tag.contains(Text.standardize(search))); + Collection tags = getTags(itemId, false); + tags.addAll(getTags(itemId, true)); + return tags.stream().anyMatch(tag -> tag.contains(Text.standardize(search))); } public List getItemsForTag(String tag) @@ -133,23 +140,46 @@ public class TagManager final String prefix = CONFIG_GROUP + "." + ITEM_KEY_PREFIX; return configManager.getConfigurationKeys(prefix).stream() .map(item -> Integer.parseInt(item.replace(prefix, ""))) - .filter(item -> getTags(item).contains(tag)) + .filter(item -> getTags(item, false).contains(tag) || getTags(item, true).contains(tag)) .collect(Collectors.toList()); } public void removeTag(String tag) { final String prefix = CONFIG_GROUP + "." + ITEM_KEY_PREFIX; - configManager.getConfigurationKeys(prefix).forEach(item -> removeTag(Integer.parseInt(item.replace(prefix, "")), tag)); + configManager.getConfigurationKeys(prefix).forEach(item -> + { + int id = Integer.parseInt(item.replace(prefix, "")); + removeTag(id, tag); + }); } public void removeTag(int itemId, String tag) { - final Collection tags = getTags(itemId); + Collection tags = getTags(itemId, false); if (tags.remove(Text.standardize(tag))) { - setTags(itemId, tags); + setTags(itemId, tags, false); } + + tags = getTags(itemId, true); + if (tags.remove(Text.standardize(tag))) + { + setTags(itemId, tags, true); + } + } + + private int getItemId(int itemId, boolean variation) + { + itemId = Math.abs(itemId); + itemId = itemManager.canonicalize(itemId); + + if (variation) + { + itemId = ItemVariationMapping.map(itemId) * -1; + } + + return itemId; } private boolean testClue(int itemId) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java index 62e22a8894..18f712a5c2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java @@ -26,6 +26,7 @@ package net.runelite.client.plugins.banktags.tabs; import com.google.common.base.Strings; +import com.google.common.collect.Lists; import java.awt.Color; import java.awt.Rectangle; import java.awt.Toolkit; @@ -80,6 +81,7 @@ import static net.runelite.client.plugins.banktags.BankTagsPlugin.CONFIG_GROUP; import static net.runelite.client.plugins.banktags.BankTagsPlugin.ICON_SEARCH; import static net.runelite.client.plugins.banktags.BankTagsPlugin.SPLITTER; import static net.runelite.client.plugins.banktags.BankTagsPlugin.TAG_SEARCH; +import static net.runelite.client.plugins.banktags.BankTagsPlugin.VAR_TAG_SUFFIX; import net.runelite.client.plugins.banktags.TagManager; import net.runelite.client.util.ColorUtil; import net.runelite.client.util.Text; @@ -453,7 +455,7 @@ public class TabInterface { for (Integer item : items) { - tagManager.addTag(item, activeTab.getTag()); + tagManager.addTag(item, activeTab.getTag(), false); } openTag(TAG_SEARCH + activeTab.getTag()); @@ -472,7 +474,7 @@ public class TabInterface for (Integer item : items) { - tagManager.addTags(item, tags); + tagManager.addTags(item, tags, false); } updateTabIfActive(tags); @@ -590,7 +592,8 @@ public class TabInterface while (dataIter.hasNext()) { - tagManager.addTag(Integer.valueOf(dataIter.next()), name); + final int itemId = Integer.valueOf(dataIter.next()); + tagManager.addTag(itemId, name, itemId < 0); } loadTab(name); @@ -620,7 +623,7 @@ public class TabInterface } } - public void handleDrag(boolean isDragging) + public void handleDrag(boolean isDragging, boolean shiftDown) { if (isHidden()) { @@ -643,8 +646,8 @@ public class TabInterface // Tag an item dragged on a tag tab if (draggedOn.getId() == parent.getId()) { - int itemId = draggedWidget.getItemId(); - tagManager.addTag(itemId, draggedOn.getName()); + tagManager.addTag(draggedWidget.getItemId(), draggedOn.getName(), shiftDown); + updateTabIfActive(Lists.newArrayList(Text.standardize(draggedOn.getName()))); } } else if (parent.getId() == draggedOn.getId() && parent.getId() == draggedWidget.getId()) @@ -668,7 +671,7 @@ public class TabInterface if (draggedWidget.getItemId() > 0 && entry.getOption().equals(VIEW_TAB) && draggedOn.getId() != draggedWidget.getId()) { - entry.setOption(TAG_SEARCH + Text.removeTags(entry.getTarget())); + entry.setOption(TAG_SEARCH + Text.removeTags(entry.getTarget()) + (shiftDown ? VAR_TAG_SUFFIX : "")); entry.setTarget(draggedWidget.getName()); client.setMenuEntries(entries); }