Only resort from the gui thread, fixes #252

This commit is contained in:
Raoul Van den Berge
2016-08-09 21:14:49 +02:00
parent a0343299b7
commit 2d1a559c52
5 changed files with 28 additions and 33 deletions

View File

@@ -1,6 +1,5 @@
package refinedstorage.gui.grid; package refinedstorage.gui.grid;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.gui.GuiTextField;
@@ -40,6 +39,8 @@ public class GuiGrid extends GuiBase {
public static List<ClientStack> ITEMS = new ArrayList<>(); public static List<ClientStack> ITEMS = new ArrayList<>();
public static List<ClientStack> SORTED_ITEMS = new ArrayList<>(); public static List<ClientStack> SORTED_ITEMS = new ArrayList<>();
public static boolean markedForSorting;
private GuiTextField searchField; private GuiTextField searchField;
private ContainerGrid container; private ContainerGrid container;
@@ -90,32 +91,20 @@ public class GuiGrid extends GuiBase {
return grid; return grid;
} }
public static void sortItems() { private void sortItems() {
GuiScreen screen = Minecraft.getMinecraft().currentScreen;
if (!(screen instanceof GuiGrid)) {
return;
}
GuiGrid gui = (GuiGrid) screen;
if (gui.searchField == null) {
return;
}
List<ClientStack> sortedItems = new ArrayList<>(); List<ClientStack> sortedItems = new ArrayList<>();
if (gui.getGrid().isConnected()) { if (grid.isConnected()) {
sortedItems.addAll(ITEMS); sortedItems.addAll(ITEMS);
String query = gui.searchField.getText().trim().toLowerCase(); String query = searchField.getText().trim().toLowerCase();
Iterator<ClientStack> t = sortedItems.iterator(); Iterator<ClientStack> t = sortedItems.iterator();
while (t.hasNext()) { while (t.hasNext()) {
ClientStack stack = t.next(); ClientStack stack = t.next();
List<GridFilteredItem> filteredItems = gui.getGrid().getFilteredItems(); List<GridFilteredItem> filteredItems = grid.getFilteredItems();
boolean found = filteredItems.isEmpty(); boolean found = filteredItems.isEmpty();
@@ -133,11 +122,11 @@ public class GuiGrid extends GuiBase {
continue; continue;
} }
if (gui.getGrid().getViewType() == TileGrid.VIEW_TYPE_NON_CRAFTABLES && stack.isCraftable()) { if (grid.getViewType() == TileGrid.VIEW_TYPE_NON_CRAFTABLES && stack.isCraftable()) {
t.remove(); t.remove();
continue; continue;
} else if (gui.getGrid().getViewType() == TileGrid.VIEW_TYPE_CRAFTABLES && !stack.isCraftable()) { } else if (grid.getViewType() == TileGrid.VIEW_TYPE_CRAFTABLES && !stack.isCraftable()) {
t.remove(); t.remove();
continue; continue;
@@ -171,24 +160,29 @@ public class GuiGrid extends GuiBase {
} }
} }
SORTING_NAME.setSortingDirection(gui.getGrid().getSortingDirection()); SORTING_NAME.setSortingDirection(grid.getSortingDirection());
SORTING_QUANTITY.setSortingDirection(gui.getGrid().getSortingDirection()); SORTING_QUANTITY.setSortingDirection(grid.getSortingDirection());
Collections.sort(sortedItems, SORTING_NAME); Collections.sort(sortedItems, SORTING_NAME);
if (gui.getGrid().getSortingType() == TileGrid.SORTING_TYPE_QUANTITY) { if (grid.getSortingType() == TileGrid.SORTING_TYPE_QUANTITY) {
Collections.sort(sortedItems, SORTING_QUANTITY); Collections.sort(sortedItems, SORTING_QUANTITY);
} }
} }
SORTED_ITEMS = sortedItems; SORTED_ITEMS = sortedItems;
gui.getScrollbar().setCanScroll(gui.getRows() > gui.getVisibleRows()); getScrollbar().setCanScroll(getRows() > getVisibleRows());
gui.getScrollbar().setScrollDelta((float) gui.getScrollbar().getScrollbarHeight() / (float) gui.getRows()); getScrollbar().setScrollDelta((float) getScrollbar().getScrollbarHeight() / (float) getRows());
} }
@Override @Override
public void update(int x, int y) { public void update(int x, int y) {
if (markedForSorting) {
markedForSorting = false;
sortItems();
}
} }
private int getOffset() { private int getOffset() {

View File

@@ -47,14 +47,14 @@ public class MessageGridDelta implements IMessage, IMessageHandler<MessageGridDe
stack.getStack().stackSize += message.delta; stack.getStack().stackSize += message.delta;
} }
GuiGrid.sortItems(); GuiGrid.markedForSorting = true;
return null; return null;
} }
} }
GuiGrid.ITEMS.add(message.clientStack); GuiGrid.ITEMS.add(message.clientStack);
GuiGrid.sortItems(); GuiGrid.markedForSorting = true;
return null; return null;
} }

View File

@@ -44,7 +44,7 @@ public class MessageGridUpdate implements IMessage, IMessageHandler<MessageGridU
@Override @Override
public IMessage onMessage(MessageGridUpdate message, MessageContext ctx) { public IMessage onMessage(MessageGridUpdate message, MessageContext ctx) {
GuiGrid.ITEMS = message.items; GuiGrid.ITEMS = message.items;
GuiGrid.sortItems(); GuiGrid.markedForSorting = true;
return null; return null;
} }

View File

@@ -51,7 +51,8 @@ public class TileGrid extends TileNode implements IGrid {
tile.markDirty(); tile.markDirty();
} }
} }
}, parameter -> GuiGrid.sortItems()); }, parameter ->
GuiGrid.markedForSorting = true);
public static final TileDataParameter<Integer> SORTING_DIRECTION = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileGrid>() { public static final TileDataParameter<Integer> SORTING_DIRECTION = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileGrid>() {
@Override @Override
@@ -67,7 +68,7 @@ public class TileGrid extends TileNode implements IGrid {
tile.markDirty(); tile.markDirty();
} }
} }
}, parameter -> GuiGrid.sortItems()); }, parameter -> GuiGrid.markedForSorting = true);
public static final TileDataParameter<Integer> SORTING_TYPE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileGrid>() { public static final TileDataParameter<Integer> SORTING_TYPE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileGrid>() {
@Override @Override
@@ -83,7 +84,7 @@ public class TileGrid extends TileNode implements IGrid {
tile.markDirty(); tile.markDirty();
} }
} }
}, parameter -> GuiGrid.sortItems()); }, parameter -> GuiGrid.markedForSorting = true);
public static final TileDataParameter<Integer> SEARCH_BOX_MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileGrid>() { public static final TileDataParameter<Integer> SEARCH_BOX_MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileGrid>() {
@Override @Override

View File

@@ -116,7 +116,7 @@ public class WirelessGrid implements IGrid {
this.viewType = type; this.viewType = type;
GuiGrid.sortItems(); GuiGrid.markedForSorting = true;
} }
@Override @Override
@@ -125,7 +125,7 @@ public class WirelessGrid implements IGrid {
this.sortingType = type; this.sortingType = type;
GuiGrid.sortItems(); GuiGrid.markedForSorting = true;
} }
@Override @Override
@@ -134,7 +134,7 @@ public class WirelessGrid implements IGrid {
this.sortingDirection = direction; this.sortingDirection = direction;
GuiGrid.sortItems(); GuiGrid.markedForSorting = true;
} }
@Override @Override