Grid tabs. Doesn't save current tab to server yet, and doesn't handle container resize correctly all the times.

This commit is contained in:
Raoul Van den Berge
2016-12-07 21:45:06 +01:00
parent 68054d92bd
commit 523700d287
10 changed files with 180 additions and 34 deletions

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -0,0 +1,29 @@
package com.raoulvdberge.refinedstorage.gui.grid;
import net.minecraft.item.ItemStack;
import java.util.List;
public class GridTab {
private List<GridFilteredItem> filters;
private String name;
private ItemStack icon;
public GridTab(List<GridFilteredItem> filters, String name, ItemStack icon) {
this.filters = filters;
this.name = name;
this.icon = icon;
}
public List<GridFilteredItem> getFilters() {
return filters;
}
public String getName() {
return name;
}
public ItemStack getIcon() {
return icon;
}
}

View File

@@ -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<Integer> 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<IGridFilter> filters = GridFilterParser.getFilters(grid, searchField.getText());
List<IGridFilter> filters = GridFilterParser.getFilters(grid, searchField.getText(), (tabSelected >= 0 && tabSelected < grid.getTabs().size()) ? grid.getTabs().get(tabSelected).getFilters() : grid.getFilteredItems());
Iterator<IClientStack> 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();

View File

@@ -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<IGridFilter> getFilters(IGrid grid, String query) {
public static List<IGridFilter> getFilters(IGrid grid, String query, List<GridFilteredItem> itemFilters) {
List<IGridFilter> 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;

View File

@@ -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<GridFilteredItem> filteredItems;
private List<GridTab> tabs;
public ItemHandlerGridFilterInGrid(List<GridFilteredItem> filteredItems) {
public ItemHandlerGridFilterInGrid(List<GridFilteredItem> filteredItems, List<GridTab> 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<GridFilteredItem> 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));
}
}
}

View File

@@ -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<GridFilteredItem> getFilteredItems();
List<GridTab> getTabs();
ItemHandlerBasic getFilter();
TileDataParameter<Integer> getRedstoneModeConfig();

View File

@@ -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<GridFilteredItem> filteredItems = new ArrayList<>();
private ItemHandlerGridFilterInGrid filter = new ItemHandlerGridFilterInGrid(filteredItems);
private List<GridTab> 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<GridTab> getTabs() {
return tabs;
}
public void onCraftingMatrixChanged() {
markDirty();

View File

@@ -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<GridFilteredItem> filteredItems = new ArrayList<>();
private ItemHandlerGridFilterInGrid filter = new ItemHandlerGridFilterInGrid(filteredItems) {
private List<GridTab> 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<GridTab> getTabs() {
return tabs;
}
@Override
public ItemHandlerBasic getFilter() {
return filter;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB