[Bf-blender-cvs] [97eed9b] wiggly-widgets: Support selecting widgets and use for facemap widgets
Julian Eisel
noreply at git.blender.org
Tue Sep 22 01:17:01 CEST 2015
Commit: 97eed9b85b52dfdb5e931c00427e846776eb0b37
Author: Julian Eisel
Date: Tue Sep 22 01:07:50 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB97eed9b85b52dfdb5e931c00427e846776eb0b37
Support selecting widgets and use for facemap widgets
This means widgets flagged as selectable - like facemap widgets - can be selected using RMB (currently hard-coded). This means they stay visible until they are deselected by pressing RMB again, or by selecting a different facemap.
===================================================================
M source/blender/windowmanager/WM_api.h
M source/blender/windowmanager/WM_types.h
M source/blender/windowmanager/intern/wm_event_system.c
M source/blender/windowmanager/intern/wm_generic_widgets.c
M source/blender/windowmanager/intern/wm_widgets.c
M source/blender/windowmanager/wm_event_system.h
===================================================================
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 6ac838f..51aacb6 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -517,12 +517,14 @@ enum widgetflags {
/* states */
WM_WIDGET_HIGHLIGHT = (1 << 0),
WM_WIDGET_ACTIVE = (1 << 1),
+ WM_WIDGET_SELECTED = (1 << 2),
/* settings */
- WM_WIDGET_DRAW_HOVER = (1 << 2),
- WM_WIDGET_DRAW_ACTIVE = (1 << 3), /* draw while dragging */
- WM_WIDGET_SCALE_3D = (1 << 4),
- WM_WIDGET_SCENE_DEPTH = (1 << 5), /* widget is depth culled with scene objects*/
- WM_WIDGET_HIDDEN = (1 << 6),
+ WM_WIDGET_DRAW_HOVER = (1 << 3),
+ WM_WIDGET_DRAW_ACTIVE = (1 << 4), /* draw while dragging */
+ WM_WIDGET_SCALE_3D = (1 << 5),
+ WM_WIDGET_SCENE_DEPTH = (1 << 6), /* widget is depth culled with scene objects*/
+ WM_WIDGET_HIDDEN = (1 << 7),
+ WM_WIDGET_SELECTABLE = (1 << 8),
};
void WM_widget_set_property(struct wmWidget *, int slot, struct PointerRNA *ptr, const char *propname);
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 248f576..b82771d 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -711,15 +711,17 @@ typedef struct wmWidgetGroupType {
typedef struct wmWidgetMap {
struct wmWidgetMap *next, *prev;
-
+
struct wmWidgetMapType *type;
ListBase widgetgroups;
-
+
/* highlighted widget for this map. We redraw the widgetmap when this changes */
struct wmWidget *highlighted_widget;
/* active widget for this map. User has clicked currently this widget and it gets all input */
struct wmWidget *active_widget;
-
+ /* selected widget for this map. */
+ struct wmWidget *selected_widget;
+
/* active group is overriding all other widgets while active */
struct wmWidgetGroup *activegroup;
} wmWidgetMap;
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 510df63..f8fe7e2 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2093,11 +2093,11 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
wm_widgetmap_set_highlighted_widget(wmap, C, widget, part);
}
break;
-
case LEFTMOUSE:
if (widget) {
if (event->val == KM_RELEASE) {
wm_widgetmap_set_active_widget(wmap, C, event, NULL, false);
+ wm_widgetmap_set_selected_widget(C, wmap, NULL);
event_processed = EVT_WIDGET_RELEASED;
action |= WM_HANDLER_BREAK;
}
@@ -2116,7 +2116,17 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
break;
case RIGHTMOUSE:
case ESCKEY:
- if (widget) {
+ {
+ wmWidget *highlight = wm_widgetmap_get_highlighted_widget(wmap);
+ if (event->type == RIGHTMOUSE && highlight) {
+ if (highlight->flag & WM_WIDGET_SELECTABLE) {
+ if (event->val == KM_RELEASE) {
+ wm_widgetmap_set_selected_widget(C, wmap, highlight);
+ action |= WM_HANDLER_BREAK;
+ }
+ }
+ }
+ else if (widget) {
if (widget->cancel) {
widget->cancel(C, widget);
}
@@ -2124,7 +2134,11 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
event_processed = EVT_WIDGET_RELEASED;
action |= WM_HANDLER_BREAK;
}
+ else {
+ wm_widgetmap_set_selected_widget(C, wmap, NULL);
+ }
break;
+ }
}
/* restore the area */
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 9f0c314..65d6263 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -1577,6 +1577,18 @@ static void widget_facemap_render_3d_intersect(const bContext *C, wmWidget *widg
widget_facemap_draw(C, widget);
}
+#if 0
+static int widget_facemap_invoke(bContext *UNUSED(C), const wmEvent *event, wmWidget *widget)
+{
+ return OPERATOR_PASS_THROUGH;
+}
+
+static int widget_facemap_handler(bContext *C, const wmEvent *event, wmWidget *widget)
+{
+ return OPERATOR_PASS_THROUGH;
+}
+#endif
+
/** \name Facemap Widget API
*
* \{ */
@@ -1588,14 +1600,15 @@ wmWidget *WIDGET_facemap_new(
FacemapWidget *fmap_widget = MEM_callocN(sizeof(FacemapWidget), "CageWidget");
fmap_widget->widget.draw = widget_facemap_draw;
-// fmap_widget->widget.invoke = NULL;
+// fmap_widget->widget.invoke = widget_facemap_invoke;
// fmap_widget->widget.bind_to_prop = NULL;
-// fmap_widget->widget.handler = NULL;
+// fmap_widget->widget.handler = widget_facemap_handler;
fmap_widget->widget.render_3d_intersection = widget_facemap_render_3d_intersect;
+ fmap_widget->widget.flag |= WM_WIDGET_SELECTABLE ;
fmap_widget->ob = ob;
fmap_widget->facemap = facemap;
fmap_widget->style = style;
-
+
wm_widget_register(wgroup, &fmap_widget->widget, name);
return (wmWidget *)fmap_widget;
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index fce4230..c4cb44e 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -237,8 +237,11 @@ void WM_widgets_update(const bContext *C, wmWidgetMap *wmap)
for (widget = wgroup->widgets.first; widget;) {
wmWidget *widget_next = widget->next;
+ if (widget == wmap->selected_widget) {
+ /* skip */
+ }
/* do not delete the highlighted widget, instead keep it to compare with the new one */
- if (widget->flag & WM_WIDGET_HIGHLIGHT) {
+ else if (widget->flag & WM_WIDGET_HIGHLIGHT) {
highlighted = widget;
BLI_remlink(&wgroup->widgets, widget);
widget->next = widget->prev = NULL;
@@ -333,6 +336,13 @@ void WM_widgets_draw(const bContext *C, const wmWidgetMap *wmap, const bool in_s
}
}
+ /* draw selected widgets last */
+ if ((widget = wmap->selected_widget) && in_scene == ((widget->flag & WM_WIDGET_SCENE_DEPTH) != 0)) {
+ /* notice that we don't update the widgetgroup, widget is now on
+ * its own, it should have all relevant data to update itself */
+ widget->draw(C, widget);
+ }
+
if (use_lighting)
glPopAttrib();
}
@@ -817,6 +827,33 @@ void wm_widgetmap_set_active_widget(
}
}
+wmWidget *wm_widgetmap_get_selected_widget(wmWidgetMap *wmap)
+{
+ return wmap->selected_widget;
+}
+
+void wm_widgetmap_set_selected_widget(bContext *C, wmWidgetMap *wmap, wmWidget *widget)
+{
+ if (widget) {
+ wmap->selected_widget = widget;
+ widget->flag |= WM_WIDGET_SELECTED;
+ wm_widgetmap_set_highlighted_widget(wmap, C, NULL, wmap->highlighted_widget->highlighted_part);
+ }
+ else {
+ widget = wmap->selected_widget;
+ if (widget) {
+ wmap->selected_widget = NULL;
+ widget->flag &= ~WM_WIDGET_SELECTED;
+ }
+ }
+
+ /* tag the region for redraw */
+ if (C) {
+ ARegion *ar = CTX_wm_region(C);
+ ED_region_tag_redraw(ar);
+ }
+}
+
void wm_widgetmap_handler_context(bContext *C, wmEventHandler *handler)
{
bScreen *screen = CTX_wm_screen(C);
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index 46ebc15..2189b7f 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -112,5 +112,8 @@ struct wmWidget *wm_widgetmap_get_highlighted_widget(struct wmWidgetMap *wmap);
void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C, struct wmEvent *event, struct wmWidget *widget, const bool call_op);
struct wmWidget *wm_widgetmap_get_active_widget(struct wmWidgetMap *wmap);
+void wm_widgetmap_set_selected_widget(struct bContext *C, wmWidgetMap *wmap, wmWidget *widget);
+struct wmWidget *wm_widgetmap_get_selected_widget(wmWidgetMap *wmap);
+
#endif /* __WM_EVENT_SYSTEM_H__ */
More information about the Bf-blender-cvs
mailing list