[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59629] trunk/blender/source/blender/ editors: follow up on r59628, setting modes now ensures that other modes exit first,

Campbell Barton ideasman42 at gmail.com
Thu Aug 29 12:34:09 CEST 2013


Revision: 59629
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59629
Author:   campbellbarton
Date:     2013-08-29 10:34:09 +0000 (Thu, 29 Aug 2013)
Log Message:
-----------
follow up on r59628, setting modes now ensures that other modes exit first,
this was only done in some cases before and it was possible to enable weightpaint+sculpt at the same time when enabling sculpt by directly running the mode switching operator.

add generic function to ensure a compatible mode before entering the new mode (added to each operators exec function)

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59628

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_object.h
    trunk/blender/source/blender/editors/object/object_edit.c
    trunk/blender/source/blender/editors/physics/particle_edit.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c

Modified: trunk/blender/source/blender/editors/include/ED_object.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_object.h	2013-08-29 08:57:12 UTC (rev 59628)
+++ trunk/blender/source/blender/editors/include/ED_object.h	2013-08-29 10:34:09 UTC (rev 59629)
@@ -123,6 +123,7 @@
 
 void ED_object_parent(struct Object *ob, struct Object *parent, int type, const char *substr);
 
+bool ED_object_mode_compat_set(struct bContext *C, struct Object *ob, int mode, struct ReportList *reports);
 void ED_object_toggle_modes(struct bContext *C, int mode);
 
 /* bitflags for enter/exit editmode */

Modified: trunk/blender/source/blender/editors/object/object_edit.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_edit.c	2013-08-29 08:57:12 UTC (rev 59628)
+++ trunk/blender/source/blender/editors/object/object_edit.c	2013-08-29 10:34:09 UTC (rev 59629)
@@ -79,6 +79,7 @@
 #include "BKE_softbody.h"
 #include "BKE_modifier.h"
 #include "BKE_editmesh.h"
+#include "BKE_report.h"
 
 #include "ED_armature.h"
 #include "ED_curve.h"
@@ -556,11 +557,20 @@
 	if (flag & EM_WAITCURSOR) waitcursor(0);
 }
 
-static int editmode_toggle_exec(bContext *C, wmOperator *UNUSED(op))
+static int editmode_toggle_exec(bContext *C, wmOperator *op)
 {
+	const int mode_flag = OB_MODE_EDIT;
+	const bool is_mode_set = CTX_data_edit_object(C);
 	ToolSettings *toolsettings =  CTX_data_tool_settings(C);
 
-	if (!CTX_data_edit_object(C))
+	if (!is_mode_set) {
+		Scene *scene = CTX_data_scene(C);
+		if (!ED_object_mode_compat_set(C, scene->basact->object, mode_flag, op->reports)) {
+			return OPERATOR_CANCELLED;
+		}
+	}
+
+	if (!is_mode_set)
 		ED_object_editmode_enter(C, EM_WAITCURSOR);
 	else
 		ED_object_editmode_exit(C, EM_FREEDATA | EM_FREEUNDO | EM_WAITCURSOR);  /* had EM_DO_UNDO but op flag calls undo too [#24685] */
@@ -582,10 +592,7 @@
 	if ((ob->restrictflag & OB_RESTRICT_VIEW) && !(ob->mode & OB_MODE_EDIT))
 		return 0;
 
-	return (ob->type == OB_MESH || ob->type == OB_ARMATURE ||
-	        ob->type == OB_FONT || ob->type == OB_MBALL ||
-	        ob->type == OB_LATTICE || ob->type == OB_SURF ||
-	        ob->type == OB_CURVE);
+	return (ELEM7(ob->type, OB_MESH, OB_ARMATURE, OB_FONT, OB_MBALL, OB_LATTICE, OB_SURF, OB_CURVE));
 }
 
 void OBJECT_OT_editmode_toggle(wmOperatorType *ot)
@@ -598,7 +605,6 @@
 	
 	/* api callbacks */
 	ot->exec = editmode_toggle_exec;
-	
 	ot->poll = editmode_toggle_poll;
 	
 	/* flags */
@@ -607,16 +613,25 @@
 
 /* *************************** */
 
-static int posemode_exec(bContext *C, wmOperator *UNUSED(op))
+static int posemode_exec(bContext *C, wmOperator *op)
 {
 	Base *base = CTX_data_active_base(C);
+	Object *ob = base->object;
+	const int mode_flag = OB_MODE_POSE;
+	const bool is_mode_set = (ob->mode & mode_flag) != 0;
 	
-	if (base->object->type == OB_ARMATURE) {
-		if (base->object == CTX_data_edit_object(C)) {
+	if (!is_mode_set) {
+		if (ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
+			return OPERATOR_CANCELLED;
+		}
+	}
+
+	if (ob->type == OB_ARMATURE) {
+		if (ob == CTX_data_edit_object(C)) {
 			ED_object_editmode_exit(C, EM_FREEDATA | EM_DO_UNDO);
 			ED_armature_enter_posemode(C, base);
 		}
-		else if (base->object->mode & OB_MODE_POSE)
+		else if (is_mode_set)
 			ED_armature_exit_posemode(C, base);
 		else
 			ED_armature_enter_posemode(C, base);
@@ -1503,7 +1518,7 @@
 /* checks the mode to be set is compatible with the object
  * should be made into a generic function
  */
-static bool object_mode_set_compat(Object *ob, ObjectMode mode)
+static bool object_mode_compat_test(Object *ob, ObjectMode mode)
 {
 	if (ob) {
 		if (mode == OB_MODE_OBJECT)
@@ -1538,6 +1553,30 @@
 	return false;
 }
 
+/**
+ * Sets the mode to a compatible state (use before entering the mode).
+ *
+ * This is so each mode's exec function can call
+ */
+bool ED_object_mode_compat_set(bContext *C, Object *ob, int mode, ReportList *reports)
+{
+	bool ok;
+	if (!ELEM(ob->mode, mode, OB_MODE_OBJECT)) {
+		const char *opstring = object_mode_op_string(ob->mode);
+		WM_operator_name_call(C, opstring, WM_OP_EXEC_REGION_WIN, NULL);
+		ok = ELEM(ob->mode, mode, OB_MODE_OBJECT);
+		if (!ok) {
+			wmOperatorType *ot = WM_operatortype_find(opstring, false);
+			BKE_reportf(reports, RPT_ERROR, "Unable to execute '%s', error changing modes", ot->name);
+		}
+	}
+	else {
+		ok = true;
+	}
+
+	return ok;
+}
+
 static int object_mode_set_exec(bContext *C, wmOperator *op)
 {
 	Object *ob = CTX_data_active_object(C);
@@ -1545,14 +1584,15 @@
 	ObjectMode restore_mode = (ob) ? ob->mode : OB_MODE_OBJECT;
 	int toggle = RNA_boolean_get(op->ptr, "toggle");
 
-	if (!ob || !object_mode_set_compat(ob, mode))
+	if (!ob || !object_mode_compat_test(ob, mode))
 		return OPERATOR_PASS_THROUGH;
 
-	/* Exit current mode if it's not the mode we're setting */
-	if (ob->mode != OB_MODE_OBJECT && ob->mode != mode) {
-		WM_operator_name_call(C, object_mode_op_string(ob->mode), WM_OP_EXEC_REGION_WIN, NULL);
+	if (ob->mode != mode) {
+		/* we should be able to remove this call, each operator calls  */
+		ED_object_mode_compat_set(C, ob, mode, op->reports);
 	}
 
+	/* Exit current mode if it's not the mode we're setting */
 	if (mode != OB_MODE_OBJECT && (ob->mode != mode || toggle)) {
 		/* Enter new mode */
 		WM_operator_name_call(C, object_mode_op_string(mode), WM_OP_EXEC_REGION_WIN, NULL);

Modified: trunk/blender/source/blender/editors/physics/particle_edit.c
===================================================================
--- trunk/blender/source/blender/editors/physics/particle_edit.c	2013-08-29 08:57:12 UTC (rev 59628)
+++ trunk/blender/source/blender/editors/physics/particle_edit.c	2013-08-29 10:34:09 UTC (rev 59629)
@@ -69,6 +69,7 @@
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
 
+#include "ED_object.h"
 #include "ED_physics.h"
 #include "ED_mesh.h"
 #include "ED_particle.h"
@@ -4345,23 +4346,36 @@
 
 static int particle_edit_toggle_poll(bContext *C)
 {
-	Scene *scene= CTX_data_scene(C);
-	Object *ob= CTX_data_active_object(C);
+	Object *ob = CTX_data_active_object(C);
 
-	if (!scene || !ob || ob->id.lib)
+	if (ob == NULL || ob->type != OB_MESH)
 		return 0;
-	
-	return (ob->particlesystem.first || modifiers_findByType(ob, eModifierType_Cloth) || modifiers_findByType(ob, eModifierType_Softbody));
+	if (!ob->data || ((ID *)ob->data)->lib)
+		return 0;
+	if (CTX_data_edit_object(C))
+		return 0;
+
+	return (ob->particlesystem.first ||
+	        modifiers_findByType(ob, eModifierType_Cloth) ||
+	        modifiers_findByType(ob, eModifierType_Softbody));
 }
 
-static int particle_edit_toggle_exec(bContext *C, wmOperator *UNUSED(op))
+static int particle_edit_toggle_exec(bContext *C, wmOperator *op)
 {
-	Scene *scene= CTX_data_scene(C);
-	Object *ob= CTX_data_active_object(C);
+	Scene *scene = CTX_data_scene(C);
+	Object *ob = CTX_data_active_object(C);
+	const int mode_flag = OB_MODE_PARTICLE_EDIT;
+	const bool is_mode_set = (ob->mode & mode_flag) != 0;
 
-	if (!(ob->mode & OB_MODE_PARTICLE_EDIT)) {
+	if (!is_mode_set) {
+		if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
+			return OPERATOR_CANCELLED;
+		}
+	}
+
+	if (!is_mode_set) {
 		PTCacheEdit *edit;
-		ob->mode |= OB_MODE_PARTICLE_EDIT;
+		ob->mode |= mode_flag;
 		edit= PE_create_current(scene, ob);
 	
 		/* mesh may have changed since last entering editmode.
@@ -4373,7 +4387,7 @@
 		WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_PARTICLE, NULL);
 	}
 	else {
-		ob->mode &= ~OB_MODE_PARTICLE_EDIT;
+		ob->mode &= ~mode_flag;
 		toggle_particle_cursor(C, 0);
 		WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL);
 	}

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2013-08-29 08:57:12 UTC (rev 59628)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2013-08-29 10:34:09 UTC (rev 59629)
@@ -82,6 +82,7 @@
 #include "UI_view2d.h"
 
 #include "ED_image.h"
+#include "ED_object.h"
 #include "ED_screen.h"
 #include "ED_sculpt.h"
 #include "ED_uvedit.h"
@@ -1006,10 +1007,13 @@
 
 static int texture_paint_toggle_poll(bContext *C)
 {
-	if (CTX_data_edit_object(C))
+	Object *ob = CTX_data_active_object(C);
+	if (ob == NULL || ob->type != OB_MESH)
 		return 0;
-	if (CTX_data_active_object(C) == NULL)
+	if (!ob->data || ((ID *)ob->data)->lib)
 		return 0;
+	if (CTX_data_edit_object(C))
+		return 0;
 
 	return 1;
 }
@@ -1018,26 +1022,21 @@
 {
 	Scene *scene = CTX_data_scene(C);
 	Object *ob = CTX_data_active_object(C);
-	Mesh *me = NULL;
-	
-	if (ob == NULL)
-		return OPERATOR_CANCELLED;
-	
-	if (BKE_object_obdata_is_libdata(ob)) {
-		BKE_report(op->reports, RPT_ERROR, "Cannot edit external libdata");
-		return OPERATOR_CANCELLED;
+	const int mode_flag = OB_MODE_TEXTURE_PAINT;
+	const bool is_mode_set = (ob->mode & mode_flag) != 0;
+	Mesh *me;
+
+	if (!is_mode_set) {
+		if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
+			return OPERATOR_CANCELLED;
+		}
 	}
 
 	me = BKE_mesh_from_object(ob);
 
-	if (!(ob->mode & OB_MODE_TEXTURE_PAINT) && !me) {
-		BKE_report(op->reports, RPT_ERROR, "Can only enter texture paint mode for mesh objects");
-		return OPERATOR_CANCELLED;
-	}
+	if (ob->mode & mode_flag) {
+		ob->mode &= ~mode_flag;
 
-	if (ob->mode & OB_MODE_TEXTURE_PAINT) {
-		ob->mode &= ~OB_MODE_TEXTURE_PAINT;
-
 		if (U.glreslimit != 0)
 			GPU_free_images();
 		GPU_paint_set_mipmap(1);
@@ -1045,7 +1044,7 @@
 		toggle_paint_cursor(C, 0);
 	}
 	else {
-		ob->mode |= OB_MODE_TEXTURE_PAINT;
+		ob->mode |= mode_flag;
 
 		if (me->mtface == NULL)
 			me->mtface = CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DEFAULT,

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c	2013-08-29 08:57:12 UTC (rev 59628)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c	2013-08-29 10:34:09 UTC (rev 59629)
@@ -69,6 +69,7 @@
 #include "GPU_buffers.h"
 
 #include "ED_armature.h"
+#include "ED_object.h"
 #include "ED_mesh.h"
 #include "ED_screen.h"
 #include "ED_view3d.h"
@@ -76,8 +77,6 @@
 #include "paint_intern.h"  /* own include */
 
 
-static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op);
-

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list