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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to