[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