From d61e80450178bd3545125f2099908287465ca3c6 Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Tue, 2 Aug 2022 10:40:02 +0300 Subject: [PATCH] feat: refactor the way how category show/hide in navigation tree --- .../view/FilterableTreeItem.java | 35 ++++++++++++------- .../view/NavigationPresenter.java | 20 ++++++----- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/preferencesfx/src/main/java/com/dlsc/preferencesfx/view/FilterableTreeItem.java b/preferencesfx/src/main/java/com/dlsc/preferencesfx/view/FilterableTreeItem.java index 7f1e4c36..659b3110 100644 --- a/preferencesfx/src/main/java/com/dlsc/preferencesfx/view/FilterableTreeItem.java +++ b/preferencesfx/src/main/java/com/dlsc/preferencesfx/view/FilterableTreeItem.java @@ -10,6 +10,8 @@ *******************************************************************************/ package com.dlsc.preferencesfx.view; +import java.util.HashMap; +import java.util.Map; import javafx.beans.binding.Bindings; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; @@ -42,7 +44,7 @@ public class FilterableTreeItem extends CheckBoxTreeItem { private final FilteredList> filteredList =new FilteredList<>(sourceList); private final ObjectProperty> predicate = new SimpleObjectProperty<>(); - private boolean isVisible = true; + private Map, Integer> childItemIndexesMap = new HashMap<>(); /** * Creates a new {@link TreeItem} with sorted children. @@ -52,6 +54,10 @@ public class FilterableTreeItem extends CheckBoxTreeItem { public FilterableTreeItem(T value) { super(value); + setupFilteredListPredicateBindings(); + } + + private void setupFilteredListPredicateBindings() { filteredList.predicateProperty().bind(Bindings.createObjectBinding(() -> { Predicate> treeItemPredicate = child -> { // Set the predicate of child items to force filtering @@ -60,10 +66,6 @@ public FilterableTreeItem(T value) { filterableChild.setPredicate(predicate.get()); } - if (!child.isVisible) { - return false; - } - // If there is no predicate, keep this tree item if (predicate.get() == null) { return true; @@ -82,7 +84,7 @@ public FilterableTreeItem(T value) { Bindings.bindContent(getChildren(), getBackingList()); } - + /** * @return the backing list */ @@ -120,11 +122,20 @@ public final void setPredicate(TreeItemPredicate predicate) { this.predicate.set(predicate); } - public boolean isVisible() { - return isVisible; - } - - public void setVisible(boolean visible) { - isVisible = visible; + /** + * Remove child item from {@link #sourceList} and save item position if visibility is false. + * If visibility is true it restore (add item to {@link #sourceList}) to same position using index. + * + * @param childItem - child item object + * @param visible - visibility of this child item + */ + public void changeChildItemVisibility(FilterableTreeItem childItem, boolean visible) { + if (visible) { + sourceList.add(childItemIndexesMap.get(childItem), childItem); + } else { + childItemIndexesMap.put(childItem, sourceList.indexOf(childItem)); + + sourceList.remove(childItem); + } } } \ No newline at end of file diff --git a/preferencesfx/src/main/java/com/dlsc/preferencesfx/view/NavigationPresenter.java b/preferencesfx/src/main/java/com/dlsc/preferencesfx/view/NavigationPresenter.java index b21c2576..2dcee016 100644 --- a/preferencesfx/src/main/java/com/dlsc/preferencesfx/view/NavigationPresenter.java +++ b/preferencesfx/src/main/java/com/dlsc/preferencesfx/view/NavigationPresenter.java @@ -3,7 +3,9 @@ import com.dlsc.preferencesfx.model.Category; import com.dlsc.preferencesfx.model.PreferencesFxModel; import com.dlsc.preferencesfx.util.SearchHandler; +import java.util.stream.Collectors; import javafx.beans.property.StringProperty; +import javafx.collections.ObservableList; import javafx.scene.control.TreeCell; import javafx.scene.control.TreeItem; import org.slf4j.Logger; @@ -108,24 +110,26 @@ public void setupBindings() { } - private void addRecursive(FilterableTreeItem treeItem, List categories) { + private void addRecursive(FilterableTreeItem parentTreeItem, List categories) { for (Category category : categories) { - FilterableTreeItem item = new FilterableTreeItem<>(category); + FilterableTreeItem treeItem = new FilterableTreeItem<>(category); if (category.isExpand()) { - item.setExpanded(true); + treeItem.setExpanded(true); } + // If there are subcategories, add them recursively. if (category.getChildren() != null) { - addRecursive(item, category.getChildren()); + addRecursive(treeItem, category.getChildren()); } - treeItem.getInternalChildren().add(item); - categoryTreeItemMap.put(category, item); + + parentTreeItem.getInternalChildren().add(treeItem); + categoryTreeItemMap.put(category, treeItem); if (category.visibilityProperty() != null) { category.visibilityProperty().get().addListener((observableValue, aBoolean, newValue) -> { - item.setVisible(newValue); + FilterableTreeItem childTreeItem = categoryTreeItemMap.get(category); - navigationView.invalidate(); + navigationView.rootItem.changeChildItemVisibility(childTreeItem, newValue); }); } }