Commit: 2b7f356442e0573cb20c50556353f4a2e38360ea
Author: Antony Riakiotakis
Date:   Wed Oct 1 15:37:45 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB2b7f356442e0573cb20c50556353f4a2e38360ea

Tidy up the widget API, only do 3d intersection on widgetmaps that
support it (determined during creation)

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

M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/makesdna/DNA_screen_types.h
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/intern/wm_event_system.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_view3d/space_view3d.c 
b/source/blender/editors/space_view3d/space_view3d.c
index 88e8386..045cea2 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -428,15 +428,15 @@ static void view3d_init(wmWindowManager *UNUSED(wm), 
ScrArea *UNUSED(sa))
        static wmWidget *manipulator_widget = NULL;
        
        if (!manipulator_widget) {
-               ListBase *widgets = WM_widgetmap_find("View3D", SPACE_VIEW3D, 
RGN_TYPE_WINDOW);
+               struct wmWidgetMap *wmap = WM_widgetmap_find("View3D", 
SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
                
                manipulator_widget = WM_widget_new(BIF_manipulator_poll, 
                                                                                
   BIF_draw_manipulator, 
                                                                                
   BIF_manipulator_render_3d_intersect, 
                                                                                
   NULL, 
-                                                                               
   BIF_manipulator_handler, NULL, 0, 0);
+                                                                               
   BIF_manipulator_handler, NULL, true, true);
                
-               WM_widget_register(widgets, manipulator_widget);
+               WM_widget_register(wmap, manipulator_widget);
        }
 }
 
@@ -562,7 +562,7 @@ static void view3d_main_area_init(wmWindowManager *wm, 
ARegion *ar)
        
        WM_event_add_dropbox_handler(&ar->handlers, lb);
 
-       ar->widgets = WM_widgetmap_find("View3D", SPACE_VIEW3D, 
RGN_TYPE_WINDOW);
+       ar->widgetmap = WM_widgetmap_find("View3D", SPACE_VIEW3D, 
RGN_TYPE_WINDOW, true);
        
        WM_event_add_widget_handler(ar);
 }
diff --git a/source/blender/makesdna/DNA_screen_types.h 
b/source/blender/makesdna/DNA_screen_types.h
index 339b747..9d4956b 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -45,6 +45,7 @@ struct HeaderType;
 struct Scene;
 struct uiLayout;
 struct wmTimer;
+struct wmWidgetMap;
 
 typedef struct bScreen {
        ID id;
@@ -257,7 +258,7 @@ typedef struct ARegion {
        ListBase ui_lists;                      /* uiList */
        ListBase ui_previews;           /* uiPreview */
        ListBase handlers;                      /* wmEventHandler */
-       ListBase *widgets;                      /* widgets for drawing */
+       struct wmWidgetMap *widgetmap;                  /* widgets for drawing 
*/
        ListBase panels_category;       /* Panel categories runtime */
        
        struct wmTimer *regiontimer; /* blend in/out */
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index f75ac2f..e61b949 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -56,6 +56,7 @@ struct wmNotifier;
 struct wmOperatorType;
 struct wmOperator;
 struct wmWidget;
+struct wmWidgetMap;
 struct rcti;
 struct PointerRNA;
 struct PropertyRNA;
@@ -468,14 +469,13 @@ struct wmWidget *WM_widget_new(bool (*poll)(const struct 
bContext *, struct wmWi
                                int  (*handler)(struct bContext *, const struct 
wmEvent *, struct wmWidget *, int active),
                                void *customdata, bool free_data, bool 
requires_ogl);
 
-void WM_widgets_delete(ListBase *widgetlist, struct wmWidget *widget);
 void WM_widgets_draw(const struct bContext *C, struct ARegion *ar);
 void WM_event_add_widget_handler(struct ARegion *ar);
 
-bool WM_widget_register(ListBase *widgetlist, struct wmWidget *widget);
-void WM_widget_unregister(ListBase *widgetlist, struct wmWidget *widget);
-struct ListBase *WM_widgetmap_find(const char *idname, int spaceid, int 
regionid);
-int WM_widget_find_active_3D (ListBase *widgetlist, struct bContext *C, const 
struct wmEvent *event);
+bool WM_widget_register(struct wmWidgetMap *wmap, struct wmWidget *widget);
+void WM_widget_unregister(struct wmWidgetMap *wmap, struct wmWidget *widget);
+
+struct wmWidgetMap *WM_widgetmap_find(const char *idname, int spaceid, int 
regionid, bool is_3d);
 void WM_widgetmaps_free(void);
 
 
diff --git a/source/blender/windowmanager/intern/wm_event_system.c 
b/source/blender/windowmanager/intern/wm_event_system.c
index bd1c344..b6d5a7b 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1970,18 +1970,21 @@ static int wm_handlers_do_intern(bContext *C, wmEvent 
*event, ListBase *handlers
                                        }
                                }
                        }
-                       else if (handler->widgets) {
+                       else if (handler->widgetmap) {
                                int ret;
                                
-                               /* similar interface to operators */
-                               if ((ret = WM_widget_find_active_3D 
(handler->widgets, C, event)) != -1)
-                               {
-                                       wmWidget *widget = 
BLI_findlink(handler->widgets, ret >> 8);
-                                       
-                                       if ((ret = widget->handler(C, event, 
widget, ret & 0xFF)) == OPERATOR_FINISHED) {
-                                               action |= WM_HANDLER_BREAK;
+                               if (wm_widgetmap_is_3d(handler->widgetmap)) {
+                                       /* similar interface to operators */
+                                       if ((ret = wm_widget_find_active_3D 
(handler->widgetmap, C, event)) != -1)
+                                       {
+                                               ListBase *widgets = 
wm_widgetmap_widget_list(handler->widgetmap);
+                                               wmWidget *widget = 
BLI_findlink(widgets, ret >> 8);
+                                               
+                                               if ((ret = widget->handler(C, 
event, widget, ret & 0xFF)) == OPERATOR_FINISHED) {
+                                                       action |= 
WM_HANDLER_BREAK;
+                                               }
                                        }
-                               }                               
+                               }
                        }
                        else {
                                /* modal, swallows all */
diff --git a/source/blender/windowmanager/intern/wm_widgets.c 
b/source/blender/windowmanager/intern/wm_widgets.c
index a91c0e0..16a5b7a 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -76,7 +76,8 @@ typedef struct wmWidgetMap {
        ListBase widgets;
        short spaceid, regionid;
        char idname[KMAP_MAX_NAME];
-       
+       /* check if widgetmap does 3D drawing */
+       bool is_3d;
 } wmWidgetMap;
 
 /* store all widgetboxmaps here. Anyone who wants to register a widget for a 
certain 
@@ -113,7 +114,7 @@ wmWidget *WM_widget_new(bool (*poll)(const struct bContext 
*C, struct wmWidget *
        return NULL;
 }
 
-void WM_widgets_delete(ListBase *widgetlist, wmWidget *widget)
+static void WM_widgets_delete(ListBase *widgetlist, wmWidget *widget)
 {
        if (widget->flag & WM_WIDGET_FREE_DATA)
                MEM_freeN(widget->customdata);
@@ -124,10 +125,11 @@ void WM_widgets_delete(ListBase *widgetlist, wmWidget 
*widget)
 
 void WM_widgets_draw(const struct bContext *C, struct ARegion *ar)
 {
-       if (ar->widgets->first) {
+       wmWidgetMap *wmap = ar->widgetmap;
+       if (wmap->widgets.first) {
                wmWidget *widget;
                
-               for (widget = ar->widgets->first; widget; widget = 
widget->next) {
+               for (widget = wmap->widgets.first; widget; widget = 
widget->next) {
                        if ((widget->draw) &&
                                (widget->poll == NULL || widget->poll(C, 
widget->customdata))) 
                        {
@@ -142,50 +144,51 @@ void WM_event_add_widget_handler(ARegion *ar)
        wmEventHandler *handler;
        
        for (handler = ar->handlers.first; handler; handler = handler->next)
-               if (handler->widgets == ar->widgets)
+               if (handler->widgetmap == ar->widgetmap)
                        return;
        
        handler = MEM_callocN(sizeof(wmEventHandler), "widget handler");
        
-       handler->widgets = ar->widgets;
+       handler->widgetmap = ar->widgetmap;
        BLI_addhead(&ar->handlers, handler);
 }
 
 
-bool WM_widget_register(ListBase *widgetlist, wmWidget *widget)
+bool WM_widget_register(struct wmWidgetMap *wmap, wmWidget *widget)
 {
        wmWidget *widget_iter;
        /* search list, might already be registered */  
-       for (widget_iter = widgetlist->first; widget_iter; widget_iter = 
widget_iter->next) {
+       for (widget_iter = wmap->widgets.first; widget_iter; widget_iter = 
widget_iter->next) {
                if (widget_iter == widget)
                        return false;
        }
        
-       BLI_addtail(widgetlist, widget);
+       BLI_addtail(&wmap->widgets, widget);
        return true;
 }
 
-void WM_widget_unregister(ListBase *widgetlist, wmWidget *widget)
+void WM_widget_unregister(struct wmWidgetMap *wmap, wmWidget *widget)
 {
-       BLI_remlink(widgetlist, widget);
+       BLI_remlink(&wmap->widgets, widget);
 }
 
-ListBase *WM_widgetmap_find(const char *idname, int spaceid, int regionid)
+wmWidgetMap *WM_widgetmap_find(const char *idname, int spaceid, int regionid, 
bool is_3d)
 {
        wmWidgetMap *wmap;
        
        for (wmap = widgetmaps.first; wmap; wmap = wmap->next)
-               if (wmap->spaceid == spaceid && wmap->regionid == regionid)
+               if (wmap->spaceid == spaceid && wmap->regionid == regionid && 
wmap->is_3d == is_3d)
                        if (0 == strncmp(idname, wmap->idname, KMAP_MAX_NAME))
-                               return &wmap->widgets;
+                               return wmap;
        
        wmap = MEM_callocN(sizeof(struct wmWidgetMap), "widget list");
        BLI_strncpy(wmap->idname, idname, KMAP_MAX_NAME);
        wmap->spaceid = spaceid;
        wmap->regionid = regionid;
+       wmap->is_3d = is_3d;
        BLI_addhead(&widgetmaps, wmap);
        
-       return &wmap->widgets;
+       return wmap;
 }
 
 void WM_widgetmaps_free(void)
@@ -206,6 +209,16 @@ void WM_widgetmaps_free(void)
        BLI_freelistN(&widgetmaps);
 }
 
+ListBase *wm_widgetmap_widget_list(struct wmWidgetMap *wmap)
+{
+       return &wmap->widgets;
+}
+
+bool wm_widgetmap_is_3d(struct wmWidgetMap *wmap)
+{
+       return wmap->is_3d;
+}
+
 static void widget_find_active_3D_loop(bContext *C, ListBase *widgetlist)
 {
        int selectionbase = 0;
@@ -289,16 +302,16 @@ static int WM_widget_find_active_3D_intern (ListBase 
*widgetlist, bContext *C, c
 }
 
 
-int WM_widget_find_active_3D (ListBase *widgetlist, bContext *C, const struct 
wmEvent *event)
+int wm_widget_find_active_3D (struct wmWidgetMap *wmap, bContext *C, const 
struct wmEvent *event)
 {
        int ret, retsec;
        /* set up view matrices */      
        view3d_operator_needs_opengl(C);
        
-       ret = WM_widget_find_active_3D_intern(widgetlist, C, event, 0.5f * 
(float)U.tw_hotspot);
+       ret = WM_widget_find_active_3D_intern(&wmap->widgets, C, event, 0.5f * 
(float)U.tw_hotspot);
        
        if (ret != -1) {
-               retsec = WM_widget_find_active_3D_intern(widgetlist, C, event, 
0.2f * (float)U.tw_hotspot);
+               retsec = WM_widget_find_active_3D_intern(&wmap->widgets, C, 
event, 0.2f * (float)U.tw_hotspot);
                
                if (retsec == -1)
                        return ret;
diff --git a/source/blender/windowmanager/wm.h 
b/source/blender/windowmanager/wm.h
index e62f793..c7190ab 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -34,6 +34,7 @@
 struct wmWindow;
 struct ReportList;
 struct wmEvent;
+struct wmWidgetMap;
 
 typedef struct wmPaintCursor {
        struct wmPaintCursor *next, *prev;
@@ -81,6 +82,10 @@ void wm_autosave_location(char *filepath);
 void wm_open_init_load_ui(wmOperator *op, bool use_prefs);
 void wm_open_init_use_scripts(wmOperator *op, bool use_prefs);
 
+/* wm_widgets.c */
+ListBase *wm_widgetmap_widget_list(struct wmWidgetMap *w

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