[Bf-blender-cvs] [60e77c5] wiggly-widgets: Draw manipulator from widget callback (handling still done separately)

Antony Riakiotakis noreply at git.blender.org
Mon Sep 29 16:36:22 CEST 2014


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__ */




More information about the Bf-blender-cvs mailing list