Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2011-01-13 09:14:14 +0300
committerJoshua Leung <aligorith@gmail.com>2011-01-13 09:14:14 +0300
commit4b922c0bf3c095087a7ee40fa6fe7056bbc6b537 (patch)
tree220cb42a7e8b319284d1625e076b0ae2f3855e8e /source/blender/editors/gpencil
parent6a9d93a339478fb5f052001ad38e30aa26b0f2ea (diff)
Bugfix [#25597] Grease Pencil crash when undoing during a Sketching
Session As the key combination for undo was unhandled by Grease Pencil operator and allowed to execute, some of the lingering Grease Pencil data would get corrupted by undo as some flags may still have been set. This commit attempts to fix.workaround this problem by catching undo events, using the internal "delete last stroke" functionality to emulate undo-like behaviour as expected but without the associated risks. The underlying functionality used was already part of the original 2.4 implementation, but was exposed via the GUI instead there where it was less useful. --- Other tweaks related to Grease Pencil: 1) Spacebar can be used to end Sketching Sessions too now 2) Grease Pencil animation editor now displays GP datablocks in light blue (i.e. "sub-id") colours as per dopesheet instead of them being presented like groups. This better reflects their true nature.
Diffstat (limited to 'source/blender/editors/gpencil')
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c55
1 files changed, 37 insertions, 18 deletions
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index d5cdb552439..63c28939c21 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -1555,7 +1555,7 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
//printf("\tGP - handle modal event...\n");
/* exit painting mode (and/or end current stroke) */
- if (ELEM3(event->type, RETKEY, PADENTER, ESCKEY)) {
+ if (ELEM4(event->type, RETKEY, PADENTER, ESCKEY, SPACEKEY)) {
/* exit() ends the current stroke before cleaning up */
//printf("\t\tGP - end of paint op + end of stroke\n");
gpencil_draw_exit(C, op);
@@ -1615,24 +1615,43 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
}
}
- /* handle painting mouse-movements? */
- if ((p->status == GP_STATUS_PAINTING) &&
- (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE) || (p->flags & GP_PAINTFLAG_FIRSTRUN)) )
- {
- /* handle drawing event */
- //printf("\t\tGP - add point\n");
- gpencil_draw_apply_event(op, event);
-
- /* finish painting operation if anything went wrong just now */
- if (p->status == GP_STATUS_ERROR) {
- //printf("\t\t\t\tGP - add error done! \n");
- gpencil_draw_exit(C, op);
- estate = OPERATOR_CANCELLED;
+ /* handle mode-specific events */
+ if (p->status == GP_STATUS_PAINTING) {
+ /* handle painting mouse-movements? */
+ if (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE) || (p->flags & GP_PAINTFLAG_FIRSTRUN))
+ {
+ /* handle drawing event */
+ //printf("\t\tGP - add point\n");
+ gpencil_draw_apply_event(op, event);
+
+ /* finish painting operation if anything went wrong just now */
+ if (p->status == GP_STATUS_ERROR) {
+ //printf("\t\t\t\tGP - add error done! \n");
+ gpencil_draw_exit(C, op);
+ estate = OPERATOR_CANCELLED;
+ }
+ else {
+ /* event handled, so just tag as running modal */
+ //printf("\t\t\t\tGP - add point handled!\n");
+ estate = OPERATOR_RUNNING_MODAL;
+ }
}
- else {
- /* event handled, so just tag as running modal */
- //printf("\t\t\t\tGP - add point handled!\n");
- estate = OPERATOR_RUNNING_MODAL;
+ }
+ else if (p->status == GP_STATUS_IDLING) {
+ /* standard undo/redo shouldn't be allowed to execute or else it causes crashes, so catch it here */
+ // FIXME: this is a hardcoded hotkey that can't be changed
+ // TODO: catch redo as well, but how?
+ if (event->type == ZKEY) {
+ /* oskey = cmd key on macs as they seem to use cmd-z for undo as well? */
+ if ((event->ctrl) || (event->oskey)) {
+ /* just delete last stroke, which will look like undo to the end user */
+ //printf("caught attempted undo event... deleting last stroke \n");
+ gpencil_frame_delete_laststroke(p->gpl, p->gpf);
+
+ /* event handled, so force refresh */
+ ED_region_tag_redraw(p->ar); /* just active area for now, since doing whole screen is too slow */
+ estate = OPERATOR_RUNNING_MODAL;
+ }
}
}