Fix store choice popover performance

This commit is contained in:
crschnick
2025-06-08 01:20:58 +00:00
parent 0fa9f031ee
commit 2e527684bb
4 changed files with 37 additions and 11 deletions

View File

@@ -73,7 +73,8 @@ public final class BrowserConnectionListComp extends SimpleComp {
filter,
category,
StoreViewState.get().getEntriesListVisibilityObservable(),
StoreViewState.get().getEntriesListUpdateObservable()),
StoreViewState.get().getEntriesListUpdateObservable(),
new ReadOnlyBooleanWrapper(true)),
augment,
selectedAction -> {
BooleanProperty busy = new SimpleBooleanProperty(false);

View File

@@ -17,10 +17,7 @@ import io.xpipe.app.util.LabelGraphic;
import io.xpipe.core.store.DataStore;
import javafx.beans.binding.Bindings;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.*;
import javafx.collections.ListChangeListener;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
@@ -116,7 +113,8 @@ public class StoreChoiceComp<T extends DataStore> extends SimpleComp {
filterText,
selectedCategory,
StoreViewState.get().getEntriesListVisibilityObservable(),
StoreViewState.get().getEntriesListUpdateObservable()),
StoreViewState.get().getEntriesListUpdateObservable(),
popover.showingProperty()),
(s, comp) -> {
if (!applicable.test(s.getWrapper())) {
comp.disable(new SimpleBooleanProperty(true));

View File

@@ -8,6 +8,7 @@ import io.xpipe.app.util.BindingsHelper;
import io.xpipe.app.util.DerivedObservableList;
import javafx.beans.binding.Bindings;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ObservableBooleanValue;
import javafx.beans.value.ObservableIntegerValue;
@@ -107,12 +108,19 @@ public class StoreSection {
ObservableValue<String> filterString,
ObservableValue<StoreCategoryWrapper> category,
ObservableIntegerValue visibilityObservable,
ObservableIntegerValue updateObservable) {
ObservableIntegerValue updateObservable,
ObservableValue<Boolean> enabled
) {
var topLevel = all.filtered(
section -> {
if (!enabled.getValue()) {
return false;
}
return DataStorage.get()
.isRootEntry(section.getEntry(), category.getValue().getCategory());
},
enabled,
category,
updateObservable);
var cached = topLevel.mapped(storeEntryWrapper -> create(
@@ -125,10 +133,15 @@ public class StoreSection {
filterString,
category,
visibilityObservable,
updateObservable));
updateObservable,
enabled));
var ordered = sorted(cached, category, updateObservable);
var shown = ordered.filtered(
section -> {
if (!enabled.getValue()) {
return false;
}
// matches filter
return (filterString == null || section.matchesFilter(filterString.getValue()))
&&
@@ -138,6 +151,7 @@ public class StoreSection {
// same category
(showInCategory(category.getValue(), section.getWrapper()));
},
enabled,
category,
filterString,
updateObservable);
@@ -154,7 +168,8 @@ public class StoreSection {
ObservableValue<String> filterString,
ObservableValue<StoreCategoryWrapper> category,
ObservableIntegerValue visibilityObservable,
ObservableIntegerValue updateObservable) {
ObservableIntegerValue updateObservable,
ObservableValue<Boolean> enabled) {
if (e.getEntry().getValidity() == DataStoreEntry.Validity.LOAD_FAILED) {
return new StoreSection(
e, DerivedObservableList.arrayList(true), DerivedObservableList.arrayList(true), depth);
@@ -162,6 +177,10 @@ public class StoreSection {
var allChildren = all.filtered(
other -> {
if (!enabled.getValue()) {
return false;
}
// Legacy implementation that does not use children caches. Use for testing
// if (true) return DataStorage.get()
// .getDefaultDisplayParent(other.getEntry())
@@ -176,6 +195,7 @@ public class StoreSection {
return true;
},
enabled,
e.getPersistentState(),
e.getCache(),
visibilityObservable,
@@ -192,10 +212,15 @@ public class StoreSection {
filterString,
category,
visibilityObservable,
updateObservable));
updateObservable,
enabled));
var ordered = sorted(cached, category, updateObservable);
var filtered = ordered.filtered(
section -> {
if (!enabled.getValue()) {
return false;
}
var isBatchSelected = selected.contains(section.getWrapper());
var matchesFilter = filterString == null
@@ -246,6 +271,7 @@ public class StoreSection {
return true;
},
enabled,
category,
filterString,
e.getPersistentState(),

View File

@@ -156,7 +156,8 @@ public class StoreViewState {
filter,
activeCategory,
entriesListVisibilityObservable,
entriesListUpdateObservable);
entriesListUpdateObservable,
new ReadOnlyBooleanWrapper(true));
} catch (Exception exception) {
currentTopLevelSection = new StoreSection(
null, DerivedObservableList.arrayList(true), DerivedObservableList.arrayList(true), 0);