[Bf-blender-cvs] [020d99fe92e] greasepencil-object: Implement restore mode for Tab key

Antonio Vazquez noreply at git.blender.org
Sun Jun 11 17:01:27 CEST 2017


Commit: 020d99fe92e6b3967701bfded60535409dd703ab
Author: Antonio Vazquez
Date:   Sun Jun 11 17:01:11 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB020d99fe92e6b3967701bfded60535409dd703ab

Implement restore mode for Tab key

Now when you press Tab key the mode back to previous GP mode and not to Object mode always.

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

M	source/blender/editors/gpencil/gpencil_edit.c
M	source/blender/editors/object/object_edit.c

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

diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index f3c7e9e1379..2926397be70 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -84,8 +84,43 @@
 #include "gpencil_intern.h"
 
 /* ************************************************ */
-/* Stroke Edit Mode Management */
+/* setup modes and cursor */
+static void gpencil_setup_modes(bContext *C, bGPdata *gpd, int newmode)
+{
+	if (!gpd) {
+		return;
+	}
+
+	switch (newmode)
+	{
+	case OB_MODE_GPENCIL_EDIT:
+		gpd->flag |= GP_DATA_STROKE_EDITMODE;
+		gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
+		gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
+		WM_cursor_modal_set(CTX_wm_window(C), CURSOR_STD);
+		break;
+	case OB_MODE_GPENCIL_PAINT:
+		gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
+		gpd->flag |= GP_DATA_STROKE_PAINTMODE;
+		gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
+		WM_cursor_modal_set(CTX_wm_window(C), BC_PAINTBRUSHCURSOR);
+		break;
+	case OB_MODE_GPENCIL_SCULPT:
+		gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
+		gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
+		gpd->flag |= GP_DATA_STROKE_SCULPTMODE;
+		WM_cursor_modal_set(CTX_wm_window(C), BC_CROSSCURSOR);
+		break;
+	default:
+		gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
+		gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
+		gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
+		WM_cursor_modal_set(CTX_wm_window(C), CURSOR_STD);
+		break;
+	}
+}
 
+/* Stroke Edit Mode Management */
 static int gpencil_editmode_toggle_poll(bContext *C)
 {
 	/* if using gpencil object, use this gpd */
@@ -114,9 +149,6 @@ static int gpencil_editmode_toggle_exec(bContext *C, wmOperator *UNUSED(op))
 	
 	/* Just toggle editmode flag... */
 	gpd->flag ^= GP_DATA_STROKE_EDITMODE;
-	/* disable other GP modes */
-	gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
-	gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
 	/* recalculate parent matrix */
 	if (gpd->flag & GP_DATA_STROKE_EDITMODE) {
 		ED_gpencil_reset_layers_parent(ob, gpd);
@@ -124,18 +156,24 @@ static int gpencil_editmode_toggle_exec(bContext *C, wmOperator *UNUSED(op))
 	/* set mode */
 	if (gpd->flag & GP_DATA_STROKE_EDITMODE) {
 		mode = OB_MODE_GPENCIL_EDIT;
-		WM_cursor_modal_set(CTX_wm_window(C), CURSOR_STD);
 	}
 	else {
 		mode = OB_MODE_OBJECT;
 	}
 
 	if (is_object) {
+		/* try to back previous mode */
+		if ((ob->restore_mode) && ((gpd->flag & GP_DATA_STROKE_EDITMODE) == 0)) {
+			mode = ob->restore_mode;
+		}
+		ob->restore_mode = ob->mode;
 		ob->mode = mode;
 	}
 
 	/* set workspace mode */
 	BKE_workspace_object_mode_set(workspace, mode);
+	/* setup other modes */
+	gpencil_setup_modes(C, gpd, mode);
 
 	WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, NULL);
 	WM_event_add_notifier(C, NC_SCENE | ND_MODE, NULL);
@@ -188,27 +226,27 @@ static int gpencil_paintmode_toggle_exec(bContext *C, wmOperator *UNUSED(op))
 
 	/* Just toggle paintmode flag... */
 	gpd->flag ^= GP_DATA_STROKE_PAINTMODE;
-	/* disable other GP modes */
-	gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
-	gpd->flag &= ~GP_DATA_STROKE_SCULPTMODE;
-
 	/* set mode */
 	if (gpd->flag & GP_DATA_STROKE_PAINTMODE) {
 		mode = OB_MODE_GPENCIL_PAINT;
-		/* set cursor */
-		WM_cursor_modal_set(CTX_wm_window(C), BC_PAINTBRUSHCURSOR);
 	}
 	else {
 		mode = OB_MODE_OBJECT;
-		WM_cursor_modal_set(CTX_wm_window(C), CURSOR_STD);
 	}
 
 	if (is_object) {
+		/* try to back previous mode */
+		if ((ob->restore_mode) && ((gpd->flag & GP_DATA_STROKE_PAINTMODE) == 0)) {
+			mode = ob->restore_mode;
+		}
+		ob->restore_mode = ob->mode;
 		ob->mode = mode;
 	}
 
 	/* set workspace mode */
 	BKE_workspace_object_mode_set(workspace, mode);
+	/* setup other modes */
+	gpencil_setup_modes(C, gpd, mode);
 
 	WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, NULL);
 	WM_event_add_notifier(C, NC_SCENE | ND_MODE, NULL);
@@ -261,26 +299,27 @@ static int gpencil_sculptmode_toggle_exec(bContext *C, wmOperator *UNUSED(op))
 
 	/* Just toggle sculptmode flag... */
 	gpd->flag ^= GP_DATA_STROKE_SCULPTMODE;
-	/* disable other GP modes */
-	gpd->flag &= ~GP_DATA_STROKE_EDITMODE;
-	gpd->flag &= ~GP_DATA_STROKE_PAINTMODE;
-
 	/* set mode */
 	if (gpd->flag & GP_DATA_STROKE_SCULPTMODE) {
 		mode = OB_MODE_GPENCIL_SCULPT;
-		WM_cursor_modal_set(CTX_wm_window(C), BC_CROSSCURSOR);
 	}
 	else {
 		mode = OB_MODE_OBJECT;
-		WM_cursor_modal_set(CTX_wm_window(C), CURSOR_STD);
 	}
 
 	if (is_object) {
+		/* try to back previous mode */
+		if ((ob->restore_mode) && ((gpd->flag & GP_DATA_STROKE_SCULPTMODE) == 0)) {
+			mode = ob->restore_mode;
+		}
+		ob->restore_mode = ob->mode;
 		ob->mode = mode;
 	}
 
 	/* set workspace mode */
 	BKE_workspace_object_mode_set(workspace, mode);
+	/* setup other modes */
+	gpencil_setup_modes(C, gpd, mode);
 
 	WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, NULL);
 	WM_event_add_notifier(C, NC_SCENE | ND_MODE, NULL);
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 95c3b0e25a1..b3ee245f8e7 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -1551,6 +1551,7 @@ static int object_mode_set_exec(bContext *C, wmOperator *op)
 		if ((ob->gpd) && (ob->gpd == gpd))
 		{
 			if (ELEM(mode, OB_MODE_OBJECT, OB_MODE_EDIT)) {
+				ob->restore_mode = OB_MODE_OBJECT;
 				if (ELEM(ob->mode, OB_MODE_OBJECT, OB_MODE_EDIT, OB_MODE_GPENCIL_EDIT)) {
 					WM_operator_name_call(C, "GPENCIL_OT_editmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 				}




More information about the Bf-blender-cvs mailing list