Add ability to set/read tags on varations of items

Add ability to tag all variations of item in bank tags when holding
shift.

Closes #3767

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
Ron Young
2018-10-24 13:51:18 -05:00
committed by Tomas Slusny
parent 7d4fa67af6
commit 8dea5bc486
3 changed files with 142 additions and 42 deletions

View File

@@ -30,10 +30,14 @@ import com.google.common.base.Joiner;
import com.google.common.base.Splitter; import com.google.common.base.Splitter;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.google.inject.Provides; import com.google.inject.Provides;
import java.awt.event.KeyEvent;
import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelEvent;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.Collection;
import java.util.Objects; import java.util.Objects;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.inject.Inject; import javax.inject.Inject;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.InventoryID; import net.runelite.api.InventoryID;
@@ -45,6 +49,7 @@ import net.runelite.api.MenuEntry;
import net.runelite.api.VarClientStr; import net.runelite.api.VarClientStr;
import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.DraggingWidgetChanged; import net.runelite.api.events.DraggingWidgetChanged;
import net.runelite.api.events.FocusChanged;
import net.runelite.api.events.GameTick; import net.runelite.api.events.GameTick;
import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuEntryAdded;
import net.runelite.api.events.MenuOptionClicked; 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.config.ConfigManager;
import net.runelite.client.game.ChatboxInputManager; import net.runelite.client.game.ChatboxInputManager;
import net.runelite.client.game.ItemManager; 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.MouseManager;
import net.runelite.client.input.MouseWheelListener; import net.runelite.client.input.MouseWheelListener;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
@@ -72,7 +79,7 @@ import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin;
tags = {"searching", "tagging"} tags = {"searching", "tagging"}
) )
@PluginDependency(ClueScrollPlugin.class) @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 Splitter SPLITTER = Splitter.on(",").omitEmptyStrings().trimResults();
public static final Joiner JOINER = Joiner.on(",").skipNulls(); 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 TAG_SEARCH = "tag:";
public static final String EDIT_TAGS_MENU_OPTION = "Edit-tags"; public static final String EDIT_TAGS_MENU_OPTION = "Edit-tags";
public static final String ICON_SEARCH = "icon_"; public static final String ICON_SEARCH = "icon_";
public static final String VAR_TAG_SUFFIX = "*";
private static final String SEARCH_BANK_INPUT_TEXT = private static final String SEARCH_BANK_INPUT_TEXT =
"Show items whose names or tags contain the following text:<br>" + "Show items whose names or tags contain the following text:<br>" +
@@ -112,6 +120,11 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
@Inject @Inject
private TabInterface tabInterface; private TabInterface tabInterface;
@Inject
private KeyManager keyManager;
private boolean shiftPressed = false;
@Provides @Provides
BankTagsConfig getConfig(ConfigManager configManager) BankTagsConfig getConfig(ConfigManager configManager)
{ {
@@ -121,6 +134,7 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
@Override @Override
public void startUp() public void startUp()
{ {
keyManager.registerKeyListener(this);
mouseManager.registerMouseWheelListener(this); mouseManager.registerMouseWheelListener(this);
clientThread.invokeLater(tabInterface::init); clientThread.invokeLater(tabInterface::init);
client.getSpriteOverrides().putAll(TabSprites.toMap(client)); client.getSpriteOverrides().putAll(TabSprites.toMap(client));
@@ -129,6 +143,7 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
@Override @Override
public void shutDown() public void shutDown()
{ {
keyManager.unregisterKeyListener(this);
mouseManager.unregisterMouseWheelListener(this); mouseManager.unregisterMouseWheelListener(this);
clientThread.invokeLater(tabInterface::destroy); clientThread.invokeLater(tabInterface::destroy);
@@ -136,6 +151,8 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
{ {
client.getSpriteOverrides().remove(value.getSpriteId()); client.getSpriteOverrides().remove(value.getSpriteId());
} }
shiftPressed = false;
} }
@Subscribe @Subscribe
@@ -202,11 +219,13 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
Widget item = container.getChild(event.getActionParam0()); Widget item = container.getChild(event.getActionParam0());
int itemID = item.getItemId(); int itemID = item.getItemId();
String text = EDIT_TAGS_MENU_OPTION; 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) if (tagCount > 0)
{ {
text += " (" + tagCount + ")"; text += " (" + tagCount + ")";
} }
MenuEntry editTags = new MenuEntry(); MenuEntry editTags = new MenuEntry();
editTags.setParam0(event.getActionParam0()); editTags.setParam0(event.getActionParam0());
editTags.setParam1(event.getActionParam1()); editTags.setParam1(event.getActionParam1());
@@ -249,24 +268,40 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
int itemId = item.getId(); int itemId = item.getId();
ItemComposition itemComposition = itemManager.getItemComposition(itemId); ItemComposition itemComposition = itemManager.getItemComposition(itemId);
String itemName = itemComposition.getName(); String name = itemComposition.getName();
String initialValue = tagManager.getTagString(itemId);
chatboxInputManager.openInputWindow(itemName + " tags:", initialValue, (newTags) -> // Get both tags and vartags and append * to end of vartags name
Collection<String> 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:<br>(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; return;
} }
tagManager.setTagString(itemId, newTags); // Split inputted tags to vartags (ending with *) and regular tags
final Collection<String> newTags = new ArrayList<>(SPLITTER.splitToList(newValue.toLowerCase()));
final Collection<String> 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 // 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 // the tag got added in new tags
final List<String> initialTags = SPLITTER.splitToList(initialValue.toLowerCase()); tabInterface.updateTabIfActive(SPLITTER.splitToList(initialValue.toLowerCase().replaceAll(Pattern.quote(VAR_TAG_SUFFIX), "")));
final List<String> tags = SPLITTER.splitToList(newTags.toLowerCase()); tabInterface.updateTabIfActive(SPLITTER.splitToList(newValue.toLowerCase().replaceAll(Pattern.quote(VAR_TAG_SUFFIX), "")));
tabInterface.updateTabIfActive(initialTags);
tabInterface.updateTabIfActive(tags);
}); });
} }
else else
@@ -300,7 +335,7 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
@Subscribe @Subscribe
public void onDraggingWidgetChanged(DraggingWidgetChanged event) public void onDraggingWidgetChanged(DraggingWidgetChanged event)
{ {
tabInterface.handleDrag(event.isDraggingWidget()); tabInterface.handleDrag(event.isDraggingWidget(), shiftPressed);
} }
@Subscribe @Subscribe
@@ -312,10 +347,42 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener
} }
} }
@Subscribe
public void onFocusChanged(FocusChanged event)
{
if (!event.isFocused())
{
shiftPressed = false;
}
}
@Override @Override
public MouseWheelEvent mouseWheelMoved(MouseWheelEvent event) public MouseWheelEvent mouseWheelMoved(MouseWheelEvent event)
{ {
tabInterface.handleWheel(event); tabInterface.handleWheel(event);
return 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;
}
}
} }

View File

@@ -35,6 +35,7 @@ import javax.inject.Singleton;
import net.runelite.api.ItemID; import net.runelite.api.ItemID;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.game.ItemManager; 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.CONFIG_GROUP;
import static net.runelite.client.plugins.banktags.BankTagsPlugin.JOINER; import static net.runelite.client.plugins.banktags.BankTagsPlugin.JOINER;
import static net.runelite.client.plugins.banktags.BankTagsPlugin.SPLITTER; import static net.runelite.client.plugins.banktags.BankTagsPlugin.SPLITTER;
@@ -52,22 +53,25 @@ import net.runelite.client.util.Text;
public class TagManager public class TagManager
{ {
private static final String ITEM_KEY_PREFIX = "item_"; private static final String ITEM_KEY_PREFIX = "item_";
private final ItemManager itemManager;
private final ConfigManager configManager; private final ConfigManager configManager;
private final ItemManager itemManager;
private final ClueScrollService clueScrollService; private final ClueScrollService clueScrollService;
@Inject @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.itemManager = itemManager;
this.configManager = configManager; this.configManager = configManager;
this.clueScrollService = clueScrollService; 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); String config = configManager.getConfiguration(CONFIG_GROUP, ITEM_KEY_PREFIX + itemId);
if (config == null) if (config == null)
{ {
@@ -77,14 +81,15 @@ public class TagManager
return config; return config;
} }
Collection<String> getTags(int itemId) Collection<String> 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)) if (Strings.isNullOrEmpty(tags))
{ {
configManager.unsetConfiguration(CONFIG_GROUP, ITEM_KEY_PREFIX + itemId); configManager.unsetConfiguration(CONFIG_GROUP, ITEM_KEY_PREFIX + itemId);
@@ -95,27 +100,27 @@ public class TagManager
} }
} }
public void addTags(int itemId, final Collection<String> t) public void addTags(int itemId, final Collection<String> t, boolean variation)
{ {
final Collection<String> tags = getTags(itemId); final Collection<String> tags = getTags(itemId, variation);
if (tags.addAll(t)) 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<String> tags = getTags(itemId); final Collection<String> tags = getTags(itemId, variation);
if (tags.add(Text.standardize(tag))) if (tags.add(Text.standardize(tag)))
{ {
setTags(itemId, tags); setTags(itemId, tags, variation);
} }
} }
private void setTags(int itemId, Collection<String> tags) private void setTags(int itemId, Collection<String> tags, boolean variation)
{ {
setTagString(itemId, JOINER.join(tags)); setTagString(itemId, JOINER.join(tags), variation);
} }
boolean findTag(int itemId, String search) boolean findTag(int itemId, String search)
@@ -125,7 +130,9 @@ public class TagManager
return true; return true;
} }
return getTags(itemId).stream().anyMatch(tag -> tag.contains(Text.standardize(search))); Collection<String> tags = getTags(itemId, false);
tags.addAll(getTags(itemId, true));
return tags.stream().anyMatch(tag -> tag.contains(Text.standardize(search)));
} }
public List<Integer> getItemsForTag(String tag) public List<Integer> getItemsForTag(String tag)
@@ -133,23 +140,46 @@ public class TagManager
final String prefix = CONFIG_GROUP + "." + ITEM_KEY_PREFIX; final String prefix = CONFIG_GROUP + "." + ITEM_KEY_PREFIX;
return configManager.getConfigurationKeys(prefix).stream() return configManager.getConfigurationKeys(prefix).stream()
.map(item -> Integer.parseInt(item.replace(prefix, ""))) .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()); .collect(Collectors.toList());
} }
public void removeTag(String tag) public void removeTag(String tag)
{ {
final String prefix = CONFIG_GROUP + "." + ITEM_KEY_PREFIX; 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) public void removeTag(int itemId, String tag)
{ {
final Collection<String> tags = getTags(itemId); Collection<String> tags = getTags(itemId, false);
if (tags.remove(Text.standardize(tag))) 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) private boolean testClue(int itemId)

View File

@@ -26,6 +26,7 @@
package net.runelite.client.plugins.banktags.tabs; package net.runelite.client.plugins.banktags.tabs;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import java.awt.Color; import java.awt.Color;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.Toolkit; 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.ICON_SEARCH;
import static net.runelite.client.plugins.banktags.BankTagsPlugin.SPLITTER; 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.TAG_SEARCH;
import static net.runelite.client.plugins.banktags.BankTagsPlugin.VAR_TAG_SUFFIX;
import net.runelite.client.plugins.banktags.TagManager; import net.runelite.client.plugins.banktags.TagManager;
import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ColorUtil;
import net.runelite.client.util.Text; import net.runelite.client.util.Text;
@@ -453,7 +455,7 @@ public class TabInterface
{ {
for (Integer item : items) for (Integer item : items)
{ {
tagManager.addTag(item, activeTab.getTag()); tagManager.addTag(item, activeTab.getTag(), false);
} }
openTag(TAG_SEARCH + activeTab.getTag()); openTag(TAG_SEARCH + activeTab.getTag());
@@ -472,7 +474,7 @@ public class TabInterface
for (Integer item : items) for (Integer item : items)
{ {
tagManager.addTags(item, tags); tagManager.addTags(item, tags, false);
} }
updateTabIfActive(tags); updateTabIfActive(tags);
@@ -590,7 +592,8 @@ public class TabInterface
while (dataIter.hasNext()) 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); loadTab(name);
@@ -620,7 +623,7 @@ public class TabInterface
} }
} }
public void handleDrag(boolean isDragging) public void handleDrag(boolean isDragging, boolean shiftDown)
{ {
if (isHidden()) if (isHidden())
{ {
@@ -643,8 +646,8 @@ public class TabInterface
// Tag an item dragged on a tag tab // Tag an item dragged on a tag tab
if (draggedOn.getId() == parent.getId()) if (draggedOn.getId() == parent.getId())
{ {
int itemId = draggedWidget.getItemId(); tagManager.addTag(draggedWidget.getItemId(), draggedOn.getName(), shiftDown);
tagManager.addTag(itemId, draggedOn.getName()); updateTabIfActive(Lists.newArrayList(Text.standardize(draggedOn.getName())));
} }
} }
else if (parent.getId() == draggedOn.getId() && parent.getId() == draggedWidget.getId()) 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()) 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()); entry.setTarget(draggedWidget.getName());
client.setMenuEntries(entries); client.setMenuEntries(entries);
} }