From 84a7b3bd774c523e6f6fe64a11b5dc78c8fd3f6e Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 24 Mar 2018 09:52:25 +0100 Subject: [PATCH] Further optimize Grid. Should fix #1719 --- .../refinedstorage/gui/grid/GuiGrid.java | 35 ++++-- .../gui/grid/stack/GridStackItem.java | 7 +- .../gui/grid/view/GridViewBase.java | 112 +++++++----------- .../gui/grid/view/GridViewFluid.java | 4 +- .../gui/grid/view/GridViewItem.java | 4 +- .../inventory/ItemHandlerFilter.java | 2 +- .../network/MessageTileDataParameter.java | 8 +- .../tile/TileCrafterManager.java | 2 +- .../refinedstorage/tile/TileDetector.java | 2 +- .../refinedstorage/tile/TileExporter.java | 2 +- .../refinedstorage/tile/TileReader.java | 8 +- .../tile/data/TileDataManager.java | 2 +- .../tile/data/TileDataParameter.java | 9 +- .../data/TileDataParameterClientListener.java | 5 + .../tile/data/TileDataWatcher.java | 8 +- .../refinedstorage/tile/grid/TileGrid.java | 28 +++-- .../tile/grid/portable/TilePortableGrid.java | 20 ++-- 17 files changed, 132 insertions(+), 126 deletions(-) create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataParameterClientListener.java 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 8b408e7d5..43ec81066 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java @@ -71,15 +71,17 @@ public class GuiGrid extends GuiBase implements IResizableDisplay { public GuiGrid(ContainerGrid container, IGrid grid) { super(container, grid.getType() == GridType.FLUID ? 193 : 227, 0); - List defaultSorters = new LinkedList<>(); - defaultSorters.add(new GridSorterName()); - defaultSorters.add(new GridSorterQuantity()); - defaultSorters.add(new GridSorterID()); - defaultSorters.add(new GridSorterInventoryTweaks()); - defaultSorters.add(new GridSorterLastModified()); + IGridSorter defaultSorter; + + List sorters = new LinkedList<>(); + sorters.add(defaultSorter = new GridSorterName()); + sorters.add(new GridSorterQuantity()); + sorters.add(new GridSorterID()); + sorters.add(new GridSorterInventoryTweaks()); + sorters.add(new GridSorterLastModified()); this.grid = grid; - this.view = grid.getType() == GridType.FLUID ? new GridViewFluid(this, defaultSorters) : new GridViewItem(this, defaultSorters); + this.view = grid.getType() == GridType.FLUID ? new GridViewFluid(this, defaultSorter, sorters) : new GridViewItem(this, defaultSorter, sorters); this.wasConnected = this.grid.isActive(); } @@ -142,7 +144,7 @@ public class GuiGrid extends GuiBase implements IResizableDisplay { addSideButton(new SideButtonGridSearchBoxMode(this)); addSideButton(new SideButtonGridSize(this, () -> grid.getSize(), size -> grid.onSizeChanged(size))); - view.sort(); + updateScrollbarAndTabs(); } @Override @@ -622,7 +624,7 @@ public class GuiGrid extends GuiBase implements IResizableDisplay { TileDataManager.setParameter(TileGrid.BLOCKING_PATTERN, blockingPattern.isChecked()); } else if (button == processingPattern) { // Rebuild the inventory slots before the slot change packet arrives - TileGrid.PROCESSING_PATTERN.setValue(processingPattern.isChecked()); + TileGrid.PROCESSING_PATTERN.setValue(false, processingPattern.isChecked()); ((ContainerGrid) this.inventorySlots).initSlots(); TileDataManager.setParameter(TileGrid.PROCESSING_PATTERN, processingPattern.isChecked()); @@ -747,6 +749,21 @@ public class GuiGrid extends GuiBase implements IResizableDisplay { } } + public void updateScrollbarAndTabs() { + if (scrollbar != null) { + scrollbar.setEnabled(getRows() > getVisibleRows()); + scrollbar.setMaxOffset(getRows() - getVisibleRows()); + } + + if (tabPageLeft != null) { + tabPageLeft.visible = grid.getTotalTabPages() > 0; + } + + if (tabPageRight != null) { + tabPageRight.visible = grid.getTotalTabPages() > 0; + } + } + public GuiButton getTabPageLeft() { return tabPageLeft; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/stack/GridStackItem.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/stack/GridStackItem.java index d1c14735e..3ce805f69 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/stack/GridStackItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/stack/GridStackItem.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; public class GridStackItem implements IGridStack { private int hash; private ItemStack stack; + private String cachedName; private boolean craftable; private boolean displayCraftText; private String[] oreIds = null; @@ -72,7 +73,11 @@ public class GridStackItem implements IGridStack { @Override public String getName() { try { - return stack.getDisplayName(); + if (cachedName == null) { + cachedName = stack.getDisplayName(); + } + + return cachedName; } catch (Throwable t) { return ""; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewBase.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewBase.java index 2a63aeced..d64ce6732 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewBase.java @@ -4,7 +4,6 @@ import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.gui.grid.filtering.GridFilterParser; import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSorterDirection; -import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSorterName; import com.raoulvdberge.refinedstorage.gui.grid.sorting.IGridSorter; import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; @@ -15,14 +14,15 @@ public abstract class GridViewBase implements IGridView { private GuiGrid gui; private boolean canCraft; + private IGridSorter defaultSorter; private List sorters; - private SorterThread sorterThread = new SorterThread(); - private List stacks; + private List stacks = new ArrayList<>(); protected Map map = new HashMap<>(); - public GridViewBase(GuiGrid gui, List sorters) { + public GridViewBase(GuiGrid gui, IGridSorter defaultSorter, List sorters) { this.gui = gui; + this.defaultSorter = defaultSorter; this.sorters = sorters; } @@ -33,24 +33,47 @@ public abstract class GridViewBase implements IGridView { @Override public void sort() { - if (!sorterThread.sorting) { - new Thread(sorterThread, "RS grid sorting").start(); - } - } + List stacks = new ArrayList<>(); - private void updateUI(GuiGrid gui) { - if (gui.getScrollbar() != null) { - gui.getScrollbar().setEnabled(gui.getRows() > gui.getVisibleRows()); - gui.getScrollbar().setMaxOffset(gui.getRows() - gui.getVisibleRows()); + if (gui.getGrid().isActive()) { + stacks.addAll(map.values()); + + IGrid grid = gui.getGrid(); + + List> filters = GridFilterParser.getFilters( + grid, + gui.getSearchField() != null ? gui.getSearchField().getText() : "", + (grid.getTabSelected() >= 0 && grid.getTabSelected() < grid.getTabs().size()) ? grid.getTabs().get(grid.getTabSelected()).getFilters() : grid.getFilters() + ); + + Iterator it = stacks.iterator(); + + while (it.hasNext()) { + IGridStack stack = it.next(); + + for (Predicate filter : filters) { + if (!filter.test(stack)) { + it.remove(); + + break; + } + } + } + + GridSorterDirection sortingDirection = grid.getSortingDirection() == IGrid.SORTING_DIRECTION_DESCENDING ? GridSorterDirection.DESCENDING : GridSorterDirection.ASCENDING; + + stacks.sort((left, right) -> defaultSorter.compare(left, right, sortingDirection)); + + for (IGridSorter sorter : sorters) { + if (sorter.isApplicable(grid)) { + stacks.sort((left, right) -> sorter.compare(left, right, sortingDirection)); + } + } } - if (gui.getTabPageLeft() != null) { - gui.getTabPageLeft().visible = gui.getGrid().getTotalTabPages() > 0; - } + this.stacks = stacks; - if (gui.getTabPageRight() != null) { - gui.getTabPageRight().visible = gui.getGrid().getTotalTabPages() > 0; - } + this.gui.updateScrollbarAndTabs(); } @Override @@ -62,57 +85,4 @@ public abstract class GridViewBase implements IGridView { public boolean canCraft() { return canCraft; } - - private class SorterThread implements Runnable { - private boolean sorting; - - @Override - public void run() { - this.sorting = true; - - List stacks = new ArrayList<>(); - - if (gui.getGrid().isActive()) { - stacks.addAll(map.values()); - - IGrid grid = gui.getGrid(); - - List> filters = GridFilterParser.getFilters( - grid, - gui.getSearchField() != null ? gui.getSearchField().getText() : "", - (grid.getTabSelected() >= 0 && grid.getTabSelected() < grid.getTabs().size()) ? grid.getTabs().get(grid.getTabSelected()).getFilters() : grid.getFilters() - ); - - Iterator it = stacks.iterator(); - - while (it.hasNext()) { - IGridStack stack = it.next(); - - for (Predicate filter : filters) { - if (!filter.test(stack)) { - it.remove(); - - break; - } - } - } - - GridSorterDirection sortingDirection = grid.getSortingDirection() == IGrid.SORTING_DIRECTION_DESCENDING ? GridSorterDirection.DESCENDING : GridSorterDirection.ASCENDING; - - GridSorterName defaultSorting = new GridSorterName(); - - stacks.sort((left, right) -> defaultSorting.compare(left, right, sortingDirection)); - - sorters.stream().filter(s -> s.isApplicable(grid)).forEach(s -> { - stacks.sort((left, right) -> s.compare(left, right, sortingDirection)); - }); - } - - GridViewBase.this.stacks = stacks; - - updateUI(gui); - - this.sorting = false; - } - } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewFluid.java index e9db94a35..db6deab31 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewFluid.java @@ -8,8 +8,8 @@ import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; import java.util.List; public class GridViewFluid extends GridViewBase { - public GridViewFluid(GuiGrid gui, List sorters) { - super(gui, sorters); + public GridViewFluid(GuiGrid gui, IGridSorter defaultSorter, List sorters) { + super(gui, defaultSorter, sorters); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewItem.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewItem.java index 004ff857e..8d4b349bf 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/view/GridViewItem.java @@ -8,8 +8,8 @@ import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; import java.util.List; public class GridViewItem extends GridViewBase { - public GridViewItem(GuiGrid gui, List sorters) { - super(gui, sorters); + public GridViewItem(GuiGrid gui, IGridSorter defaultSorter, List sorters) { + super(gui, defaultSorter, sorters); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java index 2ad707121..fa8ab5af7 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java @@ -43,7 +43,7 @@ public class ItemHandlerFilter extends ItemHandlerBase { } } - if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { + if (FMLCommonHandler.instance().getSide() == Side.CLIENT && !filters.isEmpty()) { GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageTileDataParameter.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageTileDataParameter.java index 5f2298074..7ad8d48db 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageTileDataParameter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageTileDataParameter.java @@ -12,24 +12,27 @@ import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class MessageTileDataParameter implements IMessage, IMessageHandler { private TileEntity tile; private TileDataParameter parameter; + private boolean initial; public MessageTileDataParameter() { } - public MessageTileDataParameter(TileEntity tile, TileDataParameter parameter) { + public MessageTileDataParameter(TileEntity tile, TileDataParameter parameter, boolean initial) { this.tile = tile; this.parameter = parameter; + this.initial = initial; } @Override public void fromBytes(ByteBuf buf) { int id = buf.readInt(); + boolean initial = buf.readBoolean(); TileDataParameter parameter = TileDataManager.getParameter(id); if (parameter != null) { try { - parameter.setValue(parameter.getSerializer().read(new PacketBuffer(buf))); + parameter.setValue(initial, parameter.getSerializer().read(new PacketBuffer(buf))); } catch (Exception e) { // NO OP } @@ -39,6 +42,7 @@ public class MessageTileDataParameter implements IMessage, IMessageHandler { t.getNode().setSize(v); t.getNode().markDirty(); } - }, p -> GuiBase.executeLater(GuiCrafterManager.class, GuiBase::initGui)); + }, (initial, p) -> GuiBase.executeLater(GuiCrafterManager.class, GuiBase::initGui)); public TileCrafterManager() { dataManager.addWatchedParameter(SIZE); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDetector.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDetector.java index 5d763754d..1c03035c7 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDetector.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDetector.java @@ -27,7 +27,7 @@ public class TileDetector extends TileNode { public static final TileDataParameter AMOUNT = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getAmount(), (t, v) -> { t.getNode().setAmount(v); t.getNode().markDirty(); - }, p -> GuiBase.executeLater(GuiDetector.class, detector -> detector.getAmount().setText(String.valueOf(p)))); + }, (initial, p) -> GuiBase.executeLater(GuiDetector.class, detector -> detector.getAmount().setText(String.valueOf(p)))); public TileDetector() { dataManager.addWatchedParameter(COMPARE); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java index 7e57e9172..f02880de0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java @@ -38,7 +38,7 @@ public class TileExporter extends TileNode { player.openContainer.detectAndSendChanges(); }); - }, p -> { + }, (initial, p) -> { if (Minecraft.getMinecraft().currentScreen instanceof GuiExporter) { ((ContainerExporter) ((GuiExporter) Minecraft.getMinecraft().currentScreen).inventorySlots).initSlots(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java index 5381713a6..b80ca019d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java @@ -7,9 +7,9 @@ import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHan import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiReaderWriter; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeReader; +import com.raoulvdberge.refinedstorage.gui.GuiBase; import com.raoulvdberge.refinedstorage.gui.GuiReaderWriter; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; -import net.minecraft.client.Minecraft; import net.minecraft.network.datasync.DataSerializers; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; @@ -27,11 +27,7 @@ public class TileReader extends TileNode { ((IGuiReaderWriter) t.getNode()).setChannel(v); t.getNode().markDirty(); - }, p -> { - if (Minecraft.getMinecraft().currentScreen instanceof GuiReaderWriter) { - ((GuiReaderWriter) Minecraft.getMinecraft().currentScreen).updateSelection(p); - } - }); + }, (initial, p) -> GuiBase.executeLater(GuiReaderWriter.class, readerWriter -> readerWriter.updateSelection(p))); } public static final TileDataParameter CHANNEL = createChannelParameter(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataManager.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataManager.java index 33d999a09..3723add60 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataManager.java @@ -64,7 +64,7 @@ public class TileDataManager { } public void sendParameterToWatchers(TileDataParameter parameter) { - watchers.forEach(l -> l.sendParameter(parameter)); + watchers.forEach(l -> l.sendParameter(false, parameter)); } public static void registerParameter(TileDataParameter parameter) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataParameter.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataParameter.java index 3b492e035..5085bc135 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataParameter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataParameter.java @@ -5,7 +5,6 @@ import net.minecraft.tileentity.TileEntity; import javax.annotation.Nullable; import java.util.function.BiConsumer; -import java.util.function.Consumer; import java.util.function.Function; public class TileDataParameter { @@ -15,7 +14,7 @@ public class TileDataParameter { @Nullable private BiConsumer valueConsumer; @Nullable - private Consumer listener; + private TileDataParameterClientListener listener; private T value; public TileDataParameter(DataSerializer serializer, T defaultValue, Function producer) { @@ -26,7 +25,7 @@ public class TileDataParameter { this(serializer, defaultValue, producer, consumer, null); } - public TileDataParameter(DataSerializer serializer, T defaultValue, Function producer, @Nullable BiConsumer consumer, @Nullable Consumer listener) { + public TileDataParameter(DataSerializer serializer, T defaultValue, Function producer, @Nullable BiConsumer consumer, @Nullable TileDataParameterClientListener listener) { this.value = defaultValue; this.serializer = serializer; this.valueProducer = producer; @@ -55,11 +54,11 @@ public class TileDataParameter { return valueConsumer; } - public void setValue(T value) { + public void setValue(boolean initial, T value) { this.value = value; if (listener != null) { - listener.accept(value); + listener.onChanged(initial, value); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataParameterClientListener.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataParameterClientListener.java new file mode 100644 index 000000000..87735813d --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataParameterClientListener.java @@ -0,0 +1,5 @@ +package com.raoulvdberge.refinedstorage.tile.data; + +public interface TileDataParameterClientListener { + void onChanged(boolean initial, T value); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataWatcher.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataWatcher.java index a2c26634e..56ee3ee71 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataWatcher.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/TileDataWatcher.java @@ -30,7 +30,7 @@ public class TileDataWatcher { public void detectAndSendChanges() { if (!sentInitial) { - manager.getParameters().forEach(this::sendParameter); + manager.getParameters().forEach(p -> sendParameter(true, p)); sentInitial = true; } else { @@ -45,14 +45,14 @@ public class TileDataWatcher { // Avoid sending watched parameter twice (after initial packet) if (cached != null) { - sendParameter(parameter); + sendParameter(false, parameter); } } } } } - public void sendParameter(TileDataParameter parameter) { - RS.INSTANCE.network.sendTo(new MessageTileDataParameter(manager.getTile(), parameter), player); + public void sendParameter(boolean initial, TileDataParameter parameter) { + RS.INSTANCE.network.sendTo(new MessageTileDataParameter(manager.getTile(), parameter, initial), player); } } 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 18f317028..ab2e06cd2 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java @@ -24,35 +24,39 @@ public class TileGrid extends TileNode { t.getNode().setViewType(v); t.getNode().markDirty(); } - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort())); + }, (initial, p) -> trySortGrid(initial)); public static final TileDataParameter SORTING_DIRECTION = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getSortingDirection(), (t, v) -> { if (IGrid.isValidSortingDirection(v)) { t.getNode().setSortingDirection(v); t.getNode().markDirty(); } - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort())); + }, (initial, p) -> trySortGrid(initial)); public static final TileDataParameter SORTING_TYPE = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getSortingType(), (t, v) -> { if (IGrid.isValidSortingType(v)) { t.getNode().setSortingType(v); t.getNode().markDirty(); } - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort())); + }, (initial, p) -> trySortGrid(initial)); public static final TileDataParameter SEARCH_BOX_MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getSearchBoxMode(), (t, v) -> { if (IGrid.isValidSearchBoxMode(v)) { t.getNode().setSearchBoxMode(v); t.getNode().markDirty(); } - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.updateSearchFieldFocus(p))); + }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, grid -> grid.updateSearchFieldFocus(p))); public static final TileDataParameter SIZE = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getSize(), (t, v) -> { if (IGrid.isValidSize(v)) { t.getNode().setSize(v); t.getNode().markDirty(); } - }, p -> GuiBase.executeLater(GuiGrid.class, GuiBase::initGui)); + }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, GuiBase::initGui)); public static final TileDataParameter TAB_SELECTED = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getTabSelected(), (t, v) -> { t.getNode().setTabSelected(v == t.getNode().getTabSelected() ? -1 : v); t.getNode().markDirty(); - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort())); + }, (initial, p) -> { + if (p != -1) { + GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort()); + } + }); public static final TileDataParameter TAB_PAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getTabPage(), (t, v) -> { if (v >= 0 && v <= t.getNode().getTotalTabPages()) { t.getNode().setTabPage(v); @@ -62,7 +66,7 @@ public class TileGrid extends TileNode { public static final TileDataParameter OREDICT_PATTERN = new TileDataParameter<>(DataSerializers.BOOLEAN, false, t -> t.getNode().isOredictPattern(), (t, v) -> { t.getNode().setOredictPattern(v); t.getNode().markDirty(); - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.updateOredictPattern(p))); + }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, grid -> grid.updateOredictPattern(p))); public static final TileDataParameter PROCESSING_PATTERN = new TileDataParameter<>(DataSerializers.BOOLEAN, false, t -> t.getNode().isProcessingPattern(), (t, v) -> { t.getNode().setProcessingPattern(v); t.getNode().markDirty(); @@ -75,11 +79,17 @@ public class TileGrid extends TileNode { ((ContainerGrid) player.openContainer).initSlots(); ((ContainerGrid) player.openContainer).sendAllSlots(); }); - }, p -> GuiBase.executeLater(GuiGrid.class, GuiBase::initGui)); + }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, GuiBase::initGui)); public static final TileDataParameter BLOCKING_PATTERN = new TileDataParameter<>(DataSerializers.BOOLEAN, false, t -> t.getNode().isBlockingPattern(), (t, v) -> { t.getNode().setBlockingPattern(v); t.getNode().markDirty(); - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.updateBlockingPattern(p))); + }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, grid -> grid.updateBlockingPattern(p))); + + public static void trySortGrid(boolean initial) { + if (!initial) { + GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort()); + } + } public TileGrid() { dataManager.addWatchedParameter(VIEW_TYPE); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java index a99aac76b..440a34135 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java @@ -34,9 +34,9 @@ import com.raoulvdberge.refinedstorage.tile.config.IRedstoneConfigurable; import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode; import com.raoulvdberge.refinedstorage.tile.data.TileDataManager; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; +import com.raoulvdberge.refinedstorage.tile.grid.TileGrid; import com.raoulvdberge.refinedstorage.util.StackUtils; import com.raoulvdberge.refinedstorage.util.WorldUtils; -import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.InventoryCraftResult; @@ -66,33 +66,33 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, t.setSortingDirection(v); t.markDirty(); } - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort())); + }, (initial, p) -> TileGrid.trySortGrid(initial)); public static final TileDataParameter SORTING_TYPE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSortingType, (t, v) -> { if (IGrid.isValidSortingType(v)) { t.setSortingType(v); t.markDirty(); } - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort())); + }, (initial, p) -> TileGrid.trySortGrid(initial)); public static final TileDataParameter SEARCH_BOX_MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSearchBoxMode, (t, v) -> { if (IGrid.isValidSearchBoxMode(v)) { t.setSearchBoxMode(v); t.markDirty(); } - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.updateSearchFieldFocus(p))); + }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, grid -> grid.updateSearchFieldFocus(p))); public static final TileDataParameter SIZE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSize, (t, v) -> { if (IGrid.isValidSize(v)) { t.setSize(v); t.markDirty(); } - }, p -> { - if (Minecraft.getMinecraft().currentScreen != null) { - Minecraft.getMinecraft().currentScreen.initGui(); - } - }); + }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, GuiBase::initGui)); public static final TileDataParameter TAB_SELECTED = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabSelected, (t, v) -> { t.setTabSelected(v == t.getTabSelected() ? -1 : v); t.markDirty(); - }, p -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort())); + }, (initial, p) -> { + if (p != -1) { + GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort()); + } + }); public static final TileDataParameter TAB_PAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabPage, (t, v) -> { if (v >= 0 && v <= t.getTotalTabPages()) { t.setTabPage(v);