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
### 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)

View File

@@ -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;

View File

@@ -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;
}
}
}

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.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);
}
}

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.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);
}
}

View File

@@ -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());
}
}
}