[Bf-blender-cvs] [1edc3f74ed4] blender2.8: Cleanup: make object deselect match other ED_ APIs

Campbell Barton noreply at git.blender.org
Tue Nov 20 08:11:46 CET 2018


Commit: 1edc3f74ed4637ff620e8c0fef47de5be259b227
Author: Campbell Barton
Date:   Tue Nov 20 18:08:24 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB1edc3f74ed4637ff620e8c0fef47de5be259b227

Cleanup: make object deselect match other ED_ APIs

Use SEL_* argument, matching ED_pose_deselect_all.

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

M	source/blender/editors/include/ED_object.h
M	source/blender/editors/object/object_select.c

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

diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 37b27c461ae..45cb02a77ea 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -109,10 +109,10 @@ bool ED_object_parent_set(struct ReportList *reports, const struct bContext *C,
 void ED_object_parent_clear(struct Object *ob, const int type);
 
 void ED_object_base_select(struct Base *base, eObjectSelect_Mode mode);
-bool ED_object_base_select_all_visible(struct ViewLayer *view_layer);
-bool ED_object_base_deselect_all_visible(struct ViewLayer *view_layer);
 void ED_object_base_activate(struct bContext *C, struct Base *base);
 void ED_object_base_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Object *ob);
+bool ED_object_base_deselect_all_ex(struct ViewLayer *view_layer, int action, bool *r_any_visible);
+bool ED_object_base_deselect_all(struct ViewLayer *view_layer, int action);
 
 /* single object duplicate, if (dupflag == 0), fully linked, else it uses the flags given */
 struct Base *ED_object_add_duplicate(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, struct Base *base, int dupflag);
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index 8a82fb2bf06..25c2c61eb0a 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -120,31 +120,6 @@ void ED_object_base_select(Base *base, eObjectSelect_Mode mode)
 	}
 }
 
-/** Apply selection operation to all visible bases in the view layer. */
-bool ED_object_base_select_all_visible(ViewLayer *view_layer)
-{
-	bool changed = false;
-	FOREACH_VISIBLE_BASE_BEGIN(view_layer, base)
-	{
-		ED_object_base_select(base, BA_SELECT);
-		changed = true;
-	}
-	FOREACH_VISIBLE_BASE_END;
-	return changed;
-}
-
-bool ED_object_base_deselect_all_visible(ViewLayer *view_layer)
-{
-	bool changed = false;
-	FOREACH_VISIBLE_BASE_BEGIN(view_layer, base)
-	{
-		ED_object_base_select(base, BA_DESELECT);
-		changed = true;
-	}
-	FOREACH_VISIBLE_BASE_END;
-	return changed;
-}
-
 /**
  * Change active base, it includes the notifier
  */
@@ -162,6 +137,61 @@ void ED_object_base_activate(bContext *C, Base *base)
 	DEG_id_tag_update(&CTX_data_scene(C)->id, DEG_TAG_SELECT_UPDATE);
 }
 
+bool ED_object_base_deselect_all_ex(ViewLayer *view_layer, int action, bool *r_any_visible)
+{
+	if (action == SEL_TOGGLE) {
+		action = SEL_SELECT;
+		FOREACH_VISIBLE_BASE_BEGIN(view_layer, base) {
+			if ((base->flag & BASE_SELECTED) != 0) {
+				action = SEL_DESELECT;
+				break;
+			}
+		}
+		FOREACH_VISIBLE_BASE_END;
+	}
+
+	bool any_visible = false;
+	bool changed = false;
+	FOREACH_VISIBLE_BASE_BEGIN(view_layer, base) {
+		switch (action) {
+			case SEL_SELECT:
+				if ((base->flag & BASE_SELECTED) == 0) {
+					ED_object_base_select(base, BA_SELECT);
+					changed = true;
+				}
+				break;
+			case SEL_DESELECT:
+				if ((base->flag & BASE_SELECTED) != 0) {
+					ED_object_base_select(base, BA_DESELECT);
+					changed = true;
+				}
+				break;
+			case SEL_INVERT:
+				if ((base->flag & BASE_SELECTED) != 0) {
+					ED_object_base_select(base, BA_DESELECT);
+					changed = true;
+				}
+				else {
+					ED_object_base_select(base, BA_SELECT);
+					changed = true;
+				}
+				break;
+		}
+		any_visible = true;
+	}
+	FOREACH_VISIBLE_BASE_END;
+	if (r_any_visible) {
+		*r_any_visible = any_visible;
+	}
+	return changed;
+}
+
+
+bool ED_object_base_deselect_all(ViewLayer *view_layer, int action)
+{
+	return ED_object_base_deselect_all_ex(view_layer, action, NULL);
+}
+
 /********************** Jump To Object Utilities **********************/
 
 static int get_base_select_priority(Base *base)
@@ -235,7 +265,7 @@ bool ED_object_jump_to_object(bContext *C, Object *ob)
 	if (view_layer->basact != base) {
 		/* Select if not selected. */
 		if (!(base->flag & BASE_SELECTED)) {
-			ED_object_base_deselect_all_visible(view_layer);
+			ED_object_base_deselect_all(view_layer, SEL_DESELECT);
 
 			if (base->flag & BASE_VISIBLE) {
 				ED_object_base_select(base, BA_SELECT);
@@ -348,7 +378,7 @@ static int object_select_by_type_exec(bContext *C, wmOperator *op)
 	extend = RNA_boolean_get(op->ptr, "extend");
 
 	if (extend == 0) {
-		ED_object_base_deselect_all_visible(view_layer);
+		ED_object_base_deselect_all(view_layer, SEL_DESELECT);
 	}
 
 	CTX_DATA_BEGIN (C, Base *, base, visible_bases)
@@ -571,7 +601,7 @@ static int object_select_linked_exec(bContext *C, wmOperator *op)
 	extend = RNA_boolean_get(op->ptr, "extend");
 
 	if (extend == 0) {
-		ED_object_base_deselect_all_visible(view_layer);
+		ED_object_base_deselect_all(view_layer, SEL_DESELECT);
 	}
 
 	ob = OBACT(view_layer);
@@ -940,7 +970,7 @@ static int object_select_grouped_exec(bContext *C, wmOperator *op)
 	extend = RNA_boolean_get(op->ptr, "extend");
 
 	if (extend == 0) {
-		changed = ED_object_base_deselect_all_visible(view_layer);
+		changed = ED_object_base_deselect_all(view_layer, SEL_DESELECT);
 	}
 
 	ob = OBACT(view_layer);
@@ -1024,49 +1054,27 @@ void OBJECT_OT_select_grouped(wmOperatorType *ot)
 
 static int object_select_all_exec(bContext *C, wmOperator *op)
 {
+	ViewLayer *view_layer = CTX_data_view_layer(C);
 	int action = RNA_enum_get(op->ptr, "action");
+	bool any_visible = false;
 
-	/* passthrough if no objects are visible */
-	if (CTX_DATA_COUNT(C, visible_bases) == 0) return OPERATOR_PASS_THROUGH;
+	bool changed = ED_object_base_deselect_all_ex(view_layer, action, &any_visible);
 
-	if (action == SEL_TOGGLE) {
-		action = SEL_SELECT;
-		CTX_DATA_BEGIN (C, Base *, base, visible_bases)
-		{
-			if ((base->flag & BASE_SELECTED) != 0) {
-				action = SEL_DESELECT;
-				break;
-			}
-		}
-		CTX_DATA_END;
-	}
+	if (changed) {
+		Scene *scene = CTX_data_scene(C);
+		DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
+		WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
 
-	CTX_DATA_BEGIN (C, Base *, base, visible_bases)
-	{
-		switch (action) {
-			case SEL_SELECT:
-				ED_object_base_select(base, BA_SELECT);
-				break;
-			case SEL_DESELECT:
-				ED_object_base_select(base, BA_DESELECT);
-				break;
-			case SEL_INVERT:
-				if ((base->flag & BASE_SELECTED) != 0) {
-					ED_object_base_select(base, BA_DESELECT);
-				}
-				else {
-					ED_object_base_select(base, BA_SELECT);
-				}
-				break;
-		}
+		return OPERATOR_FINISHED;
+	}
+	else if (any_visible == false) {
+		/* TODO(campbell): Looks like we could remove this,
+		 * if not comment should say why its needed. */
+		return OPERATOR_PASS_THROUGH;
+	}
+	else {
+		return OPERATOR_CANCELLED;
 	}
-	CTX_DATA_END;
-
-	Scene *scene = CTX_data_scene(C);
-	DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
-	WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
-
-	return OPERATOR_FINISHED;
 }
 
 void OBJECT_OT_select_all(wmOperatorType *ot)



More information about the Bf-blender-cvs mailing list