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:
authorJulian Eisel <julian@blender.org>2021-10-06 17:29:10 +0300
committerJulian Eisel <julian@blender.org>2021-10-06 17:36:20 +0300
commit75fbf6f17e69ee9c6487173ae5957cfff5193d1f (patch)
treee27584eb4440d0280cd65a805c8a546966fb9d83 /source/blender/editors/interface/interface_view.cc
parent536109b4ec336e86de5a7e22e51804584bca74f5 (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.cc61
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;
}
}