[Bf-blender-cvs] [6b1b0f7] GPencil_Editing_Stage3: GPencil EditMode: Some fixes to allow mode switcher to still work when there's no active object

Joshua Leung noreply at git.blender.org
Sat Sep 19 16:05:48 CEST 2015


Commit: 6b1b0f78c006c5f2ba7a6041c43ae18332a7dd02
Author: Joshua Leung
Date:   Sun Sep 20 01:58:03 2015 +1200
Branches: GPencil_Editing_Stage3
https://developer.blender.org/rB6b1b0f78c006c5f2ba7a6041c43ae18332a7dd02

GPencil EditMode: Some fixes to allow mode switcher to still work when there's no active object

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

M	source/blender/editors/object/object_edit.c
M	source/blender/editors/space_view3d/view3d_header.c
M	source/blender/makesrna/intern/rna_gpencil.c

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

diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index e797605..1203bc9 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -1635,13 +1635,35 @@ bool ED_object_mode_compat_set(bContext *C, Object *ob, int mode, ReportList *re
 	return ok;
 }
 
+static int object_mode_set_poll(bContext *C)
+{
+	/* Since Grease Pencil editmode is also handled here,
+	 * we have a special exception for allowing this operator
+	 * to still work in that case when there's no active object
+	 * so that users can exit editmode this way as per normal.
+	 */
+	if (ED_operator_object_active_editable(C))
+		return true;
+	else
+		return (CTX_data_gpencil_data(C) != NULL);
+}
+
 static int object_mode_set_exec(bContext *C, wmOperator *op)
 {
 	Object *ob = CTX_data_active_object(C);
+	bGPdata *gpd = CTX_data_gpencil_data(C);
 	ObjectMode mode = RNA_enum_get(op->ptr, "mode");
 	ObjectMode restore_mode = (ob) ? ob->mode : OB_MODE_OBJECT;
 	const bool toggle = RNA_boolean_get(op->ptr, "toggle");
-
+	
+	if (!ob && gpd) {
+		/* HACK: Just toggle GPencil editmode anyway if there's no object,
+		 *       since GPencil editing can still work... Just don't go any
+		 *       further, or else the rest of the code will break.
+		 */
+		return WM_operator_name_call(C, "GPENCIL_OT_editmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
+	}
+	
 	if (!ob || !object_mode_compat_test(ob, mode))
 		return OPERATOR_PASS_THROUGH;
 
@@ -1685,7 +1707,7 @@ void OBJECT_OT_mode_set(wmOperatorType *ot)
 	/* api callbacks */
 	ot->exec = object_mode_set_exec;
 	
-	ot->poll = ED_operator_object_active_editable;
+	ot->poll = object_mode_set_poll; //ED_operator_object_active_editable;
 	
 	/* flags */
 	ot->flag = 0; /* no register/undo here, leave it to operators being called */
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index 42895a7..c687ee1 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -34,6 +34,7 @@
 
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"
+#include "DNA_gpencil_types.h"
 
 #include "BLI_utildefines.h"
 
@@ -287,6 +288,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
 	PointerRNA v3dptr, toolsptr, sceneptr;
 	Object *ob = OBACT;
 	Object *obedit = CTX_data_edit_object(C);
+	bGPdata *gpd = CTX_data_gpencil_data(C);
 	uiBlock *block;
 	uiLayout *row;
 	bool is_paint = false;
@@ -307,6 +309,9 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
 		modeselect = ob->mode;
 		is_paint = ELEM(ob->mode, OB_MODE_SCULPT, OB_MODE_VERTEX_PAINT, OB_MODE_WEIGHT_PAINT, OB_MODE_TEXTURE_PAINT);
 	}
+	else if ((gpd) && (gpd->flag & GP_DATA_STROKE_EDITMODE)) {
+		modeselect = OB_MODE_GPENCIL;
+	}
 	else {
 		modeselect = OB_MODE_OBJECT;
 	}
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index 1698696..1430b16 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -71,8 +71,8 @@ static void rna_GPencil_editmode_update(Main *UNUSED(bmain), Scene *scene, Point
 	 * since the normal mode selector can now be used for changing these modes
 	 * too when using the datablock in the 3D View.
 	 */
-	if (gpd) {
-		if ((scene->gpd == gpd) || (ob && (ob->gpd == gpd))) {
+	if (gpd && ob) {
+		if ((scene->gpd == gpd) || (ob->gpd == gpd)) {
 			ob->restore_mode = ob->mode;
 			
 			if (gpd->flag & GP_DATA_STROKE_EDITMODE) {




More information about the Bf-blender-cvs mailing list