Bring grid sorting performance back up to par with previous version and update changelog
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
# Refined Storage Changelog
|
||||
|
||||
### 1.5.33
|
||||
- Added Crafter Manager (raoulvdberge)
|
||||
- Fixed Disk Manipulator not extracting items (ineternet)
|
||||
- Various internal refactors (raoulvdberge)
|
||||
|
||||
### 1.5.32
|
||||
- Added Spanish translation (Samuelrock)
|
||||
- Fixed issue where the Pattern Grid can only overwrite patterns when blank ones are present (ineternet)
|
||||
|
||||
@@ -22,11 +22,11 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ContainerCrafterManager extends ContainerBase {
|
||||
public class Listener implements IContainerListener {
|
||||
public class CrafterManagerListener implements IContainerListener {
|
||||
private IContainerListener base;
|
||||
private boolean receivedContainerData;
|
||||
|
||||
public Listener(IContainerListener base) {
|
||||
public CrafterManagerListener(IContainerListener base) {
|
||||
this.base = base;
|
||||
}
|
||||
|
||||
@@ -35,16 +35,16 @@ public class ContainerCrafterManager extends ContainerBase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendAllContents(Container containerToSend, NonNullList<ItemStack> itemsList) {
|
||||
public void sendAllContents(Container container, NonNullList<ItemStack> items) {
|
||||
if (receivedContainerData) {
|
||||
base.sendAllContents(containerToSend, itemsList);
|
||||
base.sendAllContents(container, items);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendSlotContents(Container containerToSend, int slotInd, ItemStack stack) {
|
||||
public void sendSlotContents(Container container, int slotInd, ItemStack stack) {
|
||||
if (receivedContainerData) {
|
||||
base.sendSlotContents(containerToSend, slotInd, stack);
|
||||
base.sendSlotContents(container, slotInd, stack);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,13 +53,13 @@ public class ContainerCrafterManager extends ContainerBase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendWindowProperty(Container containerIn, int varToUpdate, int newValue) {
|
||||
base.sendWindowProperty(containerIn, varToUpdate, newValue);
|
||||
public void sendWindowProperty(Container container, int varToUpdate, int newValue) {
|
||||
base.sendWindowProperty(container, varToUpdate, newValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendAllWindowProperties(Container containerIn, IInventory inventory) {
|
||||
base.sendAllWindowProperties(containerIn, inventory);
|
||||
public void sendAllWindowProperties(Container container, IInventory inventory) {
|
||||
base.sendAllWindowProperties(container, inventory);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ public class ContainerCrafterManager extends ContainerBase {
|
||||
|
||||
@Override
|
||||
public void addListener(IContainerListener listener) {
|
||||
super.addListener(new Listener(listener));
|
||||
super.addListener(new CrafterManagerListener(listener));
|
||||
}
|
||||
|
||||
public List<IContainerListener> getListeners() {
|
||||
@@ -116,7 +116,6 @@ public class ContainerCrafterManager extends ContainerBase {
|
||||
int x = 8;
|
||||
|
||||
for (Map.Entry<String, Integer> entry : containerData.entrySet()) {
|
||||
// @todo: Test on servers
|
||||
boolean visible = I18n.format(entry.getKey()).toLowerCase().contains(display.getSearchFieldText().toLowerCase());
|
||||
|
||||
IItemHandlerModifiable dummy;
|
||||
|
||||
@@ -8,44 +8,37 @@ import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSorterName;
|
||||
import com.raoulvdberge.refinedstorage.gui.grid.sorting.IGridSorter;
|
||||
import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public abstract class GridViewBase implements IGridView {
|
||||
protected void sortAndFilter(GuiGrid gui, List<IGridStack> stacks, List<IGridSorter> sorters) {
|
||||
IGrid grid = gui.getGrid();
|
||||
private GuiGrid gui;
|
||||
private boolean canCraft;
|
||||
|
||||
List<Predicate<IGridStack>> 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()
|
||||
);
|
||||
private List<IGridSorter> sorters;
|
||||
private SorterThread sorterThread = new SorterThread();
|
||||
|
||||
Iterator<IGridStack> it = stacks.iterator();
|
||||
private List<IGridStack> stacks;
|
||||
protected Map<Integer, IGridStack> map = new HashMap<>();
|
||||
|
||||
while (it.hasNext()) {
|
||||
IGridStack stack = it.next();
|
||||
|
||||
for (Predicate<IGridStack> 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) -> new GridSorterName().compare(left, right, sortingDirection));
|
||||
|
||||
sorters.stream().filter(s -> s.isApplicable(grid)).forEach(s -> {
|
||||
stacks.sort((left, right) -> s.compare(left, right, sortingDirection));
|
||||
});
|
||||
public GridViewBase(GuiGrid gui, List<IGridSorter> sorters) {
|
||||
this.gui = gui;
|
||||
this.sorters = sorters;
|
||||
}
|
||||
|
||||
protected void updateUI(GuiGrid gui) {
|
||||
@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());
|
||||
@@ -59,4 +52,65 @@ public abstract class GridViewBase implements IGridView {
|
||||
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();
|
||||
|
||||
List<Predicate<IGridStack>> 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<IGridStack> it = stacks.iterator();
|
||||
|
||||
while (it.hasNext()) {
|
||||
IGridStack stack = it.next();
|
||||
|
||||
for (Predicate<IGridStack> 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) -> new GridSorterName().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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.IGridStack;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
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) {
|
||||
this.sorters = sorters;
|
||||
this.gui = gui;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<IGridStack> getStacks() {
|
||||
return stacks;
|
||||
super(gui, sorters);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -32,16 +17,16 @@ public class GridViewFluid extends GridViewBase {
|
||||
map.clear();
|
||||
|
||||
for (IGridStack stack : stacks) {
|
||||
map.put(stack.getHash(), (GridStackFluid) stack);
|
||||
map.put(stack.getHash(), stack);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postChange(IGridStack stack, int delta) {
|
||||
GridStackFluid existing = map.get(stack.getHash());
|
||||
GridStackFluid existing = (GridStackFluid) map.get(stack.getHash());
|
||||
|
||||
if (existing == null) {
|
||||
map.put(stack.getHash(), (GridStackFluid) stack);
|
||||
map.put(stack.getHash(), stack);
|
||||
} else {
|
||||
if (existing.getStack().amount + delta <= 0) {
|
||||
map.remove(existing.getHash());
|
||||
@@ -52,29 +37,4 @@ public class GridViewFluid extends GridViewBase {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.IGridStack;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
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) {
|
||||
this.gui = gui;
|
||||
this.sorters = sorters;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<IGridStack> getStacks() {
|
||||
return stacks;
|
||||
super(gui, sorters);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -37,18 +22,18 @@ public class GridViewItem extends GridViewBase {
|
||||
continue;
|
||||
}
|
||||
|
||||
map.put(stack.getHash(), (GridStackItem) stack);
|
||||
map.put(stack.getHash(), stack);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postChange(IGridStack stack, int delta) {
|
||||
GridStackItem existing = map.get(stack.getHash());
|
||||
GridStackItem existing = (GridStackItem) map.get(stack.getHash());
|
||||
|
||||
if (existing == null) {
|
||||
((GridStackItem) stack).getStack().setCount(delta);
|
||||
|
||||
map.put(stack.getHash(), (GridStackItem) stack);
|
||||
map.put(stack.getHash(), stack);
|
||||
} else {
|
||||
if (existing.getStack().getCount() + delta <= 0) {
|
||||
if (existing.isCraftable()) {
|
||||
@@ -69,29 +54,4 @@ public class GridViewItem extends GridViewBase {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,11 +19,11 @@ public class MessageCrafterManagerRequestSlotData extends MessageHandlerPlayerTo
|
||||
protected void handle(MessageCrafterManagerRequestSlotData message, EntityPlayerMP player) {
|
||||
if (player.openContainer instanceof ContainerCrafterManager) {
|
||||
for (IContainerListener listener : ((ContainerCrafterManager) player.openContainer).getListeners()) {
|
||||
ContainerCrafterManager.Listener crafterListener = (ContainerCrafterManager.Listener) listener;
|
||||
ContainerCrafterManager.CrafterManagerListener crafterCrafterManagerListener = (ContainerCrafterManager.CrafterManagerListener) listener;
|
||||
|
||||
if (crafterListener.getPlayer() == player) {
|
||||
crafterListener.setReceivedContainerData();
|
||||
crafterListener.sendAllContents(player.openContainer, player.openContainer.getInventory());
|
||||
if (crafterCrafterManagerListener.getPlayer() == player) {
|
||||
crafterCrafterManagerListener.setReceivedContainerData();
|
||||
crafterCrafterManagerListener.sendAllContents(player.openContainer, player.openContainer.getInventory());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user