[Bf-blender-cvs] [2b7f356] wiggly-widgets: Tidy up the widget API, only do 3d intersection on widgetmaps that support it (determined during creation)

Antony Riakiotakis noreply at git.blender.org
Wed Oct 1 15:37:52 CEST 2014


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




More information about the Bf-blender-cvs mailing list