[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