Bring grid sorting performance back up to par with previous version and update changelog

This commit is contained in:
raoulvdberge
2018-03-18 11:18:42 +01:00
parent 5436af4c17
commit 42ae53b61a
6 changed files with 112 additions and 134 deletions

View File

@@ -1,5 +1,10 @@
# Refined Storage Changelog # Refined Storage Changelog
### 1.5.33
- Added Crafter Manager (raoulvdberge)
- Fixed Disk Manipulator not extracting items (ineternet)
- Various internal refactors (raoulvdberge)
### 1.5.32 ### 1.5.32
- Added Spanish translation (Samuelrock) - Added Spanish translation (Samuelrock)
- Fixed issue where the Pattern Grid can only overwrite patterns when blank ones are present (ineternet) - Fixed issue where the Pattern Grid can only overwrite patterns when blank ones are present (ineternet)

View File

@@ -22,11 +22,11 @@ import java.util.List;
import java.util.Map; import java.util.Map;
public class ContainerCrafterManager extends ContainerBase { public class ContainerCrafterManager extends ContainerBase {
public class Listener implements IContainerListener { public class CrafterManagerListener implements IContainerListener {
private IContainerListener base; private IContainerListener base;
private boolean receivedContainerData; private boolean receivedContainerData;
public Listener(IContainerListener base) { public CrafterManagerListener(IContainerListener base) {
this.base = base; this.base = base;
} }
@@ -35,16 +35,16 @@ public class ContainerCrafterManager extends ContainerBase {
} }
@Override @Override
public void sendAllContents(Container containerToSend, NonNullList<ItemStack> itemsList) { public void sendAllContents(Container container, NonNullList<ItemStack> items) {
if (receivedContainerData) { if (receivedContainerData) {
base.sendAllContents(containerToSend, itemsList); base.sendAllContents(container, items);
} }
} }
@Override @Override
public void sendSlotContents(Container containerToSend, int slotInd, ItemStack stack) { public void sendSlotContents(Container container, int slotInd, ItemStack stack) {
if (receivedContainerData) { if (receivedContainerData) {
base.sendSlotContents(containerToSend, slotInd, stack); base.sendSlotContents(container, slotInd, stack);
} }
} }
@@ -53,13 +53,13 @@ public class ContainerCrafterManager extends ContainerBase {
} }
@Override @Override
public void sendWindowProperty(Container containerIn, int varToUpdate, int newValue) { public void sendWindowProperty(Container container, int varToUpdate, int newValue) {
base.sendWindowProperty(containerIn, varToUpdate, newValue); base.sendWindowProperty(container, varToUpdate, newValue);
} }
@Override @Override
public void sendAllWindowProperties(Container containerIn, IInventory inventory) { public void sendAllWindowProperties(Container container, IInventory inventory) {
base.sendAllWindowProperties(containerIn, inventory); base.sendAllWindowProperties(container, inventory);
} }
} }
@@ -69,7 +69,7 @@ public class ContainerCrafterManager extends ContainerBase {
@Override @Override
public void addListener(IContainerListener listener) { public void addListener(IContainerListener listener) {
super.addListener(new Listener(listener)); super.addListener(new CrafterManagerListener(listener));
} }
public List<IContainerListener> getListeners() { public List<IContainerListener> getListeners() {
@@ -116,7 +116,6 @@ public class ContainerCrafterManager extends ContainerBase {
int x = 8; int x = 8;
for (Map.Entry<String, Integer> entry : containerData.entrySet()) { for (Map.Entry<String, Integer> entry : containerData.entrySet()) {
// @todo: Test on servers
boolean visible = I18n.format(entry.getKey()).toLowerCase().contains(display.getSearchFieldText().toLowerCase()); boolean visible = I18n.format(entry.getKey()).toLowerCase().contains(display.getSearchFieldText().toLowerCase());
IItemHandlerModifiable dummy; IItemHandlerModifiable dummy;

View File

@@ -8,12 +8,73 @@ import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSorterName;
import com.raoulvdberge.refinedstorage.gui.grid.sorting.IGridSorter; import com.raoulvdberge.refinedstorage.gui.grid.sorting.IGridSorter;
import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack;
import java.util.Iterator; import java.util.*;
import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
public abstract class GridViewBase implements IGridView { public abstract class GridViewBase implements IGridView {
protected void sortAndFilter(GuiGrid gui, List<IGridStack> stacks, List<IGridSorter> sorters) { private GuiGrid gui;
private boolean canCraft;
private List<IGridSorter> sorters;
private SorterThread sorterThread = new SorterThread();
private List<IGridStack> stacks;
protected Map<Integer, IGridStack> map = new HashMap<>();
public GridViewBase(GuiGrid gui, List<IGridSorter> sorters) {
this.gui = gui;
this.sorters = sorters;
}
@Override
public List<IGridStack> getStacks() {
return stacks;
}
@Override
public void sort() {
if (!sorterThread.sorting) {
new Thread(sorterThread, "RS grid sorting").start();
}
}
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.getTabPageLeft() != null) {
gui.getTabPageLeft().visible = gui.getGrid().getTotalTabPages() > 0;
}
if (gui.getTabPageRight() != null) {
gui.getTabPageRight().visible = gui.getGrid().getTotalTabPages() > 0;
}
}
@Override
public void setCanCraft(boolean canCraft) {
this.canCraft = canCraft;
}
@Override
public boolean canCraft() {
return canCraft;
}
private class SorterThread implements Runnable {
private boolean sorting;
@Override
public void run() {
this.sorting = true;
List<IGridStack> stacks = new ArrayList<>();
if (gui.getGrid().isActive()) {
stacks.addAll(map.values());
IGrid grid = gui.getGrid(); IGrid grid = gui.getGrid();
List<Predicate<IGridStack>> filters = GridFilterParser.getFilters( List<Predicate<IGridStack>> filters = GridFilterParser.getFilters(
@@ -45,18 +106,11 @@ public abstract class GridViewBase implements IGridView {
}); });
} }
protected void updateUI(GuiGrid gui) { GridViewBase.this.stacks = stacks;
if (gui.getScrollbar() != null) {
gui.getScrollbar().setEnabled(gui.getRows() > gui.getVisibleRows());
gui.getScrollbar().setMaxOffset(gui.getRows() - gui.getVisibleRows());
}
if (gui.getTabPageLeft() != null) { updateUI(gui);
gui.getTabPageLeft().visible = gui.getGrid().getTotalTabPages() > 0;
}
if (gui.getTabPageRight() != null) { this.sorting = false;
gui.getTabPageRight().visible = gui.getGrid().getTotalTabPages() > 0;
} }
} }
} }

View File

@@ -5,26 +5,11 @@ import com.raoulvdberge.refinedstorage.gui.grid.sorting.IGridSorter;
import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackFluid; import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackFluid;
import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
public class GridViewFluid extends GridViewBase { public class GridViewFluid extends GridViewBase {
private Map<Integer, GridStackFluid> map = new HashMap<>();
private List<IGridStack> stacks;
private GuiGrid gui;
private List<IGridSorter> sorters;
private boolean canCraft;
public GridViewFluid(GuiGrid gui, List<IGridSorter> sorters) { public GridViewFluid(GuiGrid gui, List<IGridSorter> sorters) {
this.sorters = sorters; super(gui, sorters);
this.gui = gui;
}
@Override
public List<IGridStack> getStacks() {
return stacks;
} }
@Override @Override
@@ -32,16 +17,16 @@ public class GridViewFluid extends GridViewBase {
map.clear(); map.clear();
for (IGridStack stack : stacks) { for (IGridStack stack : stacks) {
map.put(stack.getHash(), (GridStackFluid) stack); map.put(stack.getHash(), stack);
} }
} }
@Override @Override
public void postChange(IGridStack stack, int delta) { public void postChange(IGridStack stack, int delta) {
GridStackFluid existing = map.get(stack.getHash()); GridStackFluid existing = (GridStackFluid) map.get(stack.getHash());
if (existing == null) { if (existing == null) {
map.put(stack.getHash(), (GridStackFluid) stack); map.put(stack.getHash(), stack);
} else { } else {
if (existing.getStack().amount + delta <= 0) { if (existing.getStack().amount + delta <= 0) {
map.remove(existing.getHash()); map.remove(existing.getHash());
@@ -52,29 +37,4 @@ public class GridViewFluid extends GridViewBase {
existing.setTrackerEntry(stack.getTrackerEntry()); existing.setTrackerEntry(stack.getTrackerEntry());
} }
} }
@Override
public void setCanCraft(boolean canCraft) {
this.canCraft = canCraft;
}
@Override
public boolean canCraft() {
return canCraft;
}
@Override
public void sort() {
List<IGridStack> stacks = new ArrayList<>();
if (gui.getGrid().isActive()) {
stacks.addAll(map.values());
new Thread(() -> sortAndFilter(gui, stacks, sorters)).start();
}
this.stacks = stacks;
updateUI(gui);
}
} }

View File

@@ -5,26 +5,11 @@ import com.raoulvdberge.refinedstorage.gui.grid.sorting.IGridSorter;
import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackItem; import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackItem;
import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
public class GridViewItem extends GridViewBase { public class GridViewItem extends GridViewBase {
private Map<Integer, GridStackItem> map = new HashMap<>();
private List<IGridStack> stacks;
private GuiGrid gui;
private List<IGridSorter> sorters;
private boolean canCraft;
public GridViewItem(GuiGrid gui, List<IGridSorter> sorters) { public GridViewItem(GuiGrid gui, List<IGridSorter> sorters) {
this.gui = gui; super(gui, sorters);
this.sorters = sorters;
}
@Override
public List<IGridStack> getStacks() {
return stacks;
} }
@Override @Override
@@ -37,18 +22,18 @@ public class GridViewItem extends GridViewBase {
continue; continue;
} }
map.put(stack.getHash(), (GridStackItem) stack); map.put(stack.getHash(), stack);
} }
} }
@Override @Override
public void postChange(IGridStack stack, int delta) { public void postChange(IGridStack stack, int delta) {
GridStackItem existing = map.get(stack.getHash()); GridStackItem existing = (GridStackItem) map.get(stack.getHash());
if (existing == null) { if (existing == null) {
((GridStackItem) stack).getStack().setCount(delta); ((GridStackItem) stack).getStack().setCount(delta);
map.put(stack.getHash(), (GridStackItem) stack); map.put(stack.getHash(), stack);
} else { } else {
if (existing.getStack().getCount() + delta <= 0) { if (existing.getStack().getCount() + delta <= 0) {
if (existing.isCraftable()) { if (existing.isCraftable()) {
@@ -69,29 +54,4 @@ public class GridViewItem extends GridViewBase {
existing.setTrackerEntry(stack.getTrackerEntry()); existing.setTrackerEntry(stack.getTrackerEntry());
} }
} }
@Override
public void setCanCraft(boolean canCraft) {
this.canCraft = canCraft;
}
@Override
public boolean canCraft() {
return canCraft;
}
@Override
public void sort() {
List<IGridStack> stacks = new ArrayList<>();
if (gui.getGrid().isActive()) {
stacks.addAll(map.values());
new Thread(() -> sortAndFilter(gui, stacks, sorters)).start();
}
this.stacks = stacks;
updateUI(gui);
}
} }

View File

@@ -19,11 +19,11 @@ public class MessageCrafterManagerRequestSlotData extends MessageHandlerPlayerTo
protected void handle(MessageCrafterManagerRequestSlotData message, EntityPlayerMP player) { protected void handle(MessageCrafterManagerRequestSlotData message, EntityPlayerMP player) {
if (player.openContainer instanceof ContainerCrafterManager) { if (player.openContainer instanceof ContainerCrafterManager) {
for (IContainerListener listener : ((ContainerCrafterManager) player.openContainer).getListeners()) { for (IContainerListener listener : ((ContainerCrafterManager) player.openContainer).getListeners()) {
ContainerCrafterManager.Listener crafterListener = (ContainerCrafterManager.Listener) listener; ContainerCrafterManager.CrafterManagerListener crafterCrafterManagerListener = (ContainerCrafterManager.CrafterManagerListener) listener;
if (crafterListener.getPlayer() == player) { if (crafterCrafterManagerListener.getPlayer() == player) {
crafterListener.setReceivedContainerData(); crafterCrafterManagerListener.setReceivedContainerData();
crafterListener.sendAllContents(player.openContainer, player.openContainer.getInventory()); crafterCrafterManagerListener.sendAllContents(player.openContainer, player.openContainer.getInventory());
} }
} }
} }