Commit: 60e77c50ee13962ec06c42f319946925be7ece69
Author: Antony Riakiotakis
Date:   Mon Sep 29 16:36:08 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB60e77c50ee13962ec06c42f319946925be7ece69

Draw manipulator from widget callback (handling still done separately)

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

M       source/blender/editors/include/ED_transform.h
M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/editors/transform/transform_manipulator.c
M       source/blender/makesdna/DNA_view3d_types.h
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/intern/wm.c
M       source/blender/windowmanager/intern/wm_init_exit.c
M       source/blender/windowmanager/intern/wm_widgets.c
M       source/blender/windowmanager/wm_event_system.h

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

diff --git a/source/blender/editors/include/ED_transform.h 
b/source/blender/editors/include/ED_transform.h
index daa6864..e9a3eb0 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -152,7 +152,7 @@ void Transform_Properties(struct wmOperatorType *ot, int 
flags);
 /* view3d manipulators */
 
 int BIF_do_manipulator(struct bContext *C, const struct wmEvent *event, struct 
wmOperator *op);
-void BIF_draw_manipulator(const struct bContext *C);
+void BIF_draw_manipulator(const struct bContext *C, void *customdata);
 
 /* Snapping */
 
diff --git a/source/blender/editors/space_view3d/space_view3d.c 
b/source/blender/editors/space_view3d/space_view3d.c
index b5a2139..fd582c3 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -53,6 +53,7 @@
 
 #include "ED_space_api.h"
 #include "ED_screen.h"
+#include "ED_transform.h"
 
 #include "GPU_extensions.h"
 #include "GPU_material.h"
@@ -343,9 +344,6 @@ static SpaceLink *view3d_new(const bContext *C)
        
        v3d->bundle_size = 0.2f;
        v3d->bundle_drawtype = OB_PLAINAXES;
-
-       /* add the generic manipulator widget here */
-       v3d->manipulator_widget = WM_widget_new(NULL, NULL, NULL, NULL, NULL, 
NULL, 0, 0);
        
        /* header */
        ar = MEM_callocN(sizeof(ARegion), "header for view3d");
@@ -427,7 +425,15 @@ static void view3d_free(SpaceLink *sl)
 /* spacetype; init callback */
 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);
+               
+               manipulator_widget = WM_widget_new(NULL, BIF_draw_manipulator, 
NULL, NULL, NULL, NULL, 0, 0);
+               
+               WM_widget_register(widgets, manipulator_widget);
+       }
 }
 
 static SpaceLink *view3d_duplicate(SpaceLink *sl)
diff --git a/source/blender/editors/space_view3d/view3d_draw.c 
b/source/blender/editors/space_view3d/view3d_draw.c
index 4513822..d771e33 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2763,7 +2763,7 @@ static void view3d_draw_objects(
 
        if (!draw_offscreen) {
                WM_widgets_draw(C, ar);         
-               BIF_draw_manipulator(C);
+               //BIF_draw_manipulator(C);
        }
 
        /* cleanup */
diff --git a/source/blender/editors/transform/transform_manipulator.c 
b/source/blender/editors/transform/transform_manipulator.c
index 9cfae51..ca85e63 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1604,7 +1604,7 @@ static void draw_manipulator_rotate_cyl(
 /* main call, does calc centers & orientation too */
 static int drawflags = 0xFFFF;       // only for the calls below, belongs in 
scene...?
 
-void BIF_draw_manipulator(const bContext *C)
+void BIF_draw_manipulator(const bContext *C, void *UNUSED(customdata))
 {
        ScrArea *sa = CTX_wm_area(C);
        ARegion *ar = CTX_wm_region(C);
diff --git a/source/blender/makesdna/DNA_view3d_types.h 
b/source/blender/makesdna/DNA_view3d_types.h
index db3d9ef..42bfe27 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -218,9 +218,6 @@ typedef struct View3D {
 
        /* XXX deprecated? */
        struct bGPdata *gpd  DNA_DEPRECATED;            /* Grease-Pencil Data 
(annotation layers) */
-
-       
-       void *manipulator_widget;       
 } View3D;
 
 
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index 13e3009..e206b52 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -468,13 +468,15 @@ struct wmWidget *WM_widget_new(int (*poll)(const struct 
bContext *C, void *custo
                                                void (*handler)(struct bContext 
*C, struct wmEvent *event, void *customdata),
                                                void *customdata, bool 
free_data, bool requires_ogl);
 
-void WM_widgets_delete(struct wmWidget *widget);
+void WM_widgets_delete(ListBase *widgetlist, struct wmWidget *widget);
 void WM_widgets_draw(const struct bContext *C, struct ARegion *ar);
 void WM_widget_handler_register(struct ARegion *ar);
 
-void WM_widget_register(ListBase *widgetlist, struct wmWidget *widget);
+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);
+void WM_widgetmaps_free(void);
+
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/windowmanager/intern/wm.c 
b/source/blender/windowmanager/intern/wm.c
index d05cc57..c1f56d2 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -464,7 +464,7 @@ void wm_close_and_free(bContext *C, wmWindowManager *wm)
        BLI_freelistN(&wm->paintcursors);
 
        WM_drag_free_list(&wm->drags);
-       
+               
        wm_reports_free(wm);
        
        if (C && CTX_wm_manager(C) == wm) CTX_wm_manager_set(C, NULL);
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c 
b/source/blender/windowmanager/intern/wm_init_exit.c
index 8edd805..34fcb2d 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -429,7 +429,7 @@ void WM_exit_ext(bContext *C, const bool do_python)
        BKE_addon_pref_type_free();
        wm_operatortype_free();
        wm_dropbox_free();
-       wm_widgetmap_free();
+       WM_widgetmaps_free();
        WM_menutype_free();
        WM_uilisttype_free();
        
diff --git a/source/blender/windowmanager/intern/wm_widgets.c 
b/source/blender/windowmanager/intern/wm_widgets.c
index f1e8255..6940c57 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -122,12 +122,12 @@ wmWidget *WM_widget_new(int (*poll)(const struct bContext 
*C, void *customdata),
        return NULL;
 }
 
-void WM_widgets_delete(wmWidget *widget)
+void WM_widgets_delete(ListBase *widgetlist, wmWidget *widget)
 {
        if (widget->flag & WM_WIDGET_FREE_DATA)
                MEM_freeN(widget->customdata);
        
-       MEM_freeN(widget);
+       BLI_freelinkN(widgetlist, widget);
 }
 
 
@@ -166,51 +166,55 @@ void WM_widget_handler_register(ARegion *ar)
 }
 
 
-void WM_widget_register(ListBase *widgetlist, wmWidget *widget)
+bool WM_widget_register(ListBase *widgetlist, wmWidget *widget)
 {
-       BLI_addtail(widgetlist, widget);
+       wmWidget *widget_iter;
+       /* search list, might already be registered */  
+       for (widget_iter = widgetlist->first; widget_iter; widget_iter = 
widget_iter->next) {
+               if (widget_iter == widget)
+                       return false;
+       }
+       
+       BLI_addhead(widgetlist, widget);
+       return true;
 }
 
 void WM_widget_unregister(ListBase *widgetlist, wmWidget *widget)
 {
-       wmWidget *widget_iter;
-       
-       for (widget_iter = widgetlist->first; widget_iter; widget_iter = 
widget_iter->next) {
-               if (widget_iter == widget) {
-                       BLI_remlink(widgetlist, widget);
-               }
-       }
+       BLI_remlink(widgetlist, widget);
 }
 
 ListBase *WM_widgetmap_find(const char *idname, int spaceid, int regionid)
 {
-       wmWidgetMap *widgetm;
+       wmWidgetMap *wmap;
        
-       for (widgetm = widgetmaps.first; widgetm; widgetm = widgetm->next)
-               if (widgetm->spaceid == spaceid && widgetm->regionid == 
regionid)
-                       if (0 == strncmp(idname, widgetm->idname, 
KMAP_MAX_NAME))
-                               return &widgetm->widgets;
+       for (wmap = widgetmaps.first; wmap; wmap = wmap->next)
+               if (wmap->spaceid == spaceid && wmap->regionid == regionid)
+                       if (0 == strncmp(idname, wmap->idname, KMAP_MAX_NAME))
+                               return &wmap->widgets;
        
-       widgetm = MEM_callocN(sizeof(struct wmWidgetMap), "widget list");
-       BLI_strncpy(widgetm->idname, idname, KMAP_MAX_NAME);
-       widgetm->spaceid = spaceid;
-       widgetm->regionid = regionid;
-       BLI_addtail(&widgetmaps, widgetm);
+       wmap = MEM_callocN(sizeof(struct wmWidgetMap), "widget list");
+       BLI_strncpy(wmap->idname, idname, KMAP_MAX_NAME);
+       wmap->spaceid = spaceid;
+       wmap->regionid = regionid;
+       BLI_addhead(&widgetmaps, wmap);
        
-       return &widgetm->widgets;
+       return &wmap->widgets;
 }
 
-void wm_widgetmap_free(void)
+void WM_widgetmaps_free(void)
 {
-       wmWidgetMap *widgetm;
+       wmWidgetMap *wmap;
        
-       for (widgetm = widgetmaps.first; widgetm; widgetm = widgetm->next) {
+       for (wmap = widgetmaps.first; wmap; wmap = wmap->next) {
                wmWidget *widget;
                
-               for (widget = widgetm->widgets.first; widget; widget = 
widget->next) {
-                       WM_widgets_delete(widget);
+               for (widget = wmap->widgets.first; widget;) {
+                       wmWidget *widget_next = widget->next;
+                       WM_widgets_delete(&wmap->widgets, widget);
+                       widget = widget_next;
                }
-               BLI_freelistN(&widgetm->widgets);
+               BLI_freelistN(&wmap->widgets);
        }
        
        BLI_freelistN(&widgetmaps);
diff --git a/source/blender/windowmanager/wm_event_system.h 
b/source/blender/windowmanager/wm_event_system.h
index 986a1cf..4b1f7d4 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -107,8 +107,5 @@ void        wm_dropbox_free(void);
 void        wm_drags_check_ops(bContext *C, wmEvent *event);
 void        wm_drags_draw(bContext *C, wmWindow *win, rcti *rect);
 
-/* wm_widget.c */
-void        wm_widgetmap_free(void);
-
 #endif /* __WM_EVENT_SYSTEM_H__ */

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

Reply via email to