[Bf-blender-cvs] [3f537f30e6b] master: Outliner visibility: Ctrl to isolate object

Dalai Felinto noreply at git.blender.org
Fri Feb 8 23:11:46 CET 2019


Commit: 3f537f30e6b056dfadb7bc8f0e3ce44c75f00da4
Author: Dalai Felinto
Date:   Fri Feb 8 19:14:07 2019 -0200
Branches: master
https://developer.blender.org/rB3f537f30e6b056dfadb7bc8f0e3ce44c75f00da4

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.

===================================================================

M	source/blender/editors/space_outliner/outliner_draw.c

===================================================================

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);
 				}



More information about the Bf-blender-cvs mailing list