diff options
author | Joshua Leung <aligorith@gmail.com> | 2011-01-13 09:14:14 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2011-01-13 09:14:14 +0300 |
commit | 4b922c0bf3c095087a7ee40fa6fe7056bbc6b537 (patch) | |
tree | 220cb42a7e8b319284d1625e076b0ae2f3855e8e /source/blender | |
parent | 6a9d93a339478fb5f052001ad38e30aa26b0f2ea (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')
-rw-r--r-- | source/blender/editors/animation/anim_channels_defines.c | 7 | ||||
-rw-r--r-- | source/blender/editors/gpencil/gpencil_paint.c | 55 |
2 files changed, 39 insertions, 23 deletions
diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c index a6d80763718..b2ee2f008f5 100644 --- a/source/blender/editors/animation/anim_channels_defines.c +++ b/source/blender/editors/animation/anim_channels_defines.c @@ -2412,11 +2412,8 @@ static bAnimChannelType ACF_SHAPEKEY= /* get backdrop color for gpencil datablock widget */ static void acf_gpd_color(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), float *color) { - /* highlight only for datablock channels */ - //if (ale->flag & AGRP_ACTIVE) - // UI_GetThemeColorShade3fv(TH_GROUP_ACTIVE, 10, color); - //else - UI_GetThemeColorShade3fv(TH_GROUP, 20, color); + /* these are ID-blocks, but not exactly standalone... */ + UI_GetThemeColorShade3fv(TH_DOPESHEET_CHANNELSUBOB, 20, color); } // TODO: just get this from RNA? 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; + } } } |