diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java index dd741bd60..d660413bb 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java @@ -15,6 +15,9 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerGrid extends ContainerBase { + public static final int TAB_WIDTH = 28; + public static final int TAB_HEIGHT = 31; + private IGrid grid; private SlotGridCraftingResult craftingResultSlot; @@ -25,11 +28,11 @@ public class ContainerGrid extends ContainerBase { this.grid = grid; - addPlayerInventory(8, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 165 : 126); + addPlayerInventory(8, ((grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 165 : 126) + getTabDelta()); if (grid.getType() == EnumGridType.CRAFTING) { int x = 26; - int y = 96; + int y = 96 + getTabDelta(); for (int i = 0; i < 9; ++i) { addSlotToContainer(new SlotGridCrafting(((TileGrid) grid).getMatrix(), i, x, y)); @@ -42,10 +45,10 @@ public class ContainerGrid extends ContainerBase { } } - addSlotToContainer(craftingResultSlot = new SlotGridCraftingResult(this, player, (TileGrid) grid, 0, 130 + 4, 110 + 4)); + addSlotToContainer(craftingResultSlot = new SlotGridCraftingResult(this, player, (TileGrid) grid, 0, 130 + 4, 110 + 4 + getTabDelta())); } else if (grid.getType() == EnumGridType.PATTERN) { int x = 8; - int y = 96; + int y = 96 + getTabDelta(); for (int i = 0; i < 9; ++i) { addSlotToContainer(new SlotFilterLegacy(((TileGrid) grid).getMatrix(), i, x, y)); @@ -58,19 +61,23 @@ public class ContainerGrid extends ContainerBase { } } - addSlotToContainer(patternResultSlot = new SlotDisabled(((TileGrid) grid).getResult(), 0, 112 + 4, 110 + 4)); + addSlotToContainer(patternResultSlot = new SlotDisabled(((TileGrid) grid).getResult(), 0, 112 + 4, 110 + 4 + getTabDelta())); - addSlotToContainer(new SlotItemHandler(((TileGrid) grid).getPatterns(), 0, 152, 96)); - addSlotToContainer(new SlotOutput(((TileGrid) grid).getPatterns(), 1, 152, 132)); + addSlotToContainer(new SlotItemHandler(((TileGrid) grid).getPatterns(), 0, 152, 96 + getTabDelta())); + addSlotToContainer(new SlotOutput(((TileGrid) grid).getPatterns(), 1, 152, 132 + getTabDelta())); } if (grid.getType() != EnumGridType.FLUID) { for (int i = 0; i < 4; ++i) { - addSlotToContainer(new SlotItemHandler(grid.getFilter(), i, 204, 6 + (18 * i))); + addSlotToContainer(new SlotItemHandler(grid.getFilter(), i, 204, 6 + (18 * i) + getTabDelta())); } } } + private int getTabDelta() { + return !grid.getTabs().isEmpty() ? TAB_HEIGHT - 4 : 0; + } + public IGrid getGrid() { return grid; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java index 2b31c71d9..cf2f1310c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java @@ -49,8 +49,9 @@ public abstract class GuiBase extends GuiContainer { } } + protected int sideButtonYStart = 6; private int lastButtonId; - private int lastSideButtonY = 6; + private int lastSideButtonY = sideButtonYStart; protected int width; protected int height; @@ -75,7 +76,7 @@ public abstract class GuiBase extends GuiContainer { super.initGui(); lastButtonId = 0; - lastSideButtonY = 6; + lastSideButtonY = sideButtonYStart; init(guiLeft, guiTop); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GridTab.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GridTab.java new file mode 100755 index 000000000..bbb89eab5 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GridTab.java @@ -0,0 +1,29 @@ +package com.raoulvdberge.refinedstorage.gui.grid; + +import net.minecraft.item.ItemStack; + +import java.util.List; + +public class GridTab { + private List filters; + private String name; + private ItemStack icon; + + public GridTab(List filters, String name, ItemStack icon) { + this.filters = filters; + this.name = name; + this.icon = icon; + } + + public List getFilters() { + return filters; + } + + public String getName() { + return name; + } + + public ItemStack getIcon() { + return icon; + } +} 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 29e249daa..57bfdffcf 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java @@ -61,6 +61,9 @@ public class GuiGrid extends GuiBase { private ContainerGrid container; private IGrid grid; + private int tabSelected = -1; + private int tabHovering = -1; + private int slotNumber; private Deque konami = new ArrayDeque<>(Arrays.asList( @@ -84,13 +87,17 @@ public class GuiGrid extends GuiBase { } public GuiGrid(ContainerGrid container, IGrid grid) { - super(container, grid.getType() == EnumGridType.FLUID ? 193 : 227, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 247 : 208); + super(container, grid.getType() == EnumGridType.FLUID ? 193 : 227, ((grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 247 : 208) + (!grid.getTabs().isEmpty() ? ContainerGrid.TAB_HEIGHT : 0)); this.container = container; this.grid = grid; this.wasConnected = this.grid.isActive(); - this.scrollbar = new Scrollbar(174, 20, 12, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN || grid.getType() == EnumGridType.FLUID) ? 70 : 88); + this.scrollbar = new Scrollbar(174, 20 + getTabDelta(), 12, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN || grid.getType() == EnumGridType.FLUID) ? 70 : 88); + + if (!grid.getTabs().isEmpty()) { + sideButtonYStart += ContainerGrid.TAB_HEIGHT - 3; + } this.konamiOffsetsX = new int[9 * getVisibleRows()]; this.konamiOffsetsY = new int[9 * getVisibleRows()]; @@ -103,7 +110,7 @@ public class GuiGrid extends GuiBase { } int sx = x + 80 + 1; - int sy = y + 6 + 1; + int sy = y + 6 + 1 + getTabDelta(); if (searchField == null) { searchField = new GuiTextField(0, fontRendererObj, sx, sy, 88 - 6, fontRendererObj.FONT_HEIGHT); @@ -118,7 +125,7 @@ public class GuiGrid extends GuiBase { } if (grid.getType() == EnumGridType.PATTERN) { - oredictPattern = addCheckBox(x + 64, y + 138, t("misc.refinedstorage:oredict"), TileGrid.OREDICT_PATTERN.getValue()); + oredictPattern = addCheckBox(x + 64, y + 138 + getTabDelta(), t("misc.refinedstorage:oredict"), TileGrid.OREDICT_PATTERN.getValue()); } if (grid.getType() != EnumGridType.FLUID) { @@ -142,7 +149,7 @@ public class GuiGrid extends GuiBase { if (grid.isActive()) { stacks.addAll(grid.getType() == EnumGridType.FLUID ? FLUIDS.values() : ITEMS.values()); - List filters = GridFilterParser.getFilters(grid, searchField.getText()); + List filters = GridFilterParser.getFilters(grid, searchField.getText(), (tabSelected >= 0 && tabSelected < grid.getTabs().size()) ? grid.getTabs().get(tabSelected).getFilters() : grid.getFilteredItems()); Iterator t = stacks.iterator(); @@ -209,7 +216,7 @@ public class GuiGrid extends GuiBase { } public boolean isOverSlotArea(int mouseX, int mouseY) { - return inBounds(7, 19, 162, 18 * getVisibleRows(), mouseX, mouseY); + return inBounds(7, 19 + getTabDelta(), 162, 18 * getVisibleRows(), mouseX, mouseY); } private int getVisibleRows() { @@ -219,20 +226,75 @@ public class GuiGrid extends GuiBase { private boolean isOverClear(int mouseX, int mouseY) { switch (grid.getType()) { case CRAFTING: - return inBounds(82, 95, 7, 7, mouseX, mouseY); + return inBounds(82, 95 + getTabDelta(), 7, 7, mouseX, mouseY); case PATTERN: - return inBounds(64, 95, 7, 7, mouseX, mouseY); + return inBounds(64, 95 + getTabDelta(), 7, 7, mouseX, mouseY); default: return false; } } private boolean isOverCreatePattern(int mouseX, int mouseY) { - return grid.getType() == EnumGridType.PATTERN && inBounds(152, 114, 16, 16, mouseX, mouseY) && ((TileGrid) grid).canCreatePattern(); + return grid.getType() == EnumGridType.PATTERN && inBounds(152, 114 + getTabDelta(), 16, 16, mouseX, mouseY) && ((TileGrid) grid).canCreatePattern(); + } + + private int getTabDelta() { + return !grid.getTabs().isEmpty() ? ContainerGrid.TAB_HEIGHT - 4 : 0; + } + + private void renderTab(GridTab tab, boolean foregroundLayer, int x, int y, int mouseX, int mouseY) { + int i = grid.getTabs().indexOf(tab); + boolean selected = i == tabSelected; + + if ((foregroundLayer && !selected) || (!foregroundLayer && selected)) { + return; + } + + int tx = x + ((ContainerGrid.TAB_WIDTH + 2) * i); + int ty = y; + + bindTexture("icons.png"); + + if (!selected) { + ty += 3; + } + + int uvx = 0, uvy = 225; + int tbw = ContainerGrid.TAB_WIDTH; + int otx = tx; + + if (selected) { + uvx = 227; + + if (i > 0) { + uvx = 226; + uvy = 194; + tbw++; + tx--; + } + } else { + uvx = 199; + } + + drawTexture(tx, ty, uvx, uvy, tbw, ContainerGrid.TAB_HEIGHT); + + RenderHelper.enableGUIStandardItemLighting(); + + drawItem(otx + 6, ty + 8 - (!selected ? 3 : 0), tab.getIcon()); + + if (inBounds(tx, ty, ContainerGrid.TAB_WIDTH, ContainerGrid.TAB_HEIGHT, mouseX, mouseY)) { + tabHovering = i; + } } @Override public void drawBackground(int x, int y, int mouseX, int mouseY) { + tabHovering = -1; + + for (GridTab tab : grid.getTabs()) { + renderTab(tab, false, x, y, mouseX, mouseY); + } + if (grid.getType() == EnumGridType.CRAFTING) { bindTexture("gui/crafting_grid.png"); } else if (grid.getType() == EnumGridType.PATTERN) { @@ -241,7 +303,11 @@ public class GuiGrid extends GuiBase { bindTexture("gui/grid.png"); } - drawTexture(x, y, 0, 0, width, height); + drawTexture(x, y + getTabDelta(), 0, 0, width, height - (!grid.getTabs().isEmpty() ? ContainerGrid.TAB_HEIGHT : 0)); + + for (GridTab tab : grid.getTabs()) { + renderTab(tab, true, x, y, mouseX, mouseY); + } if (grid.getType() == EnumGridType.PATTERN) { int ty = 0; @@ -254,7 +320,7 @@ public class GuiGrid extends GuiBase { ty = 2; } - drawTexture(x + 152, y + 114, 240, ty * 16, 16, 16); + drawTexture(x + 152, y + 114 + getTabDelta(), 240, ty * 16, 16, 16); } searchField.drawTextBox(); @@ -262,11 +328,11 @@ public class GuiGrid extends GuiBase { @Override public void drawForeground(int mouseX, int mouseY) { - drawString(7, 7, t(grid.getGuiTitle())); - drawString(7, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 153 : 114, t("container.inventory")); + drawString(7, 7 + getTabDelta(), t(grid.getGuiTitle())); + drawString(7, ((grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 153 : 114) + getTabDelta(), t("container.inventory")); int x = 8; - int y = 20; + int y = 20 + getTabDelta(); this.slotNumber = -1; @@ -321,6 +387,10 @@ public class GuiGrid extends GuiBase { if (isOverCreatePattern(mouseX, mouseY)) { drawTooltip(mouseX, mouseY, t("gui.refinedstorage:grid.pattern_create")); } + + if (tabHovering >= 0 && tabHovering < grid.getTabs().size()) { + drawTooltip(mouseX, mouseY, grid.getTabs().get(tabHovering).getName()); + } } @Override @@ -338,7 +408,13 @@ public class GuiGrid extends GuiBase { searchField.mouseClicked(mouseX, mouseY, clickedButton); - if (clickedButton == 1 && inBounds(79, 5, 90, 12, mouseX - guiLeft, mouseY - guiTop)) { + if (tabHovering != -1) { + tabSelected = tabSelected == tabHovering ? -1 : tabHovering; + + sortItems(); + } + + if (clickedButton == 1 && inBounds(79, 5 + getTabDelta(), 90, 12, mouseX - guiLeft, mouseY - guiTop)) { searchField.setText(""); searchField.setFocused(true); @@ -347,8 +423,8 @@ public class GuiGrid extends GuiBase { updateJEI(); } - boolean clickedClear = clickedButton == 0 && isOverClear(mouseX - guiLeft, mouseY - guiTop); - boolean clickedCreatePattern = clickedButton == 0 && isOverCreatePattern(mouseX - guiLeft, mouseY - guiTop); + boolean clickedClear = clickedButton == 0 && isOverClear(mouseX - guiLeft, mouseY - guiTop + getTabDelta()); + boolean clickedCreatePattern = clickedButton == 0 && isOverCreatePattern(mouseX - guiLeft, mouseY - guiTop + getTabDelta()); if (clickedCreatePattern) { BlockPos gridPos = ((TileGrid) grid).getPos(); 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 index 0e251326d..3c101376a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterParser.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterParser.java @@ -1,5 +1,6 @@ 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; @@ -7,7 +8,7 @@ import java.util.LinkedList; import java.util.List; public class GridFilterParser { - public static List getFilters(IGrid grid, String query) { + public static List getFilters(IGrid grid, String query, List itemFilters) { List filters = new LinkedList<>(); for (String part : query.toLowerCase().trim().split(" ")) { @@ -26,8 +27,8 @@ public class GridFilterParser { filters.add(new GridFilterCraftable(true)); } - if (!grid.getFilteredItems().isEmpty()) { - filters.add(new GridFilterFilteredItems(grid.getFilteredItems())); + if (!itemFilters.isEmpty()) { + filters.add(new GridFilterFilteredItems(itemFilters)); } return filters; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerGridFilterInGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerGridFilterInGrid.java index a4039afda..772205b4a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerGridFilterInGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerGridFilterInGrid.java @@ -2,21 +2,25 @@ package com.raoulvdberge.refinedstorage.inventory; import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.gui.grid.GridFilteredItem; +import com.raoulvdberge.refinedstorage.gui.grid.GridTab; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.item.ItemGridFilter; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; +import java.util.ArrayList; import java.util.List; public class ItemHandlerGridFilterInGrid extends ItemHandlerBasic { private List filteredItems; + private List tabs; - public ItemHandlerGridFilterInGrid(List filteredItems) { + public ItemHandlerGridFilterInGrid(List filteredItems, List tabs) { super(4, new ItemValidatorBasic(RSItems.GRID_FILTER)); this.filteredItems = filteredItems; + this.tabs = tabs; } @Override @@ -24,6 +28,7 @@ public class ItemHandlerGridFilterInGrid extends ItemHandlerBasic { super.onContentsChanged(slot); filteredItems.clear(); + tabs.clear(); for (int i = 0; i < getSlots(); ++i) { ItemStack filter = getStackInSlot(i); @@ -35,11 +40,21 @@ public class ItemHandlerGridFilterInGrid extends ItemHandlerBasic { ItemHandlerGridFilter items = new ItemHandlerGridFilter(filter); + List filters = new ArrayList<>(); + for (ItemStack item : items.getFilteredItems()) { if (!item.isEmpty()) { - filteredItems.add(new GridFilteredItem(item, compare, mode, modFilter)); + filters.add(new GridFilteredItem(item, compare, mode, modFilter)); } } + + ItemStack icon = ItemGridFilter.getIcon(filter); + + if (icon.isEmpty()) { + filteredItems.addAll(filters); + } else { + tabs.add(new GridTab(filters, ItemGridFilter.getName(filter), icon)); + } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/IGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/IGrid.java index 3d7dfa981..319afdf68 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/IGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/IGrid.java @@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.block.EnumGridType; import com.raoulvdberge.refinedstorage.gui.grid.GridFilteredItem; +import com.raoulvdberge.refinedstorage.gui.grid.GridTab; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import net.minecraft.util.math.BlockPos; @@ -41,6 +42,8 @@ public interface IGrid { List getFilteredItems(); + List getTabs(); + ItemHandlerBasic getFilter(); TileDataParameter getRedstoneModeConfig(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java index 8be95c337..d503c800f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java @@ -11,6 +11,7 @@ import com.raoulvdberge.refinedstorage.block.BlockGrid; import com.raoulvdberge.refinedstorage.block.EnumGridType; import com.raoulvdberge.refinedstorage.container.ContainerGrid; import com.raoulvdberge.refinedstorage.gui.grid.GridFilteredItem; +import com.raoulvdberge.refinedstorage.gui.grid.GridTab; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerGridFilterInGrid; @@ -164,7 +165,8 @@ public class TileGrid extends TileNode implements IGrid { private ItemHandlerBasic patterns = new ItemHandlerBasic(2, this, new ItemValidatorBasic(RSItems.PATTERN)); private List filteredItems = new ArrayList<>(); - private ItemHandlerGridFilterInGrid filter = new ItemHandlerGridFilterInGrid(filteredItems); + private List tabs = new ArrayList<>(); + private ItemHandlerGridFilterInGrid filter = new ItemHandlerGridFilterInGrid(filteredItems, tabs); private EnumGridType type; @@ -264,6 +266,11 @@ public class TileGrid extends TileNode implements IGrid { return filteredItems; } + @Override + public List getTabs() { + return tabs; + } + public void onCraftingMatrixChanged() { markDirty(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java index ac48fd690..1bedbb62c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java @@ -6,6 +6,7 @@ import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.block.EnumGridType; import com.raoulvdberge.refinedstorage.gui.grid.GridFilteredItem; +import com.raoulvdberge.refinedstorage.gui.grid.GridTab; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerGridFilterInGrid; @@ -38,7 +39,8 @@ public class WirelessGrid implements IGrid { private int searchBoxMode; private List filteredItems = new ArrayList<>(); - private ItemHandlerGridFilterInGrid filter = new ItemHandlerGridFilterInGrid(filteredItems) { + private List tabs = new ArrayList<>(); + private ItemHandlerGridFilterInGrid filter = new ItemHandlerGridFilterInGrid(filteredItems, tabs) { @Override protected void onContentsChanged(int slot) { super.onContentsChanged(slot); @@ -161,6 +163,11 @@ public class WirelessGrid implements IGrid { return filteredItems; } + @Override + public List getTabs() { + return tabs; + } + @Override public ItemHandlerBasic getFilter() { return filter; diff --git a/src/main/resources/assets/refinedstorage/textures/icons.png b/src/main/resources/assets/refinedstorage/textures/icons.png index f7bfb95c8..0bdd15588 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/icons.png and b/src/main/resources/assets/refinedstorage/textures/icons.png differ