From ddb5dd858f2da2af4f8fb29b51029376caf83fc0 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Wed, 9 Nov 2016 15:37:35 +0100 Subject: [PATCH] New grid filter system, fixes #602 --- CHANGELOG.md | 5 ++ .../refinedstorage/gui/grid/GuiGrid.java | 63 +++++-------------- .../grid/filtering/GridFilterCraftable.java | 22 +++++++ .../filtering/GridFilterFilteredItem.java | 24 +++++++ .../gui/grid/filtering/GridFilterMod.java | 38 +++++++++++ .../gui/grid/filtering/GridFilterName.java | 21 +++++++ .../gui/grid/filtering/GridFilterParser.java | 36 +++++++++++ .../gui/grid/filtering/GridFilterTooltip.java | 29 +++++++++ .../gui/grid/filtering/IGridFilter.java | 9 +++ 9 files changed, 200 insertions(+), 47 deletions(-) create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterCraftable.java create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterFilteredItem.java create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterMod.java create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterName.java create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterParser.java create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterTooltip.java create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/IGridFilter.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7087157fe..bcf2f3544 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Refined Storage Changelog +### 1.2.4 +- Added tooltip search with # (raoulvdberge) +- Mod search can now also take mod name instead of just id (raoulvdberge) +- Fixed bug where Disk Manipulator doesn't save disks (raoulvdberge) + ### 1.2.3 - Fixed fluid cache updating wrongly (raoulvdberge) - Fixed Exporter scheduling too many crafting tasks (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java index 788c96c66..06f0a23aa 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java @@ -5,11 +5,13 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; -import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.block.EnumGridType; import com.raoulvdberge.refinedstorage.container.ContainerGrid; import com.raoulvdberge.refinedstorage.gui.GuiBase; import com.raoulvdberge.refinedstorage.gui.Scrollbar; +import com.raoulvdberge.refinedstorage.gui.grid.filtering.GridFilterMod; +import com.raoulvdberge.refinedstorage.gui.grid.filtering.GridFilterParser; +import com.raoulvdberge.refinedstorage.gui.grid.filtering.IGridFilter; import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSortingName; import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSortingQuantity; import com.raoulvdberge.refinedstorage.gui.grid.stack.ClientStackFluid; @@ -142,67 +144,34 @@ public class GuiGrid extends GuiBase { if (grid.isConnected()) { stacks.addAll(grid.getType() == EnumGridType.FLUID ? FLUIDS.values() : ITEMS.values()); - String query = searchField.getText().trim().toLowerCase(); + List filters = GridFilterParser.getFilters(grid, searchField.getText()); Iterator t = stacks.iterator(); while (t.hasNext()) { IClientStack stack = t.next(); - if (grid.getType() != EnumGridType.FLUID) { - List filteredItems = grid.getFilteredItems(); + int accepts = 0; + IGridFilter previous = null; - boolean found = filteredItems.isEmpty(); + for (IGridFilter filter : filters) { + if (!filter.accepts(stack)) { + if (filter.isStrong() || previous instanceof GridFilterMod) { + // avoid removing twice + accepts = -1; - for (GridFilteredItem filteredItem : filteredItems) { - if (API.instance().getComparer().isEqual(((ClientStackItem) stack).getStack(), filteredItem.getStack(), filteredItem.getCompare())) { - found = true; + t.remove(); break; } + } else { + accepts++; } - if (!found) { - t.remove(); - - continue; - } - - if (grid.getViewType() == TileGrid.VIEW_TYPE_NON_CRAFTABLES && ((ClientStackItem) stack).isCraftable()) { - t.remove(); - - continue; - } else if (grid.getViewType() == TileGrid.VIEW_TYPE_CRAFTABLES && !((ClientStackItem) stack).isCraftable()) { - t.remove(); - - continue; - } + previous = filter; } - if (query.startsWith("@")) { - String[] parts = query.split(" "); - - String modId = parts[0].substring(1); - String modIdFromItem = stack.getModId(); - - if (!modIdFromItem.contains(modId)) { - t.remove(); - } else if (parts.length >= 2) { - StringBuilder itemFromMod = new StringBuilder(); - - for (int i = 1; i < parts.length; ++i) { - itemFromMod.append(parts[i]); - - if (i != parts.length - 1) { - itemFromMod.append(" "); - } - } - - if (!stack.getName().toLowerCase().contains(itemFromMod.toString())) { - t.remove(); - } - } - } else if (!stack.getName().toLowerCase().contains(query)) { + if (accepts == 0) { t.remove(); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterCraftable.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterCraftable.java new file mode 100755 index 000000000..e4e570ec2 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterCraftable.java @@ -0,0 +1,22 @@ +package com.raoulvdberge.refinedstorage.gui.grid.filtering; + +import com.raoulvdberge.refinedstorage.gui.grid.stack.ClientStackItem; +import com.raoulvdberge.refinedstorage.gui.grid.stack.IClientStack; + +public class GridFilterCraftable implements IGridFilter { + private boolean craftable; + + public GridFilterCraftable(boolean craftable) { + this.craftable = craftable; + } + + @Override + public boolean accepts(IClientStack stack) { + return stack instanceof ClientStackItem && ((ClientStackItem) stack).isCraftable() == craftable; + } + + @Override + public boolean isStrong() { + return true; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterFilteredItem.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterFilteredItem.java new file mode 100755 index 000000000..794d67a92 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterFilteredItem.java @@ -0,0 +1,24 @@ +package com.raoulvdberge.refinedstorage.gui.grid.filtering; + +import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.gui.grid.GridFilteredItem; +import com.raoulvdberge.refinedstorage.gui.grid.stack.ClientStackItem; +import com.raoulvdberge.refinedstorage.gui.grid.stack.IClientStack; + +public class GridFilterFilteredItem implements IGridFilter { + private GridFilteredItem filteredItem; + + public GridFilterFilteredItem(GridFilteredItem filteredItem) { + this.filteredItem = filteredItem; + } + + @Override + public boolean accepts(IClientStack stack) { + return API.instance().getComparer().isEqual(((ClientStackItem) stack).getStack(), filteredItem.getStack(), filteredItem.getCompare()); + } + + @Override + public boolean isStrong() { + return true; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterMod.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterMod.java new file mode 100755 index 000000000..473697dc3 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterMod.java @@ -0,0 +1,38 @@ +package com.raoulvdberge.refinedstorage.gui.grid.filtering; + +import com.raoulvdberge.refinedstorage.gui.grid.stack.IClientStack; +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; + +public class GridFilterMod implements IGridFilter { + private String modName; + + public GridFilterMod(String modName) { + this.modName = modName.toLowerCase().replace(" ", ""); + } + + private String getModNameFromModId(String id) { + ModContainer container = Loader.instance().getActiveModList().stream() + .filter(m -> m.getModId().toLowerCase().equals(id)) + .findFirst() + .orElse(null); + + return container == null ? id : container.getName().toLowerCase().replace(" ", ""); + } + + @Override + public boolean accepts(IClientStack stack) { + String otherModId = stack.getModId().toLowerCase(); + + if (!getModNameFromModId(otherModId).contains(modName)) { + return stack.getModId().contains(modName); + } + + return true; + } + + @Override + public boolean isStrong() { + return true; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterName.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterName.java new file mode 100755 index 000000000..b5e3f5d9f --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterName.java @@ -0,0 +1,21 @@ +package com.raoulvdberge.refinedstorage.gui.grid.filtering; + +import com.raoulvdberge.refinedstorage.gui.grid.stack.IClientStack; + +public class GridFilterName implements IGridFilter { + private String name; + + public GridFilterName(String name) { + this.name = name.toLowerCase(); + } + + @Override + public boolean accepts(IClientStack stack) { + return stack.getName().toLowerCase().contains(name); + } + + @Override + public boolean isStrong() { + return false; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterParser.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterParser.java new file mode 100755 index 000000000..a745551a5 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterParser.java @@ -0,0 +1,36 @@ +package com.raoulvdberge.refinedstorage.gui.grid.filtering; + +import com.raoulvdberge.refinedstorage.gui.grid.GridFilteredItem; +import com.raoulvdberge.refinedstorage.tile.grid.IGrid; +import com.raoulvdberge.refinedstorage.tile.grid.TileGrid; + +import java.util.LinkedList; +import java.util.List; + +public class GridFilterParser { + public static List getFilters(IGrid grid, String query) { + List filters = new LinkedList<>(); + + for (String part : query.toLowerCase().trim().split(" ")) { + if (part.startsWith("@")) { + filters.add(new GridFilterMod(part.substring(1))); + } else if (part.startsWith("#")) { + filters.add(new GridFilterTooltip(part.substring(1))); + } else { + filters.add(new GridFilterName(part)); + } + } + + if (grid.getViewType() == TileGrid.VIEW_TYPE_NON_CRAFTABLES) { + filters.add(new GridFilterCraftable(false)); + } else if (grid.getViewType() == TileGrid.VIEW_TYPE_CRAFTABLES) { + filters.add(new GridFilterCraftable(true)); + } + + for (GridFilteredItem filteredItem : grid.getFilteredItems()) { + filters.add(new GridFilterFilteredItem(filteredItem)); + } + + return filters; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterTooltip.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterTooltip.java new file mode 100755 index 000000000..a0faf8045 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterTooltip.java @@ -0,0 +1,29 @@ +package com.raoulvdberge.refinedstorage.gui.grid.filtering; + +import com.raoulvdberge.refinedstorage.gui.grid.stack.IClientStack; + +public class GridFilterTooltip implements IGridFilter { + private String tooltip; + + public GridFilterTooltip(String tooltip) { + this.tooltip = tooltip.toLowerCase(); + } + + @Override + public boolean accepts(IClientStack stack) { + String otherTooltip = stack.getTooltip().trim().toLowerCase(); + + if (!otherTooltip.contains("\n")) { + return false; + } + + otherTooltip = otherTooltip.substring(otherTooltip.indexOf('\n') + 1); // Remove the first line as that states the item name + + return otherTooltip.contains(tooltip); + } + + @Override + public boolean isStrong() { + return false; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/IGridFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/IGridFilter.java new file mode 100755 index 000000000..6d58a8ce0 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/IGridFilter.java @@ -0,0 +1,9 @@ +package com.raoulvdberge.refinedstorage.gui.grid.filtering; + +import com.raoulvdberge.refinedstorage.gui.grid.stack.IClientStack; + +public interface IGridFilter { + boolean accepts(IClientStack stack); + + boolean isStrong(); +}