diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/include/UI_tree_view.hh | 6 | ||||
-rw-r--r-- | source/blender/editors/interface/tree_view.cc | 32 | ||||
-rw-r--r-- | source/blender/editors/space_file/asset_catalog_tree_view.cc | 6 |
3 files changed, 33 insertions, 11 deletions
diff --git a/source/blender/editors/include/UI_tree_view.hh b/source/blender/editors/include/UI_tree_view.hh index d36e688dd65..a82aae021f2 100644 --- a/source/blender/editors/include/UI_tree_view.hh +++ b/source/blender/editors/include/UI_tree_view.hh @@ -211,12 +211,16 @@ class AbstractTreeViewItem : public TreeViewItemContainer { const AbstractTreeView &get_tree_view() const; int count_parents() const; - void set_active(bool value = true); + /** Activates this item, deactivates other items, calls the #AbstractTreeViewItem::on_activate() + * function and ensures this item's parents are not collapsed (so the item is visible). */ + void activate(); + void deactivate(); bool is_active() const; void toggle_collapsed(); bool is_collapsed() const; void set_collapsed(bool collapsed); bool is_collapsible() const; + void ensure_parents_uncollapsed(); }; /** \} */ diff --git a/source/blender/editors/interface/tree_view.cc b/source/blender/editors/interface/tree_view.cc index 0ea15a2a5bb..202e3dba2ab 100644 --- a/source/blender/editors/interface/tree_view.cc +++ b/source/blender/editors/interface/tree_view.cc @@ -184,14 +184,25 @@ int AbstractTreeViewItem::count_parents() const return i; } -void AbstractTreeViewItem::set_active(bool value) +void AbstractTreeViewItem::activate() { - if (value && !is_active()) { - /* Deactivate other items in the tree. */ - get_tree_view().foreach_item([](auto &item) { item.set_active(false); }); - on_activate(); + if (is_active()) { + return; } - is_active_ = value; + + /* Deactivate other items in the tree. */ + get_tree_view().foreach_item([](auto &item) { item.deactivate(); }); + + on_activate(); + /* Make sure the active item is always visible. */ + ensure_parents_uncollapsed(); + + is_active_ = true; +} + +void AbstractTreeViewItem::deactivate() +{ + is_active_ = false; } bool AbstractTreeViewItem::is_active() const @@ -219,6 +230,13 @@ bool AbstractTreeViewItem::is_collapsible() const return !children_.is_empty(); } +void AbstractTreeViewItem::ensure_parents_uncollapsed() +{ + for (AbstractTreeViewItem *parent = parent_; parent; parent = parent->parent_) { + parent->set_collapsed(false); + } +} + /* ---------------------------------------------------------------------- */ TreeViewBuilder::TreeViewBuilder(uiBlock &block) : block_(block) @@ -277,7 +295,7 @@ static void tree_row_click_fn(struct bContext *UNUSED(C), void *but_arg1, void * if (tree_item.is_collapsed() || tree_item.is_active()) { tree_item.toggle_collapsed(); } - tree_item.set_active(); + tree_item.activate(); } void BasicTreeViewItem::build_row(uiLayout &row) diff --git a/source/blender/editors/space_file/asset_catalog_tree_view.cc b/source/blender/editors/space_file/asset_catalog_tree_view.cc index 883bc6d7890..657881bdb40 100644 --- a/source/blender/editors/space_file/asset_catalog_tree_view.cc +++ b/source/blender/editors/space_file/asset_catalog_tree_view.cc @@ -152,7 +152,7 @@ ui::BasicTreeViewItem &AssetCatalogTreeView::build_catalog_items_recursive( ui::BasicTreeViewItem &view_item = view_parent_item.add_tree_item<AssetCatalogTreeViewItem>( &catalog); if (is_active_catalog(catalog.get_catalog_id())) { - view_item.set_active(); + view_item.activate(); } catalog.foreach_child([&view_item, this](AssetCatalogTreeItem &child) { @@ -171,7 +171,7 @@ void AssetCatalogTreeView::add_all_item() WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr); }); if (params->asset_catalog_visibility == FILE_SHOW_ASSETS_ALL_CATALOGS) { - item.set_active(); + item.activate(); } } @@ -185,7 +185,7 @@ void AssetCatalogTreeView::add_unassigned_item() WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr); }); if (params->asset_catalog_visibility == FILE_SHOW_ASSETS_WITHOUT_CATALOG) { - item.set_active(); + item.activate(); } } |