[Bf-blender-cvs] [fac8a0c] wiggly-widgets: Privatize registration function for individual widgets. Handle events for widgetmap first when and pass to operator when operator is active.

Antony Riakiotakis noreply at git.blender.org
Wed Dec 10 15:57:38 CET 2014


Commit: fac8a0c4f9557de04ad51931b1a82e1dca4ae258
Author: Antony Riakiotakis
Date:   Wed Dec 10 15:57:27 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBfac8a0c4f9557de04ad51931b1a82e1dca4ae258

Privatize registration function for individual widgets.
Handle events for widgetmap first when and pass to operator when
operator is active.

This is still a pretty confusing design, working on a simpler one now.

===================================================================

M	source/blender/editors/space_sequencer/sequencer_view.c
M	source/blender/windowmanager/WM_api.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.h
M	source/blender/windowmanager/wm_event_system.h

===================================================================

diff --git a/source/blender/editors/space_sequencer/sequencer_view.c b/source/blender/editors/space_sequencer/sequencer_view.c
index f6befd5..c3d3ce2 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -269,9 +269,8 @@ static int sequencer_backdrop_transform_invoke(bContext *C, wmOperator *op, cons
 {
 	/* no poll, lives always for the duration of the operator */
 	wmWidgetGroupType *cagetype = WM_widgetgrouptype_new(NULL, widgetgroup_backdrop_draw, CTX_data_main(C), "Seq_Canvas", SPACE_SEQ, RGN_TYPE_WINDOW, false);
-	
-	WM_event_add_modal_handler(C, op);
-	WM_event_add_widget_modal_handler(C, cagetype, op);
+	struct wmEventHandler *handler = WM_event_add_modal_handler(C, op);
+	WM_modal_handler_attach_widgetgroup(handler, cagetype, op);
 	return OPERATOR_RUNNING_MODAL;
 }
 
@@ -284,6 +283,7 @@ static int sequencer_backdrop_transform_modal(bContext *C, wmOperator *op, const
 		case LEFTMOUSE:
 			if (event->val == KM_DBL_CLICK)
 				return OPERATOR_FINISHED;
+			break;
 			
 		case RETKEY:
 			return OPERATOR_FINISHED;
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 6ad62c4..d2eb729 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -480,9 +480,7 @@ void WM_widget_property(struct wmWidget *, int slot, struct PointerRNA *ptr, con
 struct PointerRNA *WM_widget_operator(struct wmWidget *, const char *opname);
 void WM_widgets_draw(const struct bContext *C, struct ARegion *ar);
 void WM_event_add_widget_handler(struct ARegion *ar);
-struct wmEventHandler *WM_event_add_widget_modal_handler(struct bContext *C, struct wmWidgetGroupType *wgrouptype, struct wmOperator *op);
-
-bool WM_widget_register(struct wmWidgetGroup *wgroup, struct wmWidget *widget);
+void WM_modal_handler_attach_widgetgroup(struct wmEventHandler *handler, struct wmWidgetGroupType *wgrouptype, struct wmOperator *op);
 
 void WM_widget_set_origin(struct wmWidget *widget, float origin[3]);
 void WM_widget_set_3d_scale(struct wmWidget *widget, bool scale);
@@ -499,7 +497,6 @@ void WM_widgetgrouptype_unregister(struct Main *bmain, struct wmWidgetGroupType
 /* creates a widgetmap with all registered widgets for that type */
 struct wmWidgetMap *WM_widgetmap_from_type(const char *idname, int spaceid, int regionid, bool is_3d);
 void WM_widgetmap_delete(struct wmWidgetMap *wmap);
-void WM_widgetmaptype_delete(struct Main *bmain,struct wmWidgetMapType *wmaptype);
 
 void WM_widgetmaptypes_free(void);
 
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 7111c3b..0428803 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1372,7 +1372,7 @@ static void wm_handler_widgetmap_context(bContext *C, wmEventHandler *handler)
 {
 	bScreen *screen = CTX_wm_screen(C);
 	
-	if (screen && handler->widgetmap) {
+	if (screen) {
 		if (handler->op_area == NULL) {
 			/* do nothing in this context */
 		}
@@ -1424,11 +1424,12 @@ void WM_event_remove_handlers(bContext *C, ListBase *handlers)
 
 				if (handler->op->type->flag & OPTYPE_UNDO)
 					wm->op_undo_depth--;
-
-				if (handler->op_widgetmap) {
-					WM_widgetmaptype_delete(CTX_data_main(C), handler->op_widgetmap->type);
-				}
 				
+				/* if there's a widgetmap and an operator at the same time, we can assume widgetmap 
+				 * was added for operator */
+				if (handler->op_widgetgrouptype)
+					WM_widgetgrouptype_unregister(CTX_data_main(C), handler->op_widgetgrouptype);
+					
 				CTX_wm_area_set(C, area);
 				CTX_wm_region_set(C, region);
 			}
@@ -2040,6 +2041,8 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
 			else if (handler->widgetmap) {
 				struct wmWidgetMap *wmap = handler->widgetmap;
 				unsigned char part;
+				short event_processed = 0;
+				short val_processed = event->val;
 				wmWidget *widget = wm_widgetmap_get_active_widget(wmap);
 				ScrArea *area = CTX_wm_area(C);
 				ARegion *region = CTX_wm_region(C);
@@ -2049,7 +2052,8 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
 				switch (event->type) {
 					case MOUSEMOVE:
 						if (widget) {
-							widget->handler(C, event, widget);
+							val_processed = widget->handler(C, event, widget);
+							event_processed = EVT_WIDGET_UPDATE;
 							action |= WM_HANDLER_BREAK;
 						}
 						else if (wm_widgetmap_is_3d(wmap)) {
@@ -2067,6 +2071,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
 						if (widget) {
 							if (event->val == KM_RELEASE) {
 								wm_widgetmap_set_active_widget(wmap, C, event, NULL);
+								event_processed = EVT_WIDGET_RELEASED;
 								action |= WM_HANDLER_BREAK;
 							}
 							else {
@@ -2088,6 +2093,15 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
 				/* restore the area */
 				CTX_wm_area_set(C, area);
 				CTX_wm_region_set(C, region);
+				
+				if (handler->op) {
+					/* if event was processed by an active widget pass the modified event to the operator */
+					if (event_processed) {
+						event->type = event_processed;
+						event->val = val_processed;
+					}
+					action |= wm_handler_operator_call(C, handlers, handler, event, NULL);
+				}
 			}
 			else {
 				/* handle the widget first, before passing the event down */
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index e9048fe..75bed13 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -457,7 +457,7 @@ wmWidget *WIDGET_arrow_new(wmWidgetGroup *wgroup, int style)
 	arrow->style = style;
 	copy_v3_v3(arrow->direction, dir_default);
 	
-	WM_widget_register(wgroup, &arrow->widget);
+	wm_widget_register(wgroup, &arrow->widget);
 	
 	return (wmWidget *)arrow;
 }
@@ -1012,7 +1012,7 @@ struct wmWidget *WIDGET_rect_transform_new(struct wmWidgetGroup *wgroup, int sty
 	cage->w = width;
 	cage->h = height;
 	
-	WM_widget_register(wgroup, &cage->widget);
+	wm_widget_register(wgroup, &cage->widget);
 	
 	return (wmWidget *)cage;
 }
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index 62c6b2b..5063cb3 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -232,7 +232,7 @@ static void widget_calculate_scale(wmWidget *widget, const bContext *C)
 	widget->scale = scale * widget->user_scale;
 }
 
-static bool widget_compare_props(wmWidget *widget, wmWidget *widget2)
+static bool widgets_compare(wmWidget *widget, wmWidget *widget2)
 {
 	int i;
 	
@@ -313,7 +313,7 @@ void WM_widgets_draw(const bContext *C, struct ARegion *ar)
 				
 				if (highlighted) {
 					for (widget_iter = wgroup->widgets.first; widget_iter; widget_iter = widget_iter->next) {
-						if (widget_compare_props(widget_iter, highlighted))
+						if (widgets_compare(widget_iter, highlighted))
 						{
 							widget_iter->flag |= WM_WIDGET_HIGHLIGHT;
 							wmap->highlighted_widget = widget_iter;
@@ -360,33 +360,28 @@ void WM_event_add_widget_handler(ARegion *ar)
 	BLI_addhead(&ar->handlers, handler);
 }
 
-wmEventHandler *WM_event_add_widget_modal_handler(struct bContext *C, wmWidgetGroupType *wgrouptype, wmOperator *op)
+void WM_modal_handler_attach_widgetgroup(wmEventHandler *handler, wmWidgetGroupType *wgrouptype, wmOperator *op)
 {
-	wmEventHandler *handler;
-	wmWindow *win;
-	
 	/* maybe overly careful, but widgetgrouptype could come from a failed creation */
 	if (!wgrouptype) {
-		return NULL;
+		return;
 	}
 
-	handler = MEM_callocN(sizeof(wmEventHandler), "widget modal handler");
-	win = CTX_wm_window(C);
-	
 	/* now instantiate the widgetmap */
 	wgrouptype->op = op;
-	handler->widgetmap = handler->op_widgetmap = WM_widgetmap_from_type(wgrouptype->mapidname, wgrouptype->spaceid, 
-	                                                                    wgrouptype->regionid, wgrouptype->is_3d);
-	
-	handler->op_area = CTX_wm_area(C);       /* means frozen screen context for modal handlers! */
-	handler->op_region = CTX_wm_region(C);
-	
-	BLI_addhead(&win->modalhandlers, handler);
-
-	return handler;
+	handler->op_widgetgrouptype = wgrouptype;
+	if (((handler->op_area && handler->op_area->type->spaceid == wgrouptype->spaceid) || wgrouptype->spaceid == 0) &&
+	    (handler->op_region && (handler->op_region->type->regionid == wgrouptype->regionid || wgrouptype->regionid == 0)))
+	{
+		handler->widgetmap = handler->op_region->widgetmap;
+	}
+	else
+	{
+		
+	}
 }
 
-bool WM_widget_register(struct wmWidgetGroup *wgroup, wmWidget *widget)
+bool wm_widget_register(struct wmWidgetGroup *wgroup, wmWidget *widget)
 {
 	wmWidget *widget_iter;
 	
@@ -764,18 +759,6 @@ void WM_widgetmap_delete(struct wmWidgetMap *wmap)
 	MEM_freeN(wmap);
 }
 
-void WM_widgetmaptype_delete(Main *bmain, struct wmWidgetMapType *wmaptype)
-{
-	wmWidgetGroupType *wgrouptype, *wgrouptype_tmp;
-	for (wgrouptype = wmaptype->widgetgrouptypes.first; wgrouptype; wgrouptype = wgrouptype_tmp) {
-		wgrouptype_tmp = wgrouptype->next;
-		WM_widgetgrouptype_unregister(bmain, wgrouptype);
-	}
-	
-	BLI_freelinkN(&widgetmaptypes, wmaptype);
-}
-
-
 static void wm_widgetgroup_free(wmWidgetMap *wmap, wmWidgetGroup *wgroup)
 {
 	wmWidget *widget;
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index bd957a4..5f314df 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -114,8 +114,11 @@ typedef struct wmWidgetMap {
 	
 	/* highlighted widget for this map. We redraw the widgetmap when this changes  */
 	wmWidget *highlighted_widget;
-	/* active widget for this map. User has clicked and is currently this widget  */
+	/* active widget for this map. User has clicked currently this widget and it gets all input */
 	wmWidget *active_widget;
+	
+	/* active group is overriding all other widgets while active */
+	struct wmWidgetGroup *activegrou

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list