Sort grid items on demand, fixes #247

This commit is contained in:
Raoul Van den Berge
2016-08-06 22:56:30 +02:00
parent 122fd98db8
commit 56774d4674
6 changed files with 62 additions and 50 deletions

View File

@@ -13,12 +13,8 @@ import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import refinedstorage.gui.grid.ClientStack;
import refinedstorage.proxy.CommonProxy;
import java.util.ArrayList;
import java.util.List;
@Mod(modid = RefinedStorage.ID, version = RefinedStorage.VERSION)
public final class RefinedStorage {
public static final String ID = "refinedstorage";
@@ -44,8 +40,6 @@ public final class RefinedStorage {
}
};
public List<ClientStack> items = new ArrayList<>();
public int controllerBaseUsage;
public int cableUsage;
public int constructorUsage;

View File

@@ -1,5 +1,6 @@
package refinedstorage.gui.grid;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
@@ -10,7 +11,6 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.common.FMLCommonHandler;
import org.apache.commons.lang3.StringUtils;
import refinedstorage.RefinedStorage;
import refinedstorage.api.network.GridExtractFlags;
import refinedstorage.api.storage.CompareUtils;
@@ -34,13 +34,15 @@ import java.io.IOException;
import java.util.*;
public class GuiGrid extends GuiBase {
private GridSortingQuantity quantitySorting = new GridSortingQuantity();
private GridSortingName nameSorting = new GridSortingName();
public static final GridSortingQuantity SORTING_QUANTITY = new GridSortingQuantity();
public static final GridSortingName SORTING_NAME = new GridSortingName();
public static List<ClientStack> ITEMS = new ArrayList<>();
public static List<ClientStack> SORTED_ITEMS = new ArrayList<>();
private GuiTextField searchField;
private ContainerGrid container;
private List<ClientStack> items = new ArrayList<>();
private IGrid grid;
private int slotNumber;
@@ -80,27 +82,38 @@ public class GuiGrid extends GuiBase {
addSideButton(new SideButtonGridSortingDirection(grid));
addSideButton(new SideButtonGridSortingType(grid));
addSideButton(new SideButtonGridSearchBoxMode(this));
sortItems();
}
public IGrid getGrid() {
return grid;
}
@Override
public void update(int x, int y) {
items.clear();
public static void sortItems() {
GuiScreen screen = Minecraft.getMinecraft().currentScreen;
if (grid.isConnected()) {
items.addAll(RefinedStorage.INSTANCE.items);
if (!(screen instanceof GuiGrid)) {
return;
}
String query = searchField.getText().trim().toLowerCase();
GuiGrid gui = (GuiGrid) screen;
Iterator<ClientStack> t = items.iterator();
System.out.println("Resorting!");
SORTED_ITEMS.clear();
if (gui.getGrid().isConnected()) {
SORTED_ITEMS.addAll(ITEMS);
String query = gui.searchField.getText().trim().toLowerCase();
Iterator<ClientStack> t = SORTED_ITEMS.iterator();
while (t.hasNext()) {
ClientStack stack = t.next();
List<GridFilteredItem> filteredItems = grid.getFilteredItems();
List<GridFilteredItem> filteredItems = gui.getGrid().getFilteredItems();
boolean found = filteredItems.isEmpty();
@@ -118,11 +131,11 @@ public class GuiGrid extends GuiBase {
continue;
}
if (grid.getViewType() == TileGrid.VIEW_TYPE_NON_CRAFTABLES && stack.isCraftable()) {
if (gui.getGrid().getViewType() == TileGrid.VIEW_TYPE_NON_CRAFTABLES && stack.isCraftable()) {
t.remove();
continue;
} else if (grid.getViewType() == TileGrid.VIEW_TYPE_CRAFTABLES && !stack.isCraftable()) {
} else if (gui.getGrid().getViewType() == TileGrid.VIEW_TYPE_CRAFTABLES && !stack.isCraftable()) {
t.remove();
continue;
@@ -151,30 +164,27 @@ public class GuiGrid extends GuiBase {
t.remove();
}
}
} else if (query.startsWith("#")) {
String tooltip = query.substring(1);
String tooltipFromItem = StringUtils.join(stack.getStack().getTooltip(container.getPlayer(), true), "\n");
if (!tooltipFromItem.contains(tooltip)) {
t.remove();
}
} else if (!stack.getStack().getDisplayName().toLowerCase().contains(query)) {
t.remove();
}
}
nameSorting.setSortingDirection(grid.getSortingDirection());
quantitySorting.setSortingDirection(grid.getSortingDirection());
SORTING_NAME.setSortingDirection(gui.getGrid().getSortingDirection());
SORTING_QUANTITY.setSortingDirection(gui.getGrid().getSortingDirection());
Collections.sort(items, nameSorting);
Collections.sort(SORTED_ITEMS, SORTING_NAME);
if (grid.getSortingType() == TileGrid.SORTING_TYPE_QUANTITY) {
Collections.sort(items, quantitySorting);
if (gui.getGrid().getSortingType() == TileGrid.SORTING_TYPE_QUANTITY) {
Collections.sort(SORTED_ITEMS, SORTING_QUANTITY);
}
}
getScrollbar().setCanScroll(getRows() > getVisibleRows());
getScrollbar().setScrollDelta((float) getScrollbar().getScrollbarHeight() / (float) getRows());
gui.getScrollbar().setCanScroll(gui.getRows() > gui.getVisibleRows());
gui.getScrollbar().setScrollDelta((float) gui.getScrollbar().getScrollbarHeight() / (float) gui.getRows());
}
@Override
public void update(int x, int y) {
}
private int getOffset() {
@@ -182,13 +192,13 @@ public class GuiGrid extends GuiBase {
}
private int getRows() {
int max = (int) Math.ceil((float) items.size() / 9f);
int max = (int) Math.ceil((float) SORTED_ITEMS.size() / 9f);
return max < 0 ? 0 : max;
}
private boolean isOverSlotWithItem() {
return grid.isConnected() && isOverSlot() && slotNumber < items.size();
return grid.isConnected() && isOverSlot() && slotNumber < SORTED_ITEMS.size();
}
private boolean isOverSlot() {
@@ -266,8 +276,8 @@ public class GuiGrid extends GuiBase {
this.slotNumber = slot;
}
if (slot < items.size()) {
drawItem(x, y, items.get(slot).getStack(), true, formatQuantity(items.get(slot).getStack().stackSize, slot));
if (slot < SORTED_ITEMS.size()) {
drawItem(x, y, SORTED_ITEMS.get(slot).getStack(), true, formatQuantity(SORTED_ITEMS.get(slot).getStack().stackSize, slot));
}
if (inBounds(x, y, 16, 16, mouseX, mouseY) || !grid.isConnected()) {
@@ -295,7 +305,7 @@ public class GuiGrid extends GuiBase {
}
if (isOverSlotWithItem()) {
drawTooltip(mouseX, mouseY, items.get(slotNumber).getStack());
drawTooltip(mouseX, mouseY, SORTED_ITEMS.get(slotNumber).getStack());
}
if (isOverClear(mouseX, mouseY)) {
@@ -335,6 +345,8 @@ public class GuiGrid extends GuiBase {
searchField.setText("");
searchField.setFocused(true);
sortItems();
updateJEI();
}
@@ -357,8 +369,8 @@ public class GuiGrid extends GuiBase {
}
if (isOverSlotWithItem() && (held == null || (held != null && clickedButton == 2))) {
if (items.get(slotNumber).isCraftable() && (items.get(slotNumber).getStack().stackSize == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) {
FMLCommonHandler.instance().showGuiScreen(new GuiCraftingSettings(this, container.getPlayer(), items.get(slotNumber)));
if (SORTED_ITEMS.get(slotNumber).isCraftable() && (SORTED_ITEMS.get(slotNumber).getStack().stackSize == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) {
FMLCommonHandler.instance().showGuiScreen(new GuiCraftingSettings(this, container.getPlayer(), SORTED_ITEMS.get(slotNumber)));
} else {
int flags = 0;
@@ -374,7 +386,7 @@ public class GuiGrid extends GuiBase {
flags |= GridExtractFlags.EXTRACT_SINGLE;
}
RefinedStorage.INSTANCE.network.sendToServer(new MessageGridPull(items.get(slotNumber).getId(), flags));
RefinedStorage.INSTANCE.network.sendToServer(new MessageGridPull(SORTED_ITEMS.get(slotNumber).getId(), flags));
}
}
}
@@ -390,6 +402,8 @@ public class GuiGrid extends GuiBase {
// NO OP
} else if (searchField.textboxKeyTyped(character, keyCode)) {
updateJEI();
sortItems();
} else {
super.keyTyped(character, keyCode);
}

View File

@@ -5,9 +5,9 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import refinedstorage.RefinedStorage;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.gui.grid.ClientStack;
import refinedstorage.gui.grid.GuiGrid;
public class MessageGridDelta implements IMessage, IMessageHandler<MessageGridDelta, IMessage> {
private INetworkMaster network;
@@ -39,19 +39,22 @@ public class MessageGridDelta implements IMessage, IMessageHandler<MessageGridDe
@Override
public IMessage onMessage(MessageGridDelta message, MessageContext ctx) {
for (ClientStack stack : RefinedStorage.INSTANCE.items) {
for (ClientStack stack : GuiGrid.ITEMS) {
if (stack.equals(message.clientStack)) {
if (stack.getStack().stackSize + message.delta == 0 && !message.clientStack.isCraftable()) {
RefinedStorage.INSTANCE.items.remove(stack);
GuiGrid.ITEMS.remove(stack);
} else {
stack.getStack().stackSize += message.delta;
}
GuiGrid.sortItems();
return null;
}
}
RefinedStorage.INSTANCE.items.add(message.clientStack);
GuiGrid.ITEMS.add(message.clientStack);
GuiGrid.sortItems();
return null;
}

View File

@@ -5,9 +5,9 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import refinedstorage.RefinedStorage;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.gui.grid.ClientStack;
import refinedstorage.gui.grid.GuiGrid;
import java.util.ArrayList;
import java.util.List;
@@ -43,7 +43,8 @@ public class MessageGridUpdate implements IMessage, IMessageHandler<MessageGridU
@Override
public IMessage onMessage(MessageGridUpdate message, MessageContext ctx) {
RefinedStorage.INSTANCE.items = message.items;
GuiGrid.ITEMS = message.items;
GuiGrid.sortItems();
return null;
}

View File

@@ -72,7 +72,7 @@ public abstract class TileMultipartNode extends TileNode implements IMicroblockC
if (network != null) {
NetworkUtils.rebuildGraph(network);
} else {
} else if (worldObj != null) {
RefinedStorageBlocks.CABLE.attemptConnect(worldObj, pos);
}
}

View File

@@ -375,7 +375,7 @@ public class TileGrid extends TileNode implements IGrid {
@Override
public int getSearchBoxMode() {
return worldObj.isRemote ? SEARCH_BOX_MODE.getValue() : searchBoxMode;
return (worldObj != null && worldObj.isRemote) ? SEARCH_BOX_MODE.getValue() : searchBoxMode;
}
@Override