[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