Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/interface/tree_view.cc')
-rw-r--r--source/blender/editors/interface/tree_view.cc32
1 files changed, 25 insertions, 7 deletions
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)