UI: Activate parent when active child is collapsed

Previously, when an item was active and its parent (or grand parent, etc.) was
collapsed, the active item would simply not be visible anymore. It seemed like
there was no active item. So instead, change the just collapsed parent to be
the active item then, so the active item stays visible.
This commit is contained in:
Julian Eisel 2021-10-20 11:49:33 +02:00
parent 16eafdadf6
commit 381965eb56
2 changed files with 19 additions and 0 deletions

View File

@ -337,6 +337,8 @@ class AbstractTreeViewItem : public TreeViewItemContainer {
void add_indent(uiLayout &row) const;
void add_collapse_chevron(uiBlock &block) const;
void add_rename_button(uiLayout &row);
bool has_active_child() const;
};
/** \} */

View File

@ -227,6 +227,11 @@ void AbstractTreeViewItem::collapse_chevron_click_fn(struct bContext *C,
BLI_assert(hovered_item != nullptr);
hovered_item->toggle_collapsed();
/* When collapsing an item with an active child, make this collapsed item active instead so the
* active item stays visible. */
if (hovered_item->has_active_child()) {
hovered_item->activate();
}
}
bool AbstractTreeViewItem::is_collapse_chevron_but(const uiBut *but)
@ -327,6 +332,18 @@ void AbstractTreeViewItem::add_rename_button(uiLayout &row)
UI_block_layout_set_current(block, &row);
}
bool AbstractTreeViewItem::has_active_child() const
{
bool found = false;
foreach_item_recursive([&found](const AbstractTreeViewItem &item) {
if (item.is_active()) {
found = true;
}
});
return found;
}
void AbstractTreeViewItem::on_activate()
{
/* Do nothing by default. */