[Bf-blender-cvs] [a059958] wiggly-widgets: (Un-)Register widgets attached to modal operator with the operatortype

Julian Eisel noreply at git.blender.org
Thu Feb 18 21:12:56 CET 2016


Commit: a05995850666425987b549ae67b01a871693fee8
Author: Julian Eisel
Date:   Thu Feb 18 20:54:33 2016 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBa05995850666425987b549ae67b01a871693fee8

(Un-)Register widgets attached to modal operator with the operatortype

We have some widgets-groups that are attached to modal operators, meaning, they are only visible (actually accessible) as long as the modal OP runs. I simplified the process of setting those up by adding a wmWidgetGroupType pointer to wmOperatorType struct. If you assign a value to it, everything else is handled by widget system.

Also, previously key map entries for widget-groups attached to modal OP's were only visible while the OP ran, since it was registered and unregistered during OP runtime. This is fixed, since they are now (un-)registered with the OP-type.

===================================================================

M	source/blender/editors/space_api/spacetypes.c
M	source/blender/editors/space_graph/graph_edit.c
M	source/blender/editors/space_sequencer/sequencer_view.c
M	source/blender/windowmanager/WM_types.h
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/widgets/WM_widget_api.h
M	source/blender/windowmanager/widgets/WM_widget_types.h
M	source/blender/windowmanager/widgets/intern/wm_widgetgroup.c
M	source/blender/windowmanager/widgets/intern/wm_widgetmap.c
M	source/blender/windowmanager/widgets/wm_widget_wmapi.h

===================================================================

diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index c34be79..627ae9d 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -124,13 +124,13 @@ void ED_spacetypes_init(void)
 	
 	spacetypes = BKE_spacetypes_list();
 	for (type = spacetypes->first; type; type = type->next) {
-		/* register operators, dropboxes, widgets */
+		/* register widgets, operators, dropboxes */
+		if (type->widgets)
+			type->widgets();
 		if (type->operatortypes)
 			type->operatortypes();
 		if (type->dropboxes)
 			type->dropboxes();
-		if (type->widgets)
-			type->widgets();
 	}
 
 	/* register internal render callbacks */
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index b9562a5..3c7afff 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -2600,7 +2600,6 @@ typedef struct BackDropTransformData {
 	float init_offset[2];
 	float init_zoom;
 	short event_type;
-	wmWidgetGroupType *cagetype;
 } BackDropTransformData;
 
 static int graph_widget_backdrop_transform_poll(bContext *C)
@@ -2636,30 +2635,32 @@ static void widgetgroup_backdrop_create(const struct bContext *C, struct wmWidge
 	WM_widget_set_origin(cage, origin);
 }
 
+static wmWidgetGroupType *graph_widget_backdrop_transform_widgets(void)
+{
+	/* no poll, lives always for the duration of the operator */
+	return WM_widgetgrouptype_register(
+	            NULL,
+	            &(const struct wmWidgetMapType_Params) {"Graph_Canvas", SPACE_IPO, RGN_TYPE_WINDOW, 0},
+	            NULL, widgetgroup_backdrop_create,
+	            WM_widgetgroup_keymap_common,
+	            "Backdrop Transform Widgets");
+}
+
 static int graph_widget_backdrop_transform_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
 	ScrArea *sa = CTX_wm_area(C);
 	SpaceIpo *sipo = CTX_wm_space_graph(C);
-	/* no poll, lives always for the duration of the operator */
-	wmWidgetGroupType *cagetype = WM_widgetgrouptype_register(
-	        CTX_data_main(C),
-	        &(const struct wmWidgetMapType_Params) {"Graph_Canvas", SPACE_IPO, RGN_TYPE_WINDOW, 0},
-	        NULL, widgetgroup_backdrop_create,
-	        WM_widgetgroup_keymap_common,
-	        "Backdrop Transform Widgets");
-	struct wmEventHandler *handler = WM_event_add_modal_handler(C, op);
 	BackDropTransformData *data = MEM_mallocN(sizeof(BackDropTransformData), "overdrop transform data");
-	WM_widgetgroup_attach_to_modal_handler(C, handler, cagetype, op);
 
 	RNA_float_set_array(op->ptr, "offset", sipo->backdrop_offset);
 	RNA_float_set(op->ptr, "scale", sipo->backdrop_zoom);
 
 	copy_v2_v2(data->init_offset, sipo->backdrop_offset);
 	data->init_zoom = sipo->backdrop_zoom;
-	data->cagetype = cagetype;
 	data->event_type = event->type;
 
 	op->customdata = data;
+	WM_event_add_modal_handler(C, op);
 
 	ED_area_headerprint(sa, "Drag to place, and scale, Space/Enter/Caller key to confirm, R to recenter, RClick/Esc to cancel");
 
@@ -2670,7 +2671,6 @@ static void graph_widget_backdrop_transform_finish(bContext *C, BackDropTransfor
 {
 	ScrArea *sa = CTX_wm_area(C);
 	ED_area_headerprint(sa, NULL);
-	WM_widgetgrouptype_unregister(C, CTX_data_main(C), data->cagetype);
 	MEM_freeN(data);
 }
 
@@ -2756,7 +2756,9 @@ void GRAPH_OT_widget_backdrop_transform(struct wmOperatorType *ot)
 
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-	
+
+	ot->wgrouptype = graph_widget_backdrop_transform_widgets();
+
 	RNA_def_float_array(ot->srna, "offset", 2, default_offset, FLT_MIN, FLT_MAX, "Offset", "Offset of the backdrop", FLT_MIN, FLT_MAX);
 	RNA_def_float(ot->srna, "scale", 1.0f, 0.0f, FLT_MAX, "Scale", "Scale of the backdrop", 0.0f, FLT_MAX);
 }
diff --git a/source/blender/editors/space_sequencer/sequencer_view.c b/source/blender/editors/space_sequencer/sequencer_view.c
index 00184a7..906acae 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -255,7 +255,6 @@ typedef struct OverDropTransformData {
 	float init_zoom;
 	float init_offset[2];
 	int event_type;
-	wmWidgetGroupType *cagetype;
 } OverDropTransformData;
 
 static int sequencer_overdrop_transform_poll(bContext *C)
@@ -288,30 +287,32 @@ static void widgetgroup_overdrop_create(const struct bContext *C, struct wmWidge
 	WM_widget_set_origin(cage, origin);
 }
 
-static int sequencer_overdrop_transform_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+static wmWidgetGroupType *sequencer_overdrop_widgets(void)
 {
-	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_register(
-	        CTX_data_main(C),
+	return WM_widgetgrouptype_register(
+	        NULL,
 	        &(const struct wmWidgetMapType_Params) {"Seq_Canvas", SPACE_SEQ, RGN_TYPE_WINDOW, 0},
 	        NULL, widgetgroup_overdrop_create,
 	        WM_widgetgroup_keymap_common,
 	        "Backdrop Transform Widgets");
-	struct wmEventHandler *handler = WM_event_add_modal_handler(C, op);
+}
+
+static int sequencer_overdrop_transform_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	ScrArea *sa = CTX_wm_area(C);
+	SpaceSeq *sseq = CTX_wm_space_seq(C);
 	OverDropTransformData *data = MEM_mallocN(sizeof(OverDropTransformData), "overdrop transform data");
-	WM_widgetgroup_attach_to_modal_handler(C, handler, cagetype, op);
 	
 	RNA_float_set_array(op->ptr, "offset", sseq->overdrop_offset);
 	RNA_float_set(op->ptr, "scale", sseq->overdrop_zoom);
 
 	copy_v2_v2(data->init_offset, sseq->overdrop_offset);
 	data->init_zoom = sseq->overdrop_zoom;
-	data->cagetype = cagetype;
 	data->event_type = event->type;
 
 	op->customdata = data;
+	WM_event_add_modal_handler(C, op);
 
 	ED_area_headerprint(sa, "Drag to place, and scale, Space/Enter/Caller key to confirm, R to recenter, RClick/Esc to cancel");
 	
@@ -322,7 +323,6 @@ static void sequencer_overdrop_finish(bContext *C, OverDropTransformData *data)
 {
 	ScrArea *sa = CTX_wm_area(C);
 	ED_area_headerprint(sa, NULL);
-	WM_widgetgrouptype_unregister(C, CTX_data_main(C), data->cagetype);
 	MEM_freeN(data);
 }
 
@@ -409,7 +409,9 @@ void SEQUENCER_OT_overdrop_transform(struct wmOperatorType *ot)
 
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-	
+
+	ot->wgrouptype = sequencer_overdrop_widgets();
+
 	RNA_def_float_array(ot->srna, "offset", 2, default_offset, FLT_MIN, FLT_MAX, "Offset", "Offset of the backdrop", FLT_MIN, FLT_MAX);
 	RNA_def_float(ot->srna, "scale", 1.0f, 0.0f, FLT_MAX, "Scale", "Scale of the backdrop", 0.0f, FLT_MAX);
 }
@@ -420,7 +422,6 @@ typedef struct ImageTransformData {
 	ImBuf *ibuf; /* image to be transformed (preview image transformation widget) */
 	int init_size[2];
 	int event_type;
-	wmWidgetGroupType *cagetype;
 } ImageTransformData;
 
 static int sequencer_image_transform_widget_poll(bContext *C)
@@ -455,19 +456,23 @@ static void widgetgroup_image_transform_create(const struct bContext *C, struct
 	WM_widget_set_origin(cage, origin);
 }
 
-static int sequencer_image_transform_widget_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+
+static wmWidgetGroupType *sequencer_image_transform_widgets(void)
 {
-	ScrArea *sa = CTX_wm_area(C);
-	SpaceSeq *sseq = CTX_wm_space_seq(C);
-	Scene *scene = CTX_data_scene(C);
 	/* no poll, lives always for the duration of the operator */
-	wmWidgetGroupType *cagetype = WM_widgetgrouptype_register(
-	        CTX_data_main(C),
+	return WM_widgetgrouptype_register(
+	        NULL,
 	        &(const struct wmWidgetMapType_Params) {"Seq_Canvas", SPACE_SEQ, RGN_TYPE_PREVIEW, 0},
 	        NULL, widgetgroup_image_transform_create,
 	        WM_widgetgroup_keymap_common,
 	        "Image Transform Widgets");
-	struct wmEventHandler *handler = WM_event_add_modal_handler(C, op);
+}
+
+static int sequencer_image_transform_widget_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	ScrArea *sa = CTX_wm_area(C);
+	SpaceSeq *sseq = CTX_wm_space_seq(C);
+	Scene *scene = CTX_data_scene(C);
 	ImageTransformData *data = MEM_mallocN(sizeof(ImageTransformData), "overdrop transform data");
 	ImBuf *ibuf = sequencer_ibuf_get(CTX_data_main(C), scene, sseq, CFRA, 0, NULL);
 
@@ -475,14 +480,12 @@ static int sequencer_image_transform_widget_invoke(bContext *C, wmOperator *op,
 		return OPERATOR_CANCELLED;
 	}
 
-	WM_widgetgroup_attach_to_modal_handler(C, handler, cagetype, op);
-
 	copy_v2_v2_int(data->init_size, &ibuf->x);
-	data->cagetype = cagetype;
 	data->event_type = event->type;
 	data->ibuf = ibuf;
 
 	op->customdata = data;
+	WM_event_add_modal_handler(C, op);
 
 	ED_area_headerprint(sa, "Drag to place, and scale, Space/Enter/Caller key to confirm, R to recenter, RClick/Esc to cancel");
 
@@ -493,7 +496,6 @@ static void sequencer_image_transform_widget_finish(bContext *C, ImageTransformD
 {
 	ScrArea *sa = CTX_wm_area(C);
 	ED_area_headerprint(sa, NULL);
-	WM_widgetgrouptype_unregister(C, CTX_data_main(C), data->cagetype);
 	MEM_freeN(data);
 }
 
@@ -591,6 +593,8 @@ void SEQUENCER_OT_image_transform_widget(struct wmOperatorType *ot)
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
+	ot->wgrouptype = sequencer_image_transform_widgets();
+
 	RNA_def_float(ot->srna, "scale", 1.0f, 0.0f, FLT_MAX, "Scale", "Scale of the backdrop", 0.0f, FLT_MAX);
 }
 
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index a04fe6f..9c02f01 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -567,6 +567,9 @@ typedef struct wmOperatorType {
 	/* pointer to modal keymap, do not free! */
 	struct wmKeyMap *modalkeymap;
 
+	/* widget group that is accessible while operator runs */
+	wmWidgetGroupType *wgrouptype;
+
 	/* python needs the operator type as well */
 	int (*pyop_poll)(struct bContext *, struct wmOperatorType *ot) ATTR_WARN_UNUSED_RESULT;
 
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index bed0a34..56c0119 100644
--- a/source/blend

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list