[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