diff options
author | Julian Eisel <julian@blender.org> | 2021-10-27 18:38:59 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2021-10-27 19:09:00 +0300 |
commit | 487faed6d0a1170a2f098552f794280fabe82186 (patch) | |
tree | b8d8fedaff9421a924afbae9faeb23f2b8d24be1 | |
parent | defc1b8e1815155840cff1736523760083a05807 (diff) |
Asset Browser: Ensure parent catalogs are expanded when adding child
When pressing the '+' icon to add a new child catalog, or when adding it
through the context menu, the new catalog should be visible. So the
this change makes sure the parent is uncollapsed if needed.
-rw-r--r-- | source/blender/editors/include/UI_tree_view.hh | 11 | ||||
-rw-r--r-- | source/blender/editors/interface/tree_view.cc | 17 |
2 files changed, 28 insertions, 0 deletions
diff --git a/source/blender/editors/include/UI_tree_view.hh b/source/blender/editors/include/UI_tree_view.hh index 0d18eedeac9..77472979beb 100644 --- a/source/blender/editors/include/UI_tree_view.hh +++ b/source/blender/editors/include/UI_tree_view.hh @@ -196,6 +196,15 @@ class AbstractTreeView : public TreeViewItemContainer { * the actual state changes are done in a delayed manner through this function. */ void change_state_delayed(); + /** + * Typically when adding a new child from the UI, the parent should be expanded to make the new + * item visible. While this isn't totally bullet proof (items may be expanded where the child was + * added dynamically, not through user action), it should give the wanted behavior as needed in + * practice. + * "Focused" here means active or hovered, as a way to tell if the new item came from user + * interaction (on the row directly or through the context menu). + */ + void unveil_new_items_in_focused_parent() const; void build_layout_from_tree(const TreeViewLayoutBuilder &builder); }; @@ -223,6 +232,8 @@ class AbstractTreeViewItem : public TreeViewItemContainer { bool is_open_ = false; bool is_active_ = false; bool is_renaming_ = false; + /* Could the item be identified from a previous redraw? */ + bool is_new_ = true; IsActiveFn is_active_fn_; diff --git a/source/blender/editors/interface/tree_view.cc b/source/blender/editors/interface/tree_view.cc index c08fa51d5a5..d64f9d9c975 100644 --- a/source/blender/editors/interface/tree_view.cc +++ b/source/blender/editors/interface/tree_view.cc @@ -169,6 +169,21 @@ void AbstractTreeView::change_state_delayed() foreach_item([](AbstractTreeViewItem &item) { item.change_state_delayed(); }); } +void AbstractTreeView::unveil_new_items_in_focused_parent() const +{ + foreach_item([](AbstractTreeViewItem &item) { + if (!item.is_new_ || !item.parent_) { + return; + } + if (item.parent_->is_active() || + /* Tree-row button is not created if a parent is collapsed. It's required for the + * hover-check. */ + (item.parent_->tree_row_but_ && item.parent_->is_hovered())) { + item.parent_->set_collapsed(false); + } + }); +} + /* ---------------------------------------------------------------------- */ void AbstractTreeViewItem::tree_row_click_fn(struct bContext * /*C*/, @@ -393,6 +408,7 @@ void AbstractTreeViewItem::update_from_old(const AbstractTreeViewItem &old) is_open_ = old.is_open_; is_active_ = old.is_active_; is_renaming_ = old.is_renaming_; + is_new_ = false; } bool AbstractTreeViewItem::matches(const AbstractTreeViewItem &other) const @@ -569,6 +585,7 @@ void TreeViewBuilder::build_tree_view(AbstractTreeView &tree_view) tree_view.update_from_old(block_); tree_view.change_state_delayed(); tree_view.build_layout_from_tree(TreeViewLayoutBuilder(block_)); + tree_view.unveil_new_items_in_focused_parent(); } /* ---------------------------------------------------------------------- */ |