Commit: be0dcd4e3429dcbaaf4f2884695e883438fd0b95
Author: Joshua Leung
Date: Fri May 1 12:42:10 2015 +1200
Branches: master
https://developer.blender.org/rBbe0dcd4e3429dcbaaf4f2884695e883438fd0b95
Fix T43867: Clicking outside the viewport exits now Grease Pencil "Continous
Draw" mode
When working with a pen only, it was previously impossible to exit Grease Pencil
draw mode (when continous drawing was enabled). Now, clicking outside the
drawing region
(e.g. in the timeline, properties editor, or the header/properties/toolshelf
regions)
where you are drawing will exit this mode.
Some corner cases to be aware of:
* When Region Overlap is enabled, clicking on the overlapping panels still exits
draw mode (even though you can see behind the buttons)
* In the Nodes Editor, clicking on a node (while in drawmode) will still draw a
dot/stroke. But, you can still exit drawmode by clicking on any of the panels
(properties/toolshelf/header) mentioned earlier
* To cope with cases where the operator is launched from the toolshelf, the
code now sets a new "active region" when the first stroke is performed
(based on what region is under the cursor at the time of that stroke),
overwriting the setting that got stored when invoking the operator (i.e. the
toolshelf).
This change doesn't have any real user-visible effects, other than making it
possible for
this fix to actually work without breaking that use case.
===================================================================
M source/blender/editors/gpencil/gpencil_paint.c
===================================================================
diff --git a/source/blender/editors/gpencil/gpencil_paint.c
b/source/blender/editors/gpencil/gpencil_paint.c
index 778f98d..bcce5cc 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -48,6 +48,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_report.h"
+#include "BKE_screen.h"
#include "BKE_tracking.h"
#include "DNA_object_types.h"
@@ -1030,6 +1031,7 @@ static bool gp_session_initdata(bContext *C, tGPsdata *p)
/* set current area
* - must verify that region data is 3D-view (and
not something else)
*/
+ /* CAUTION: If this is the "toolbar", then this will
change on the first stroke */
p->sa = curarea;
p->ar = ar;
@@ -1938,25 +1940,81 @@ static int gpencil_draw_modal(bContext *C, wmOperator
*op, const wmEvent *event)
}
}
else if (event->val == KM_PRESS) {
- /* Switch paintmode (temporarily if need be) based on
which button was used
- * NOTE: This is to make it more convenient to erase
strokes when using drawing sessions
+ bool in_bounds = false;
+
+ /* Check if we're outside the bounds of the active
region
+ * NOTE: An exception here is that if launched from the
toolbar,
+ * whatever region we're now in should become the
new region
*/
- if (event->type == LEFTMOUSE) {
- /* restore drawmode to default */
- p->paintmode = RNA_enum_get(op->ptr, "mode");
+ if ((p->ar) && (p->ar->regiontype == RGN_TYPE_TOOLS)) {
+ /* Change to whatever region is now under the
mouse */
+ ARegion *current_region =
BKE_area_find_region_xy(p->sa, RGN_TYPE_ANY, event->x, event->y);
+
+ printf("found alternative region %p (old was
%p) - at %d %d (sa: %d %d -> %d %d)\n",
+ current_region, p->ar, event->x,
event->y,
+ p->sa->totrct.xmin, p->sa->totrct.ymin,
p->sa->totrct.xmax, p->sa->totrct.ymax);
+
+ if (current_region) {
+ /* Assume that since we found the
cursor in here, it is in bounds
+ * and that this should be the region
that we begin drawing in
+ */
+ p->ar = current_region;
+ in_bounds = true;
+ }
+ else {
+ /* Out of bounds, or invalid in some
other way */
+ p->status = GP_STATUS_ERROR;
+ estate = OPERATOR_CANCELLED;
+
+ if (G.debug & G_DEBUG)
+ printf("%s: Region under cursor
is out of bounds, so cannot be drawn on\n", __func__);
+ }
}
- else if (event->type == RIGHTMOUSE) {
- /* turn on eraser */
- p->paintmode = GP_PAINTMODE_ERASER;
+ else if (p->ar) {
+ rcti region_rect;
+
+ /* Perform bounds check using */
+ ED_region_visible_rect(p->ar, ®ion_rect);
+ in_bounds = BLI_rcti_isect_pt_v(®ion_rect,
event->mval);
}
-
- gpencil_draw_toggle_eraser_cursor(C, p, p->paintmode ==
GP_PAINTMODE_ERASER);
-
- /* not painting, so start stroke (this should be
mouse-button down) */
- p = gpencil_stroke_begin(C, op);
-
- if (p->status == GP_STATUS_ERROR) {
+ else {
+ /* No region */
+ p->status = GP_STATUS_ERROR;
estate = OPERATOR_CANCELLED;
+
+ if (G.debug & G_DEBUG)
+ printf("%s: No active region found in
GP Paint session data\n", __func__);
+ }
+
+ if (in_bounds) {
+ /* Switch paintmode (temporarily if need be)
based on which button was used
+ * NOTE: This is to make it more convenient to
erase strokes when using drawing sessions
+ */
+ if (event->type == LEFTMOUSE) {
+ /* restore drawmode to default */
+ p->paintmode = RNA_enum_get(op->ptr,
"mode");
+ }
+ else if (event->type == RIGHTMOUSE) {
+ /* turn on eraser */
+ p->paintmode = GP_PAINTMODE_ERASER;
+ }
+
+ gpencil_draw_toggle_eraser_cursor(C, p,
p->paintmode == GP_PAINTMODE_ERASER);
+
+ /* not painting, so start stroke (this should
be mouse-button down) */
+ p = gpencil_stroke_begin(C, op);
+
+ if (p->status == GP_STATUS_ERROR) {
+ estate = OPERATOR_CANCELLED;
+ }
+ }
+ else if (p->status != GP_STATUS_ERROR) {
+ /* User clicked outside bounds of window while
idling, so exit paintmode
+ * NOTE: Don't eter this case if an error
occurred while finding the
+ * region (as above)
+ */
+ p->status = GP_STATUS_DONE;
+ estate = OPERATOR_FINISHED;
}
}
else {
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs