[Bf-blender-cvs] [ffac46c] wiggly-widgets: Store the active widget in the context. This allows us to first call the widget handler if needed.

Antony Riakiotakis noreply at git.blender.org
Fri Oct 17 19:17:25 CEST 2014


Commit: ffac46c30c92fc09b81494953b1a4e2d18fb005c
Author: Antony Riakiotakis
Date:   Fri Oct 17 16:45:26 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rBffac46c30c92fc09b81494953b1a4e2d18fb005c

Store the active widget in the context. This allows us to first call the
widget handler if needed.

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

M	source/blender/blenkernel/BKE_context.h
M	source/blender/blenkernel/intern/context.c
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/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 877e376..ebc2466 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -56,6 +56,7 @@ struct Text;
 struct ImBuf;
 struct EditBone;
 struct bPoseChannel;
+struct wmWidget;
 struct wmWindow;
 struct wmWindowManager;
 struct SpaceText;
@@ -134,6 +135,7 @@ void CTX_py_dict_set(bContext *C, void *value);
 
 struct wmWindowManager *CTX_wm_manager(const bContext *C);
 struct wmWindow *CTX_wm_window(const bContext *C);
+struct wmWidget *CTX_wm_widget(const bContext *C);
 struct bScreen *CTX_wm_screen(const bContext *C);
 struct ScrArea *CTX_wm_area(const bContext *C);
 struct SpaceLink *CTX_wm_space_data(const bContext *C);
@@ -163,6 +165,7 @@ struct SpaceClip *CTX_wm_space_clip(const bContext *C);
 
 void CTX_wm_manager_set(bContext *C, struct wmWindowManager *wm);
 void CTX_wm_window_set(bContext *C, struct wmWindow *win);
+void CTX_wm_widget_set(bContext *C, struct wmWidget *widget);
 void CTX_wm_screen_set(bContext *C, struct bScreen *screen); /* to be removed */
 void CTX_wm_area_set(bContext *C, struct ScrArea *sa);
 void CTX_wm_region_set(bContext *C, struct ARegion *region);
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index de285f8..3efcc74 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -57,6 +57,8 @@
 
 /* struct */
 
+struct wmWidget;
+
 struct bContext {
 	int thread;
 
@@ -64,6 +66,7 @@ struct bContext {
 	struct {
 		struct wmWindowManager *manager;
 		struct wmWindow *window;
+		struct wmWidget *widget;
 		struct bScreen *screen;
 		struct ScrArea *area;
 		struct ARegion *region;
@@ -625,6 +628,11 @@ wmWindow *CTX_wm_window(const bContext *C)
 	return ctx_wm_python_context_get(C, "window", &RNA_Window, C->wm.window);
 }
 
+struct wmWidget *CTX_wm_widget(const bContext *C)
+{
+	return C->wm.widget;
+}
+
 bScreen *CTX_wm_screen(const bContext *C)
 {
 	return ctx_wm_python_context_get(C, "screen", &RNA_Screen, C->wm.screen);
@@ -831,6 +839,11 @@ void CTX_wm_window_set(bContext *C, wmWindow *win)
 	C->wm.region = NULL;
 }
 
+void CTX_wm_widget_set(bContext *C, struct wmWidget *widget)
+{
+	C->wm.widget = widget;
+}
+
 void CTX_wm_screen_set(bContext *C, bScreen *screen)
 {
 	C->wm.screen = screen;
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 398d0d0..475815a 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2559,7 +2559,7 @@ wmEventHandler *WM_event_add_modal_handler(bContext *C, wmOperator *op)
 {
 	wmEventHandler *handler = MEM_callocN(sizeof(wmEventHandler), "event modal handler");
 	wmWindow *win = CTX_wm_window(C);
-	
+
 	/* operator was part of macro */
 	if (op->opm) {
 		/* give the mother macro to the handler */
@@ -2572,6 +2572,7 @@ wmEventHandler *WM_event_add_modal_handler(bContext *C, wmOperator *op)
 	
 	handler->op_area = CTX_wm_area(C);       /* means frozen screen context for modal handlers! */
 	handler->op_region = CTX_wm_region(C);
+	handler->op_widget = CTX_wm_widget(C);
 	
 	BLI_addhead(&win->modalhandlers, handler);
 
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 4fd522e..12da73e 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -28,6 +28,7 @@
  */
 
 #include "RNA_types.h"
+#include "RNA_access.h"
 
 #include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
@@ -228,6 +229,11 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event,
 	project_v3_v3v3(orig_origin, orig_origin, arrow->direction);
 	add_v3_v3v3(widget->origin, orig_origin, data->orig_origin);
 
+	/* set the property for the operator and call its modal function */
+	if (widget->prop) {
+		RNA_float_set_array(&widget->opptr, widget->prop, widget->origin);
+	}
+
 	/* tag the region for redraw */
 	ED_region_tag_redraw(ar);
 
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index 0b8d626..a9f8ef2 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -541,7 +541,8 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
 					widget->initialize_op(C, event, widget, &widget->opptr);
 				}
 
-				//WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &widget->opptr);
+				CTX_wm_widget_set(C, widget);
+				WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &widget->opptr);
 				wmap->active_widget = widget;
 				return;
 			}
@@ -571,6 +572,8 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
 			WM_operator_properties_free(&widget->opptr);
 		}
 
+		CTX_wm_widget_set(C, NULL);
+
 		wmap->active_widget = NULL;
 		ED_region_tag_redraw(ar);
 	}
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index 6591ac8..d049ec2 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -40,6 +40,7 @@
 struct ScrArea;
 struct ARegion;
 struct wmWidgetMap;
+struct wmWidget;
 
 /* wmKeyMap is in DNA_windowmanager.h, it's savable */
 
@@ -57,6 +58,7 @@ typedef struct wmEventHandler {
 	wmOperator *op;                     /* for derived/modal handlers */
 	struct ScrArea *op_area;            /* for derived/modal handlers */
 	struct ARegion *op_region;          /* for derived/modal handlers */
+	struct wmWidget *op_widget;         /* widget that called an operator */
 
 	/* ui handler */
 	wmUIHandlerFunc ui_handle;          /* callback receiving events */




More information about the Bf-blender-cvs mailing list