diff options
author | Julian Eisel <julian@blender.org> | 2021-10-06 17:29:10 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2021-10-06 17:36:20 +0300 |
commit | 75fbf6f17e69ee9c6487173ae5957cfff5193d1f (patch) | |
tree | e27584eb4440d0280cd65a805c8a546966fb9d83 /source/blender/editors/interface/interface_view.cc | |
parent | 536109b4ec336e86de5a7e22e51804584bca74f5 (diff) |
Asset Browser: Show catalog add & delete icons on mouse hover (only)
Now the icons to add or delete catalogs are only shown when mouse hovering a
catalog item in the tree. This is convenient for quick creation of catalogs,
and doesn't require activating a catalog to edit it first.
Determining if a tree item is hovered isn't trivial actually. The UI tree-view
code has to find the matching tree-row button in the previous layout to do so,
since the new layout isn't calculated yet.
Diffstat (limited to 'source/blender/editors/interface/interface_view.cc')
-rw-r--r-- | source/blender/editors/interface/interface_view.cc | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/source/blender/editors/interface/interface_view.cc b/source/blender/editors/interface/interface_view.cc index b199ce9562e..8122b965892 100644 --- a/source/blender/editors/interface/interface_view.cc +++ b/source/blender/editors/interface/interface_view.cc @@ -106,26 +106,71 @@ static StringRef ui_block_view_find_idname(const uiBlock &block, const AbstractT return {}; } +static AbstractTreeView *ui_block_view_find_matching_in_old_block(const uiBlock &new_block, + const AbstractTreeView &new_view) +{ + uiBlock *old_block = new_block.oldblock; + if (!old_block) { + return nullptr; + } + + StringRef idname = ui_block_view_find_idname(new_block, new_view); + if (idname.is_empty()) { + return nullptr; + } + + LISTBASE_FOREACH (ViewLink *, old_view_link, &old_block->views) { + if (old_view_link->idname == idname) { + return get_view_from_link<AbstractTreeView>(*old_view_link); + } + } + + return nullptr; +} + uiTreeViewHandle *ui_block_view_find_matching_in_old_block(const uiBlock *new_block, const uiTreeViewHandle *new_view_handle) { - const AbstractTreeView &needle_view = reinterpret_cast<const AbstractTreeView &>( - *new_view_handle); + BLI_assert(new_block && new_view_handle); + const AbstractTreeView &new_view = reinterpret_cast<const AbstractTreeView &>(*new_view_handle); + AbstractTreeView *old_view = ui_block_view_find_matching_in_old_block(*new_block, new_view); + return reinterpret_cast<uiTreeViewHandle *>(old_view); +} + +uiButTreeRow *ui_block_view_find_treerow_in_old_block(const uiBlock *new_block, + const uiTreeViewItemHandle *new_item_handle) +{ uiBlock *old_block = new_block->oldblock; if (!old_block) { return nullptr; } - StringRef idname = ui_block_view_find_idname(*new_block, needle_view); - if (idname.is_empty()) { + const AbstractTreeViewItem &new_item = *reinterpret_cast<const AbstractTreeViewItem *>( + new_item_handle); + const AbstractTreeView *old_tree_view = ui_block_view_find_matching_in_old_block( + *new_block, new_item.get_tree_view()); + if (!old_tree_view) { return nullptr; } - LISTBASE_FOREACH (ViewLink *, old_view_link, &old_block->views) { - if (old_view_link->idname == idname) { - return reinterpret_cast<uiTreeViewHandle *>( - get_view_from_link<AbstractTreeView>(*old_view_link)); + LISTBASE_FOREACH (uiBut *, old_but, &old_block->buttons) { + if (old_but->type != UI_BTYPE_TREEROW) { + continue; + } + uiButTreeRow *old_treerow_but = (uiButTreeRow *)old_but; + if (!old_treerow_but->tree_item) { + continue; + } + AbstractTreeViewItem &old_item = *reinterpret_cast<AbstractTreeViewItem *>( + old_treerow_but->tree_item); + /* Check if the row is from the expected tree-view. */ + if (&old_item.get_tree_view() != old_tree_view) { + continue; + } + + if (UI_tree_view_item_matches(new_item_handle, old_treerow_but->tree_item)) { + return old_treerow_but; } } |