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.
This commit is contained in:
Julian Eisel 2021-10-27 17:38:59 +02:00
parent defc1b8e18
commit 487faed6d0
Notes: blender-bot 2023-02-14 10:35:28 +01:00
Referenced by commit bca9ec767c, Revert "Asset Browser: Ensure parent catalogs are expanded when adding child"
2 changed files with 28 additions and 0 deletions

View File

@ -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_;

View File

@ -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();
}
/* ---------------------------------------------------------------------- */