diff options
-rw-r--r-- | source/blender/editors/space_outliner/outliner_utils.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/source/blender/editors/space_outliner/outliner_utils.c b/source/blender/editors/space_outliner/outliner_utils.c index 5f19d8b8757..a120718e36b 100644 --- a/source/blender/editors/space_outliner/outliner_utils.c +++ b/source/blender/editors/space_outliner/outliner_utils.c @@ -84,12 +84,24 @@ TreeElement *outliner_find_item_at_y(const SpaceOutliner *soops, /* co_y is inside this element */ return te_iter; } - else if (TSELEM_OPEN(te_iter->store_elem, soops)) { - /* co_y is lower than current element, possibly inside children */ - TreeElement *te_sub = outliner_find_item_at_y(soops, &te_iter->subtree, view_co_y); - if (te_sub) { - return te_sub; - } + + if (BLI_listbase_is_empty(&te_iter->subtree) || !TSELEM_OPEN(TREESTORE(te_iter), soops)) { + /* No need for recursion. */ + continue; + } + + /* If the coordinate is lower than the next element, we can continue with that one and skip + * recursion too. */ + const TreeElement *te_next = te_iter->next; + if (te_next && (view_co_y < (te_next->ys + UI_UNIT_Y))) { + continue; + } + + /* co_y is lower than current element (but not lower than the next one), possibly inside + * children */ + TreeElement *te_sub = outliner_find_item_at_y(soops, &te_iter->subtree, view_co_y); + if (te_sub) { + return te_sub; } } } |