[Bf-blender-cvs] [6c7ca77c8f3] temp-workspace_mode: Fix workspace mode changes to edit-mode when adding objects

Julian Eisel noreply at git.blender.org
Sat Dec 23 16:36:43 CET 2017


Commit: 6c7ca77c8f34a199cbc4b6d32e38f628ca8b8ad5
Author: Julian Eisel
Date:   Fri Dec 22 21:06:31 2017 +0100
Branches: temp-workspace_mode
https://developer.blender.org/rB6c7ca77c8f34a199cbc4b6d32e38f628ca8b8ad5

Fix workspace mode changes to edit-mode when adding objects

Steps to reproduce were:
* Change default cube to sculpt-mode
* Tab back into object-mode
* Add new mesh object
* Tab now enters edit-mode, should enter sculpt mode instead

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

M	source/blender/editors/curve/editcurve_add.c
M	source/blender/editors/mesh/editmesh_add.c
M	source/blender/editors/mesh/mesh_navmesh.c
M	source/blender/editors/object/object_add.c

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

diff --git a/source/blender/editors/curve/editcurve_add.c b/source/blender/editors/curve/editcurve_add.c
index 281f6c3c22e..c10726bc45a 100644
--- a/source/blender/editors/curve/editcurve_add.c
+++ b/source/blender/editors/curve/editcurve_add.c
@@ -473,6 +473,8 @@ Nurb *ED_curve_add_nurbs_primitive(bContext *C, Object *obedit, float mat[4][4],
 
 static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf)
 {
+	WorkSpace *workspace = CTX_wm_workspace(C);
+	eObjectMode initial_workspace_mode = workspace->preferred_mode;
 	Object *obedit = CTX_data_edit_object(C);
 	ListBase *editnurb;
 	Nurb *nu;
@@ -532,6 +534,8 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf)
 	/* userdef */
 	if (newob && !enter_editmode) {
 		ED_object_editmode_exit(C, EM_FREEDATA);
+		/* restore workspace mode */
+		workspace->preferred_mode = initial_workspace_mode;
 	}
 
 	WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index a21fc2fffde..c1396b8fd15 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -40,6 +40,7 @@
 #include "BKE_context.h"
 #include "BKE_library.h"
 #include "BKE_editmesh.h"
+#include "BKE_workspace.h"
 
 #include "RNA_define.h"
 #include "RNA_access.h"
@@ -61,6 +62,7 @@
 /* ********* add primitive operators ************* */
 
 typedef struct MakePrimitiveData {
+	eObjectMode initial_workspace_mode;
 	float mat[4][4];
 	bool was_editmode;
 } MakePrimitiveData;
@@ -73,6 +75,11 @@ static Object *make_prim_init(bContext *C, const char *idname,
 
 	r_creation_data->was_editmode = false;
 	if (obedit == NULL || obedit->type != OB_MESH) {
+		const WorkSpace *workspace = CTX_wm_workspace(C);
+
+		/* may have to reset this later */
+		r_creation_data->initial_workspace_mode = workspace->preferred_mode;
+
 		obedit = ED_object_add_type(C, OB_MESH, idname, loc, rot, false, layer);
 
 		/* create editmode */
@@ -100,6 +107,12 @@ static void make_prim_finish(bContext *C, Object *obedit, const MakePrimitiveDat
 	/* userdef */
 	if (exit_editmode) {
 		ED_object_editmode_exit(C, EM_FREEDATA); /* adding EM_DO_UNDO messes up operator redo */
+
+		if (creation_data->initial_workspace_mode != OB_MODE_OBJECT) {
+			WorkSpace *workspace = CTX_wm_workspace(C);
+			/* restore workspace mode */
+			workspace->preferred_mode = creation_data->initial_workspace_mode;
+		}
 	}
 	WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
 }
diff --git a/source/blender/editors/mesh/mesh_navmesh.c b/source/blender/editors/mesh/mesh_navmesh.c
index db5f47dfec0..39b541e81b6 100644
--- a/source/blender/editors/mesh/mesh_navmesh.c
+++ b/source/blender/editors/mesh/mesh_navmesh.c
@@ -338,6 +338,8 @@ static Object *createRepresentation(bContext *C, struct recast_polyMesh *pmesh,
 	int i, j, k;
 	unsigned short *v;
 	int face[3];
+	WorkSpace *workspace = CTX_wm_workspace(C);
+	eObjectMode initial_workspace_mode = workspace->preferred_mode;
 	ViewLayer *view_layer = CTX_data_view_layer(C);
 	Object *obedit;
 	int createob = base == NULL;
@@ -449,7 +451,9 @@ static Object *createRepresentation(bContext *C, struct recast_polyMesh *pmesh,
 	WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
 
 
-	ED_object_editmode_exit(C, EM_FREEDATA); 
+	ED_object_editmode_exit(C, EM_FREEDATA);
+	/* restore workspace mode */
+	workspace->preferred_mode = initial_workspace_mode;
 	WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
 
 	if (createob) {
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 07eeb48eaa6..870365148a2 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -92,6 +92,7 @@
 #include "BKE_scene.h"
 #include "BKE_screen.h"
 #include "BKE_speaker.h"
+#include "BKE_workspace.h"
 
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_build.h"
@@ -594,6 +595,8 @@ void OBJECT_OT_lightprobe_add(wmOperatorType *ot)
 /* for object add operator */
 static int effector_add_exec(bContext *C, wmOperator *op)
 {
+	WorkSpace *workspace = CTX_wm_workspace(C);
+	eObjectMode initial_workspace_mode = workspace->preferred_mode;
 	Object *ob;
 	int type;
 	bool enter_editmode;
@@ -619,8 +622,11 @@ static int effector_add_exec(bContext *C, wmOperator *op)
 		ED_object_editmode_enter(C, 0);
 		ED_object_new_primitive_matrix(C, ob, loc, rot, mat);
 		BLI_addtail(&cu->editnurb->nurbs, ED_curve_add_nurbs_primitive(C, ob, mat, CU_NURBS | CU_PRIM_PATH, dia));
-		if (!enter_editmode)
+		if (!enter_editmode) {
 			ED_object_editmode_exit(C, EM_FREEDATA);
+			/* restore workspace mode */
+			workspace->preferred_mode = initial_workspace_mode;
+		}
 	}
 	else {
 		const char *name = CTX_DATA_(BLT_I18NCONTEXT_ID_OBJECT, "Field");
@@ -720,6 +726,8 @@ void OBJECT_OT_camera_add(wmOperatorType *ot)
 
 static int object_metaball_add_exec(bContext *C, wmOperator *op)
 {
+	WorkSpace *workspace = CTX_wm_workspace(C);
+	eObjectMode initial_workspace_mode = workspace->preferred_mode;
 	Object *obedit = CTX_data_edit_object(C);
 	bool newob = false;
 	bool enter_editmode;
@@ -748,6 +756,8 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
 	/* userdef */
 	if (newob && !enter_editmode) {
 		ED_object_editmode_exit(C, EM_FREEDATA);
+		/* restore workspace mode */
+		workspace->preferred_mode = initial_workspace_mode;
 	}
 
 	WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
@@ -824,7 +834,9 @@ void OBJECT_OT_text_add(wmOperatorType *ot)
 static int object_armature_add_exec(bContext *C, wmOperator *op)
 {
 	Object *obedit = CTX_data_edit_object(C);
+	WorkSpace *workspace = CTX_wm_workspace(C);
 	RegionView3D *rv3d = CTX_wm_region_view3d(C);
+	eObjectMode initial_workspace_mode = workspace->preferred_mode;
 	bool newob = false;
 	bool enter_editmode;
 	unsigned int layer;
@@ -853,8 +865,11 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
 	ED_armature_edit_bone_add_primitive(obedit, dia, view_aligned);
 
 	/* userdef */
-	if (newob && !enter_editmode)
+	if (newob && !enter_editmode) {
 		ED_object_editmode_exit(C, EM_FREEDATA);
+		/* restore workspace mode */
+		workspace->preferred_mode = initial_workspace_mode;
+	}
 
 	WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);



More information about the Bf-blender-cvs mailing list