[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