diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2019-02-09 00:14:07 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2019-02-09 00:15:41 +0300 |
commit | 3f537f30e6b056dfadb7bc8f0e3ce44c75f00da4 (patch) | |
tree | 09ac50c1af48778bb4ed2785aacca3c21a8509ac /source/blender/editors/space_outliner | |
parent | 0e3d1eee15b7b6dadaddaa7f1f4b8d30b80e6792 (diff) |
Outliner visibility: Ctrl to isolate object
Ideally it would be nice to make all the base parent collections visible as well.
However we do not know this from the outliner.
Diffstat (limited to 'source/blender/editors/space_outliner')
-rw-r--r-- | source/blender/editors/space_outliner/outliner_draw.c | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 84385afdb9f..1b7ec4cb722 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -266,34 +266,55 @@ static void restrictbutton_id_user_toggle(bContext *UNUSED(C), void *poin, void static void hidebutton_base_flag_cb(bContext *C, void *poin, void *poin2) { + wmWindow *win = CTX_wm_window(C); Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = poin; Base *base = poin2; Object *ob = base->object; - bool freeze = (CTX_wm_window(C)->eventstate->alt != 0); - bool changed_restrict_view = false; + bool do_disable = (CTX_wm_window(C)->eventstate->alt != 0); + bool do_isolate = (win->eventstate->ctrl != 0) && !do_disable; + bool extend = (win->eventstate->shift != 0); + bool depsgraph_changed = false; - if (freeze) { + if (do_disable) { ob->restrictflag |= OB_RESTRICT_VIEW; - changed_restrict_view = true; + depsgraph_changed = true; + } + else if (do_isolate) { + depsgraph_changed = (ob->restrictflag & OB_RESTRICT_VIEW) != 0; + + if (!extend) { + /* Make only one base visible. */ + for (Base *other = view_layer->object_bases.first; other; other = other->next) { + other->flag |= BASE_HIDDEN; + } + + base->flag &= ~BASE_HIDDEN; + } + else { + /* Toggle visibility of one base. */ + base->flag ^= BASE_HIDDEN; + } + ob->restrictflag &= ~OB_RESTRICT_VIEW; } else if (ob->restrictflag & OB_RESTRICT_VIEW) { ob->restrictflag &= ~OB_RESTRICT_VIEW; base->flag &= ~BASE_HIDDEN; - changed_restrict_view = true; + depsgraph_changed = true; } else { base->flag ^= BASE_HIDDEN; } - if (changed_restrict_view) { + if (depsgraph_changed) { BKE_main_collection_sync_remap(bmain); DEG_id_tag_update(&ob->id, LIB_TAG_COPIED_ON_WRITE); DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_OBJECT | ND_DRAW, &ob->id); } - if (!freeze) { + + if (!do_disable) { BKE_layer_collection_sync(scene, view_layer); DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS); WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); @@ -563,7 +584,9 @@ static void outliner_draw_restrictbuts( block, UI_BTYPE_ICON_TOGGLE, 0, icon, (int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX), te->ys, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, - TIP_("Hide object in viewport (Alt to disable for all viewports)")); + TIP_("Hide object in viewport\n" + "* Alt to disable for all viewports\n" + "* Ctrl to isolate visibility")); UI_but_func_set(bt, hidebutton_base_flag_cb, view_layer, base); UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK); } |