[Bf-blender-cvs] [fac8a0c] wiggly-widgets: Privatize registration function for individual widgets. Handle events for widgetmap first when and pass to operator when operator is active.
Antony Riakiotakis
noreply at git.blender.org
Wed Dec 10 15:57:38 CET 2014
Commit: fac8a0c4f9557de04ad51931b1a82e1dca4ae258
Author: Antony Riakiotakis
Date: Wed Dec 10 15:57:27 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBfac8a0c4f9557de04ad51931b1a82e1dca4ae258
Privatize registration function for individual widgets.
Handle events for widgetmap first when and pass to operator when
operator is active.
This is still a pretty confusing design, working on a simpler one now.
===================================================================
M source/blender/editors/space_sequencer/sequencer_view.c
M source/blender/windowmanager/WM_api.h
M source/blender/windowmanager/intern/wm_event_system.c
M source/blender/windowmanager/intern/wm_generic_widgets.c
M source/blender/windowmanager/intern/wm_widgets.c
M source/blender/windowmanager/wm.h
M source/blender/windowmanager/wm_event_system.h
===================================================================
diff --git a/source/blender/editors/space_sequencer/sequencer_view.c b/source/blender/editors/space_sequencer/sequencer_view.c
index f6befd5..c3d3ce2 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -269,9 +269,8 @@ static int sequencer_backdrop_transform_invoke(bContext *C, wmOperator *op, cons
{
/* 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);
-
- WM_event_add_modal_handler(C, op);
- WM_event_add_widget_modal_handler(C, cagetype, op);
+ struct wmEventHandler *handler = WM_event_add_modal_handler(C, op);
+ WM_modal_handler_attach_widgetgroup(handler, cagetype, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -284,6 +283,7 @@ static int sequencer_backdrop_transform_modal(bContext *C, wmOperator *op, const
case LEFTMOUSE:
if (event->val == KM_DBL_CLICK)
return OPERATOR_FINISHED;
+ break;
case RETKEY:
return OPERATOR_FINISHED;
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 6ad62c4..d2eb729 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -480,9 +480,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 ARegion *ar);
void WM_event_add_widget_handler(struct ARegion *ar);
-struct wmEventHandler *WM_event_add_widget_modal_handler(struct bContext *C, struct wmWidgetGroupType *wgrouptype, struct wmOperator *op);
-
-bool WM_widget_register(struct wmWidgetGroup *wgroup, struct wmWidget *widget);
+void WM_modal_handler_attach_widgetgroup(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);
@@ -499,7 +497,6 @@ void WM_widgetgrouptype_unregister(struct Main *bmain, struct wmWidgetGroupType
/* creates a widgetmap with all registered widgets for that type */
struct wmWidgetMap *WM_widgetmap_from_type(const char *idname, int spaceid, int regionid, bool is_3d);
void WM_widgetmap_delete(struct wmWidgetMap *wmap);
-void WM_widgetmaptype_delete(struct Main *bmain,struct wmWidgetMapType *wmaptype);
void WM_widgetmaptypes_free(void);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 7111c3b..0428803 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1372,7 +1372,7 @@ static void wm_handler_widgetmap_context(bContext *C, wmEventHandler *handler)
{
bScreen *screen = CTX_wm_screen(C);
- if (screen && handler->widgetmap) {
+ if (screen) {
if (handler->op_area == NULL) {
/* do nothing in this context */
}
@@ -1424,11 +1424,12 @@ void WM_event_remove_handlers(bContext *C, ListBase *handlers)
if (handler->op->type->flag & OPTYPE_UNDO)
wm->op_undo_depth--;
-
- if (handler->op_widgetmap) {
- WM_widgetmaptype_delete(CTX_data_main(C), handler->op_widgetmap->type);
- }
+ /* if there's a widgetmap and an operator at the same time, we can assume widgetmap
+ * was added for operator */
+ if (handler->op_widgetgrouptype)
+ WM_widgetgrouptype_unregister(CTX_data_main(C), handler->op_widgetgrouptype);
+
CTX_wm_area_set(C, area);
CTX_wm_region_set(C, region);
}
@@ -2040,6 +2041,8 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
else if (handler->widgetmap) {
struct wmWidgetMap *wmap = handler->widgetmap;
unsigned char part;
+ short event_processed = 0;
+ short val_processed = event->val;
wmWidget *widget = wm_widgetmap_get_active_widget(wmap);
ScrArea *area = CTX_wm_area(C);
ARegion *region = CTX_wm_region(C);
@@ -2049,7 +2052,8 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
switch (event->type) {
case MOUSEMOVE:
if (widget) {
- widget->handler(C, event, widget);
+ val_processed = widget->handler(C, event, widget);
+ event_processed = EVT_WIDGET_UPDATE;
action |= WM_HANDLER_BREAK;
}
else if (wm_widgetmap_is_3d(wmap)) {
@@ -2067,6 +2071,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
if (widget) {
if (event->val == KM_RELEASE) {
wm_widgetmap_set_active_widget(wmap, C, event, NULL);
+ event_processed = EVT_WIDGET_RELEASED;
action |= WM_HANDLER_BREAK;
}
else {
@@ -2088,6 +2093,15 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
/* restore the area */
CTX_wm_area_set(C, area);
CTX_wm_region_set(C, region);
+
+ if (handler->op) {
+ /* if event was processed by an active widget pass the modified event to the operator */
+ if (event_processed) {
+ event->type = event_processed;
+ event->val = val_processed;
+ }
+ action |= wm_handler_operator_call(C, handlers, handler, event, NULL);
+ }
}
else {
/* handle the widget first, before passing the event down */
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index e9048fe..75bed13 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -457,7 +457,7 @@ wmWidget *WIDGET_arrow_new(wmWidgetGroup *wgroup, int style)
arrow->style = style;
copy_v3_v3(arrow->direction, dir_default);
- WM_widget_register(wgroup, &arrow->widget);
+ wm_widget_register(wgroup, &arrow->widget);
return (wmWidget *)arrow;
}
@@ -1012,7 +1012,7 @@ struct wmWidget *WIDGET_rect_transform_new(struct wmWidgetGroup *wgroup, int sty
cage->w = width;
cage->h = height;
- WM_widget_register(wgroup, &cage->widget);
+ wm_widget_register(wgroup, &cage->widget);
return (wmWidget *)cage;
}
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index 62c6b2b..5063cb3 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -232,7 +232,7 @@ static void widget_calculate_scale(wmWidget *widget, const bContext *C)
widget->scale = scale * widget->user_scale;
}
-static bool widget_compare_props(wmWidget *widget, wmWidget *widget2)
+static bool widgets_compare(wmWidget *widget, wmWidget *widget2)
{
int i;
@@ -313,7 +313,7 @@ void WM_widgets_draw(const bContext *C, struct ARegion *ar)
if (highlighted) {
for (widget_iter = wgroup->widgets.first; widget_iter; widget_iter = widget_iter->next) {
- if (widget_compare_props(widget_iter, highlighted))
+ if (widgets_compare(widget_iter, highlighted))
{
widget_iter->flag |= WM_WIDGET_HIGHLIGHT;
wmap->highlighted_widget = widget_iter;
@@ -360,33 +360,28 @@ void WM_event_add_widget_handler(ARegion *ar)
BLI_addhead(&ar->handlers, handler);
}
-wmEventHandler *WM_event_add_widget_modal_handler(struct bContext *C, wmWidgetGroupType *wgrouptype, wmOperator *op)
+void WM_modal_handler_attach_widgetgroup(wmEventHandler *handler, wmWidgetGroupType *wgrouptype, wmOperator *op)
{
- wmEventHandler *handler;
- wmWindow *win;
-
/* maybe overly careful, but widgetgrouptype could come from a failed creation */
if (!wgrouptype) {
- return NULL;
+ return;
}
- handler = MEM_callocN(sizeof(wmEventHandler), "widget modal handler");
- win = CTX_wm_window(C);
-
/* now instantiate the widgetmap */
wgrouptype->op = op;
- handler->widgetmap = handler->op_widgetmap = WM_widgetmap_from_type(wgrouptype->mapidname, wgrouptype->spaceid,
- wgrouptype->regionid, wgrouptype->is_3d);
-
- handler->op_area = CTX_wm_area(C); /* means frozen screen context for modal handlers! */
- handler->op_region = CTX_wm_region(C);
-
- BLI_addhead(&win->modalhandlers, handler);
-
- return handler;
+ handler->op_widgetgrouptype = wgrouptype;
+ if (((handler->op_area && handler->op_area->type->spaceid == wgrouptype->spaceid) || wgrouptype->spaceid == 0) &&
+ (handler->op_region && (handler->op_region->type->regionid == wgrouptype->regionid || wgrouptype->regionid == 0)))
+ {
+ handler->widgetmap = handler->op_region->widgetmap;
+ }
+ else
+ {
+
+ }
}
-bool WM_widget_register(struct wmWidgetGroup *wgroup, wmWidget *widget)
+bool wm_widget_register(struct wmWidgetGroup *wgroup, wmWidget *widget)
{
wmWidget *widget_iter;
@@ -764,18 +759,6 @@ void WM_widgetmap_delete(struct wmWidgetMap *wmap)
MEM_freeN(wmap);
}
-void WM_widgetmaptype_delete(Main *bmain, struct wmWidgetMapType *wmaptype)
-{
- wmWidgetGroupType *wgrouptype, *wgrouptype_tmp;
- for (wgrouptype = wmaptype->widgetgrouptypes.first; wgrouptype; wgrouptype = wgrouptype_tmp) {
- wgrouptype_tmp = wgrouptype->next;
- WM_widgetgrouptype_unregister(bmain, wgrouptype);
- }
-
- BLI_freelinkN(&widgetmaptypes, wmaptype);
-}
-
-
static void wm_widgetgroup_free(wmWidgetMap *wmap, wmWidgetGroup *wgroup)
{
wmWidget *widget;
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index bd957a4..5f314df 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -114,8 +114,11 @@ typedef struct wmWidgetMap {
/* highlighted widget for this map. We redraw the widgetmap when this changes */
wmWidget *highlighted_widget;
- /* active widget for this map. User has clicked and is currently this widget */
+ /* active widget for this map. User has clicked currently this widget and it gets all input */
wmWidget *active_widget;
+
+ /* active group is overriding all other widgets while active */
+ struct wmWidgetGroup *activegrou
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list