Merge remote-tracking branch 'LasmGratel/async-itemrepo' into AE2-Omnifactory

This commit is contained in:
PrototypeTrousers
2022-09-25 13:52:30 -03:00
5 changed files with 134 additions and 80 deletions
@@ -39,7 +39,7 @@ import appeng.api.storage.IStorageChannel;
* - For fluids: AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class).createList()
* - Replace with the corresponding {@link IStorageChannel} type for non native channels
*/
public interface IItemList<T extends IAEStack<T>> extends IItemContainer<T>, Iterable<T>
public interface IItemList<T extends IAEStack<T>> extends IItemContainer<T>, Iterable<T>, Cloneable
{
/**
@@ -85,4 +85,9 @@ public interface IItemList<T extends IAEStack<T>> extends IItemContainer<T>, Ite
* resets stack sizes to 0.
*/
void resetStatus();
/**
* create a copy of this list.
*/
IItemList<T> clone();
}
+54 -25
View File
@@ -39,19 +39,20 @@ import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.regex.Pattern;
public class ItemRepo {
private final IItemList<IAEItemStack> list = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList();
private final ArrayList<IAEItemStack> view = new ArrayList<>();
private final List<IAEItemStack> view;
private final IScrollSource src;
private final ISortSource sortSrc;
private int rowSize = 9;
private String searchString = "";
private volatile String searchString = "";
private IPartitionList<IAEItemStack> myPartitionList;
private String innerSearch = "";
private boolean hasPower;
@@ -59,6 +60,9 @@ public class ItemRepo {
public ItemRepo(final IScrollSource src, final ISortSource sortSrc) {
this.src = src;
this.sortSrc = sortSrc;
this.view = Collections.synchronizedList(new ArrayList<>());
list.forEach(this.view::add);
}
public IAEItemStack getReferenceItem(int idx) {
@@ -95,42 +99,44 @@ public class ItemRepo {
this.updateView();
}
private CompletableFuture<Void> searchTask = null;
public void updateView() {
this.view.clear();
this.view.ensureCapacity(this.list.size());
final Enum viewMode = this.sortSrc.getSortDisplay();
final Enum searchMode = AEConfig.instance().getConfigManager().getSetting(Settings.SEARCH_MODE);
final boolean needsZeroCopy = viewMode == ViewItems.CRAFTABLE;
if (searchMode == SearchBoxMode.JEI_AUTOSEARCH || searchMode == SearchBoxMode.JEI_MANUAL_SEARCH || searchMode == SearchBoxMode.JEI_AUTOSEARCH_KEEP || searchMode == SearchBoxMode.JEI_MANUAL_SEARCH_KEEP) {
this.updateJEI(this.searchString);
if (searchTask != null) {
searchTask.cancel(true);
}
final boolean terminalSearchToolTips = AEConfig.instance().getConfigManager().getSetting(Settings.SEARCH_TOOLTIPS) != YesNo.NO;
// Since sortSrc is final, so we can safely call it inside lambda
searchTask = CompletableFuture.supplyAsync(() -> {
IItemList<IAEItemStack> list = this.list.clone();
List<IAEItemStack> view = new ArrayList<>(list.size());
Enum viewMode = this.sortSrc.getSortDisplay();
boolean needsZeroCopy = viewMode == ViewItems.CRAFTABLE;
boolean terminalSearchToolTips = AEConfig.instance().getConfigManager().getSetting(Settings.SEARCH_TOOLTIPS) != YesNo.NO;
boolean searchMod = false;
this.innerSearch = searchString.toLowerCase();
if (this.innerSearch.startsWith("@")) {
String innerSearch = searchString.toLowerCase();
if (innerSearch.startsWith("@")) {
searchMod = true;
this.innerSearch = this.innerSearch.substring(1);
innerSearch = innerSearch.substring(1);
}
Pattern m = null;
try {
m = Pattern.compile(this.innerSearch, Pattern.CASE_INSENSITIVE);
m = Pattern.compile(innerSearch, Pattern.CASE_INSENSITIVE);
} catch (final Throwable ignore) {
try {
m = Pattern.compile(Pattern.quote(this.innerSearch), Pattern.CASE_INSENSITIVE);
m = Pattern.compile(Pattern.quote(innerSearch), Pattern.CASE_INSENSITIVE);
} catch (final Throwable __) {
return;
return Collections.<IAEItemStack>emptyList();
}
}
boolean notDone = false;
for (IAEItemStack is : this.list) {
for (IAEItemStack is : list) {
if (this.myPartitionList != null) {
if (!this.myPartitionList.isListed(is)) {
continue;
@@ -177,7 +183,7 @@ public class ItemRepo {
is.setStackSize(0);
}
this.view.add(is);
view.add(is);
}
}
@@ -188,9 +194,9 @@ public class ItemRepo {
ItemSorters.init();
if (SortBy == SortOrder.MOD) {
Collections.sort(this.view, ItemSorters.CONFIG_BASED_SORT_BY_MOD);
view.sort(ItemSorters.CONFIG_BASED_SORT_BY_MOD);
} else if (SortBy == SortOrder.AMOUNT) {
Collections.sort(this.view, ItemSorters.CONFIG_BASED_SORT_BY_SIZE);
view.sort(ItemSorters.CONFIG_BASED_SORT_BY_SIZE);
} else if (SortBy == SortOrder.INVTWEAKS) {
if (InventoryBogoSortModule.isLoaded()) {
Collections.sort(this.view, InventoryBogoSortModule.COMPARATOR);
@@ -198,8 +204,18 @@ public class ItemRepo {
Collections.sort(this.view, ItemSorters.CONFIG_BASED_SORT_BY_INV_TWEAKS);
}
} else {
Collections.sort(this.view, ItemSorters.CONFIG_BASED_SORT_BY_NAME);
view.sort(ItemSorters.CONFIG_BASED_SORT_BY_NAME);
}
return view;
}).thenAcceptAsync(view -> {
this.view.clear();
this.view.addAll(view);
}).thenRunAsync(() -> {
this.searchTask = null; // Prevent redundant cancellation
});
}
private void updateJEI(String filter) {
@@ -211,6 +227,8 @@ public class ItemRepo {
}
public void clear() {
searchTask.cancel(true);
searchTask = null;
this.list.resetStatus();
}
@@ -236,5 +254,16 @@ public class ItemRepo {
public void setSearchString(@Nonnull final String searchString) {
this.searchString = searchString;
if (searchTask != null) {
searchTask.cancel(true);
searchTask = null;
}
// Passive JEI auto search
final Enum<?> searchMode = AEConfig.instance().getConfigManager().getSetting(Settings.SEARCH_MODE);
if (searchMode == SearchBoxMode.JEI_AUTOSEARCH || searchMode == SearchBoxMode.JEI_MANUAL_SEARCH || searchMode == SearchBoxMode.JEI_AUTOSEARCH_KEEP || searchMode == SearchBoxMode.JEI_MANUAL_SEARCH_KEEP) {
this.updateJEI(this.searchString);
}
}
}
@@ -161,6 +161,13 @@ public final class FluidList implements IItemList<IAEFluidStack> {
}
}
@Override
public FluidList clone() {
FluidList list = new FluidList();
list.records.putAll(records);
return list;
}
private IAEFluidStack getFluidRecord(final IAEFluidStack fluid) {
return this.records.get(fluid);
}
@@ -94,4 +94,9 @@ public class ItemListIgnoreCrafting<T extends IAEStack<T>> implements IItemList<
public void resetStatus() {
this.target.resetStatus();
}
@Override
public ItemListIgnoreCrafting<T> clone() {
return new ItemListIgnoreCrafting<>(target);
}
}
@@ -140,6 +140,14 @@ public final class ItemList implements IItemList<IAEItemStack> {
}
}
@Override
public ItemList clone() {
ItemList list = new ItemList();
list.records.putAll(records);
list.version.set(version.get());
return list;
}
private ItemVariantList getOrCreateRecord(Item item) {
return this.records.computeIfAbsent(item, this::makeRecordMap);
}