[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