[Bf-blender-cvs] [443ef39] wiggly-widgets: Minor adjustments to the cage transform widget and sequencer operator.
Antony Riakiotakis
noreply at git.blender.org
Fri Dec 12 12:34:45 CET 2014
Commit: 443ef3920357e5db3bc7c590811397a0cad39470
Author: Antony Riakiotakis
Date: Fri Dec 12 12:34:31 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB443ef3920357e5db3bc7c590811397a0cad39470
Minor adjustments to the cage transform widget and sequencer operator.
* Bigger scale handler for widget.
* Operator has description on area
* Cancelling resets position.
===================================================================
M source/blender/editors/space_sequencer/sequencer_draw.c
M source/blender/editors/space_sequencer/sequencer_view.c
M source/blender/windowmanager/WM_api.h
M source/blender/windowmanager/intern/wm_generic_widgets.c
M source/blender/windowmanager/intern/wm_widgets.c
===================================================================
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 07beb46..84bb251 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -1233,11 +1233,6 @@ void draw_image_seq(const bContext *C, Scene *scene, ARegion *ar, SpaceSeq *sseq
if (!scope)
IMB_freeImBuf(ibuf);
- if (draw_backdrop) {
- WM_widgets_draw(C, ar->widgetmaps.first);
- return;
- }
-
if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
float x1 = v2d->tot.xmin;
@@ -1558,6 +1553,9 @@ void draw_timeline_seq(const bContext *C, ARegion *ar)
/* reset view matrix */
UI_view2d_view_restore(C);
+
+ /* finally draw any widgets here */
+ WM_widgets_draw(C, ar->widgetmaps.first);
/* scrollers */
unit = (sseq->flag & SEQ_DRAWFRAMES) ? V2D_UNIT_FRAMES : V2D_UNIT_SECONDS;
diff --git a/source/blender/editors/space_sequencer/sequencer_view.c b/source/blender/editors/space_sequencer/sequencer_view.c
index b19f5e5..01e7605 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -243,6 +243,14 @@ void SEQUENCER_OT_sample(wmOperatorType *ot)
ot->flag = OPTYPE_BLOCKING;
}
+/******** Backdrop Transform *******/
+
+typedef struct BackDropTransformData {
+ float init_zoom;
+ float init_offset[2];
+ wmWidgetGroupType *cagetype;
+} BackDropTransformData;
+
static int sequencer_backdrop_transform_poll(bContext *C)
{
SpaceSeq *sseq = CTX_wm_space_seq(C);
@@ -273,17 +281,25 @@ static void widgetgroup_backdrop_draw(const struct bContext *C, struct wmWidgetG
static int sequencer_backdrop_transform_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
+ ScrArea *sa = CTX_wm_area(C);
SpaceSeq *sseq = CTX_wm_space_seq(C);
/* no poll, lives always for the duration of the operator */
wmWidgetGroupType *cagetype = WM_widgetgrouptype_new(NULL, widgetgroup_backdrop_draw, CTX_data_main(C), "Seq_Canvas", SPACE_SEQ, RGN_TYPE_WINDOW, false);
struct wmEventHandler *handler = WM_event_add_modal_handler(C, op);
- WM_modal_handler_attach_widgetgroup(handler, cagetype, op);
- WM_event_add_mousemove(C);
+ BackDropTransformData *data = MEM_mallocN(sizeof(BackDropTransformData), "backdrop transform data");
+ WM_modal_handler_attach_widgetgroup(C, handler, cagetype, op);
RNA_float_set_array(op->ptr, "offset", sseq->backdrop_offset);
RNA_float_set(op->ptr, "scale", sseq->backdrop_zoom);
+
+ copy_v2_v2(data->init_offset, sseq->backdrop_offset);
+ data->init_zoom = sseq->backdrop_zoom;
+ data->cagetype = cagetype;
+
+ op->customdata = data;
+
+ ED_area_headerprint(sa, "Drag to place, and scale, Space/Enter to confirm, R to recenter, RClick/Esc to cancel");
- op->customdata = cagetype;
return OPERATOR_RUNNING_MODAL;
}
@@ -313,13 +329,32 @@ static int sequencer_backdrop_transform_modal(bContext *C, wmOperator *op, const
}
case RETKEY:
case PADENTER:
- WM_widgetgrouptype_unregister(CTX_data_main(C), op->customdata);
+ case SPACEKEY:
+ {
+ BackDropTransformData *data = op->customdata;
+ ScrArea *sa = CTX_wm_area(C);
+ ED_area_headerprint(sa, NULL);
+ WM_widgetgrouptype_unregister(CTX_data_main(C), data->cagetype);
+ MEM_freeN(data);
return OPERATOR_FINISHED;
+ }
case ESCKEY:
case RIGHTMOUSE:
- WM_widgetgrouptype_unregister(CTX_data_main(C), op->customdata);
+ {
+ BackDropTransformData *data = op->customdata;
+ SpaceSeq *sseq = CTX_wm_space_seq(C);
+ ScrArea *sa = CTX_wm_area(C);
+
+ copy_v2_v2(sseq->backdrop_offset, data->init_offset);
+ sseq->backdrop_zoom = data->init_zoom;
+
+ ED_area_headerprint(sa, NULL);
+ WM_widgetgrouptype_unregister(CTX_data_main(C), data->cagetype);
+
+ MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
+ }
}
return OPERATOR_RUNNING_MODAL;
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index eba66e6..456e30d 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -479,7 +479,7 @@ void WM_widget_property(struct wmWidget *, int slot, struct PointerRNA *ptr, con
struct PointerRNA *WM_widget_operator(struct wmWidget *, const char *opname);
void WM_widgets_draw(const struct bContext *C, struct wmWidgetMap *wmap);
void WM_event_add_area_widgetmap_handlers(struct ARegion *ar);
-void WM_modal_handler_attach_widgetgroup(struct wmEventHandler *handler, struct wmWidgetGroupType *wgrouptype, struct wmOperator *op);
+void WM_modal_handler_attach_widgetgroup(struct bContext *C, struct wmEventHandler *handler, struct wmWidgetGroupType *wgrouptype, struct wmOperator *op);
void WM_widget_set_origin(struct wmWidget *widget, float origin[3]);
void WM_widget_set_3d_scale(struct wmWidget *widget, bool scale);
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 9eb8088..69de4cd 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -609,14 +609,16 @@ void WIDGET_dial_set_direction(struct wmWidget *widget, float direction[3])
/********* Cage widget ************/
-#define WIDGET_RECT_TRANSFORM_INTERSECT_TRANSLATE 1
-#define WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT 2
-#define WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_RIGHT 3
-#define WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_UP 4
-#define WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_DOWN 5
+enum {
+ WIDGET_RECT_TRANSFORM_INTERSECT_TRANSLATE = 1,
+ WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT = 2,
+ WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_RIGHT = 3,
+ WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_UP = 4,
+ WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_DOWN = 5
+};
#define WIDGET_RECT_MIN_WIDTH 15.0f
-#define WIDGET_RESIZER_WIDTH 10.0f
+#define WIDGET_RESIZER_WIDTH 20.0f
typedef struct RectTransformWidget {
wmWidget widget;
@@ -719,7 +721,7 @@ static void widget_rect_transform_draw(struct wmWidget *widget, const struct bCo
if (widget->flag & WM_WIDGET_HIGHLIGHT) {
glEnable(GL_BLEND);
- glColor4f(1.0f, 1.0f, 1.0f, 0.1f);
+ glColor4f(1.0f, 1.0f, 1.0f, 0.2f);
glRectf(r.xmin, r.ymin, r.xmax, r.ymax);
glDisable(GL_BLEND);
}
@@ -792,45 +794,48 @@ static int widget_rect_tranfrorm_intersect(struct bContext *UNUSED(C), const str
if (isect)
return WIDGET_RECT_TRANSFORM_INTERSECT_TRANSLATE;
- r.xmin = -half_w;
- r.ymin = -half_h;
- r.xmax = -half_w + w;
- r.ymax = half_h;
-
- isect = BLI_rctf_isect_pt_v(&r, point_local);
-
- if (isect)
- return WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT;
-
- r.xmin = half_w - w;
- r.ymin = -half_h;
- r.xmax = half_w;
- r.ymax = half_h;
-
- isect = BLI_rctf_isect_pt_v(&r, point_local);
-
- if (isect)
- return WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_RIGHT;
-
- r.xmin = -half_w;
- r.ymin = -half_h;
- r.xmax = half_w;
- r.ymax = -half_h + h;
-
- isect = BLI_rctf_isect_pt_v(&r, point_local);
-
- if (isect)
- return WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_DOWN;
-
- r.xmin = -half_w;
- r.ymin = half_h - h;
- r.xmax = half_w;
- r.ymax = half_h;
-
- isect = BLI_rctf_isect_pt_v(&r, point_local);
-
- if (isect)
- return WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_UP;
+ /* if widget does not have a scale intersection, don't do it */
+ if (cage->style & (WIDGET_RECT_TRANSFORM_STYLE_SCALE | WIDGET_RECT_TRANSFORM_STYLE_SCALE_UNIFORM)) {
+ r.xmin = -half_w;
+ r.ymin = -half_h;
+ r.xmax = -half_w + w;
+ r.ymax = half_h;
+
+ isect = BLI_rctf_isect_pt_v(&r, point_local);
+
+ if (isect)
+ return WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT;
+
+ r.xmin = half_w - w;
+ r.ymin = -half_h;
+ r.xmax = half_w;
+ r.ymax = half_h;
+
+ isect = BLI_rctf_isect_pt_v(&r, point_local);
+
+ if (isect)
+ return WIDGET_RECT_TRANSFORM_INTERSECT_SCALEX_RIGHT;
+
+ r.xmin = -half_w;
+ r.ymin = -half_h;
+ r.xmax = half_w;
+ r.ymax = -half_h + h;
+
+ isect = BLI_rctf_isect_pt_v(&r, point_local);
+
+ if (isect)
+ return WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_DOWN;
+
+ r.xmin = -half_w;
+ r.ymin = half_h - h;
+ r.xmax = half_w;
+ r.ymax = half_h;
+
+ isect = BLI_rctf_isect_pt_v(&r, point_local);
+
+ if (isect)
+ return WIDGET_RECT_TRANSFORM_INTERSECT_SCALEY_UP;
+ }
return 0;
}
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index 3e3820e..41a47b7 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -364,7 +364,7 @@ void WM_event_add_area_widgetmap_handlers(ARegion *ar)
}
}
-void WM_modal_handler_attach_widgetgroup(wmEventHandler *handler, wmWidgetGroupType *wgrouptype, wmOperator *op)
+void WM_modal_handler_attach_widgetgroup(bContext *C, wmEventHandler *handler, wmWidgetGroupType *wgrouptype, wmOperator *op)
{
/* maybe overly careful, but widgetgrouptype could come from a failed creation */
if (!wgrouptype) {
@@ -384,6 +384,8 @@ void WM_modal_handler_attach_widgetgroup(wmEventHandler *handler, wmWidgetGroupT
}
}
}
+
+ WM_event_add_mousemove(C);
}
bool wm_widget_register(struct wmWidgetGroup *wgroup, wmWidget *widget)
More information about the Bf-blender-cvs
mailing list