forked from bartvdbraak/blender
Outliner: Left and right walk navigation
Previously the left and right arrow keys would close and open the active tree element, but a subsequent key press would not select up or down the tree as is common in tree-based interfaces. Walking left and right now does a selection action after opening or closing the active tree item. For example, a right key press on a closed element will open it's subtree, and an additional right key press will select the first child element. A left key press anywhere in a subtree will first close the active element if it's subtree is expanded. Walking left again will select the parent element. Part of T77408 Differential Revision: https://developer.blender.org/D8650
This commit is contained in:
parent
b028a43245
commit
70151e41dc
@ -152,8 +152,11 @@ void OUTLINER_OT_highlight_update(wmOperatorType *ot)
|
||||
/* Open or close a tree element, optionally toggling all children recursively */
|
||||
void outliner_item_openclose(TreeElement *te, bool open, bool toggle_all)
|
||||
{
|
||||
TreeStoreElem *tselem = TREESTORE(te);
|
||||
if (BLI_listbase_is_empty(&te->subtree)) {
|
||||
return;
|
||||
}
|
||||
|
||||
TreeStoreElem *tselem = TREESTORE(te);
|
||||
if (open) {
|
||||
tselem->flag &= ~TSE_CLOSED;
|
||||
}
|
||||
|
@ -1634,6 +1634,40 @@ static TreeElement *outliner_find_next_element(SpaceOutliner *space_outliner, Tr
|
||||
return te;
|
||||
}
|
||||
|
||||
static TreeElement *outliner_walk_left(SpaceOutliner *space_outliner,
|
||||
TreeElement *te,
|
||||
bool toggle_all)
|
||||
{
|
||||
TreeStoreElem *tselem = TREESTORE(te);
|
||||
|
||||
if (TSELEM_OPEN(tselem, space_outliner)) {
|
||||
outliner_item_openclose(te, false, toggle_all);
|
||||
}
|
||||
/* Only walk up a level if the element is closed and not toggling expand */
|
||||
else if (!toggle_all && te->parent) {
|
||||
te = te->parent;
|
||||
}
|
||||
|
||||
return te;
|
||||
}
|
||||
|
||||
static TreeElement *outliner_walk_right(SpaceOutliner *space_outliner,
|
||||
TreeElement *te,
|
||||
bool toggle_all)
|
||||
{
|
||||
TreeStoreElem *tselem = TREESTORE(te);
|
||||
|
||||
/* Only walk down a level if the element is open and not toggling expand */
|
||||
if (!toggle_all && TSELEM_OPEN(tselem, space_outliner) && !BLI_listbase_is_empty(&te->subtree)) {
|
||||
te = te->subtree.first;
|
||||
}
|
||||
else {
|
||||
outliner_item_openclose(te, true, toggle_all);
|
||||
}
|
||||
|
||||
return te;
|
||||
}
|
||||
|
||||
static TreeElement *do_outliner_select_walk(SpaceOutliner *space_outliner,
|
||||
TreeElement *te,
|
||||
const int direction,
|
||||
@ -1650,10 +1684,10 @@ static TreeElement *do_outliner_select_walk(SpaceOutliner *space_outliner,
|
||||
te = outliner_find_next_element(space_outliner, te);
|
||||
break;
|
||||
case UI_SELECT_WALK_LEFT:
|
||||
outliner_item_openclose(te, false, toggle_all);
|
||||
te = outliner_walk_left(space_outliner, te, toggle_all);
|
||||
break;
|
||||
case UI_SELECT_WALK_RIGHT:
|
||||
outliner_item_openclose(te, true, toggle_all);
|
||||
te = outliner_walk_right(space_outliner, te, toggle_all);
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user