[Bf-blender-cvs] [388dc24] wiggly-widgets: Hook widget event to the lamp operator.
Antony Riakiotakis
noreply at git.blender.org
Fri Oct 17 19:17:27 CEST 2014
Commit: 388dc243302ee522aedc7ee866cd45e61a91d890
Author: Antony Riakiotakis
Date: Fri Oct 17 19:17:05 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB388dc243302ee522aedc7ee866cd45e61a91d890
Hook widget event to the lamp operator.
===================================================================
M source/blender/editors/interface/SConscript
M source/blender/editors/object/object_lamp.c
M source/blender/editors/space_view3d/space_view3d.c
M source/blender/windowmanager/SConscript
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
===================================================================
diff --git a/source/blender/editors/interface/SConscript b/source/blender/editors/interface/SConscript
index beb2f09..303ab7f 100644
--- a/source/blender/editors/interface/SConscript
+++ b/source/blender/editors/interface/SConscript
@@ -28,7 +28,6 @@
Import ('env')
sources = env.Glob('*.c')
-sources += env.Glob('3d_widgets/*.c')
incs = [
'#/intern/guardedalloc',
@@ -45,7 +44,6 @@ incs = [
# python button eval
'../../python',
'../../windowmanager',
- '3d_widgets'
]
defs = env['BF_GL_DEFINITIONS']
diff --git a/source/blender/editors/object/object_lamp.c b/source/blender/editors/object/object_lamp.c
index 7278b47..2f6ff57 100644
--- a/source/blender/editors/object/object_lamp.c
+++ b/source/blender/editors/object/object_lamp.c
@@ -60,6 +60,8 @@
#include "UI_interface.h"
#include "object_intern.h"
+#include "RNA_define.h"
+#include "RNA_access.h"
typedef struct LampPositionData {
int pos[2];
@@ -145,6 +147,32 @@ static int lamp_position_modal(bContext *C, wmOperator *op, const wmEvent *event
MEM_freeN(op->customdata);
return OPERATOR_FINISHED;
}
+
+ case EVT_WIDGET_UPDATE:
+ {
+ ARegion *ar = CTX_wm_region(C);
+ Object *ob = CTX_data_active_object(C);
+ Lamp *la = ob->data;
+ float value[3], len;
+
+ RNA_float_get_array(op->ptr, "value", value);
+
+ sub_v3_v3(value, ob->obmat[3]);
+
+ len = len_v3(value);
+
+ la->spotsize = len * 0.1f;
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
+
+ ED_region_tag_redraw(ar);
+ break;
+ }
+
+ case EVT_WIDGET_RELEASED:
+ {
+ MEM_freeN(op->customdata);
+ return OPERATOR_FINISHED;
+ }
}
return OPERATOR_RUNNING_MODAL;
@@ -172,6 +200,7 @@ void LAMP_OT_lamp_position(struct wmOperatorType *ot)
ot->flag = OPTYPE_BLOCKING | OPTYPE_UNDO;
/* properties */
+ RNA_def_float_vector_xyz(ot->srna, "value", 3, NULL, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX);
}
bool WIDGETGROUP_lamp_poll(struct wmWidgetGroup *UNUSED(wgroup), const struct bContext *C)
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 15391c7..ee20a43 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -738,7 +738,7 @@ static void view3d_widgets(void)
WIDGET_dial_set_color(manipulator->rotate_z, color_blue);
WM_widget_register(wgroup_manipulator, manipulator->rotate_z);
- widget = WIDGET_arrow_new(0, NULL, "UI_OT_lamp_position", NULL, NULL);
+ widget = WIDGET_arrow_new(0, NULL, "UI_OT_lamp_position", "value", NULL);
WM_widget_register(wgroup_light, widget);
WIDGET_arrow_set_color(widget, color_lamp);
diff --git a/source/blender/windowmanager/SConscript b/source/blender/windowmanager/SConscript
index b93192d..1e48a23 100644
--- a/source/blender/windowmanager/SConscript
+++ b/source/blender/windowmanager/SConscript
@@ -29,6 +29,7 @@ Import ('env')
import os
sources = env.Glob('intern/*.c')
+sources += env.Glob('3d_widgets/*.c')
incs = [
'.',
@@ -51,6 +52,7 @@ incs = [
'../nodes',
'../python',
'../render/extern/include',
+ '3d_widgets',
env['BF_ZLIB_INC'],
]
incs = ' '.join(incs)
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 758d2e5..3c5bc39 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -474,7 +474,7 @@ struct wmWidget *WM_widget_new(void (*draw)(struct wmWidget *, const struct bCon
void (*render_3d_intersection)(const struct bContext *, struct wmWidget *, float, int),
int (*intersect)(struct bContext *C, const struct wmEvent *event, struct wmWidget *customdata),
int (*initialize_op)(struct bContext *, const struct wmEvent *, struct wmWidget *, struct PointerRNA *),
- int (*handler)(struct bContext *, const struct wmEvent *, struct wmWidget *),
+ int (*handler)(struct bContext *, const struct wmEvent *, struct wmWidget *, struct wmOperator *op),
void *customdata, bool free_data, char *opname, char *prop);
void WM_widgets_draw(const struct bContext *C, struct ARegion *ar);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 2334275..bdcc302 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1581,7 +1581,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
switch (event->type) {
case MOUSEMOVE:
- if (widget->handler(C, event, widget) == OPERATOR_PASS_THROUGH) {
+ if (widget->handler(C, event, widget, op) == OPERATOR_PASS_THROUGH) {
event->type = EVT_WIDGET_UPDATE;
retval = ot->modal(C, op, event);
}
@@ -2004,7 +2004,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
switch (event->type) {
case MOUSEMOVE:
if (widget) {
- widget->handler(C, event, widget);
+ widget->handler(C, event, widget, NULL);
action |= WM_HANDLER_BREAK;
}
else if (wm_widgetmap_is_3d(wmap)) {
@@ -2024,7 +2024,6 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
action |= WM_HANDLER_BREAK;
}
else {
- widget->handler(C, event, widget);
action |= WM_HANDLER_BREAK;
}
}
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 12da73e..a5fabbd 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -187,7 +187,7 @@ typedef struct ArrowInteraction {
float proj_direction[2];
} ArrowInteraction;
-static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget)
+static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct wmOperator *op)
{
ArrowWidget *arrow = (ArrowWidget *)widget;
ArrowInteraction *data = widget->interaction_data;
@@ -230,14 +230,14 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event,
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);
+ if (op && widget->prop) {
+ RNA_float_set_array(op->ptr, widget->prop, widget->origin);
}
/* tag the region for redraw */
ED_region_tag_redraw(ar);
- return OPERATOR_FINISHED;
+ return OPERATOR_PASS_THROUGH;
}
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index a9f8ef2..b94e262 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -139,7 +139,7 @@ wmWidget *WM_widget_new(void (*draw)(struct wmWidget *customdata, const struct b
void (*render_3d_intersection)(const struct bContext *C, struct wmWidget *customdata, float scale, int selectionbase),
int (*intersect)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget),
int (*initialize_op)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct PointerRNA *),
- int (*handler)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget),
+ int (*handler)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct wmOperator *op),
void *customdata, bool free_data, char *opname, char *prop)
{
wmWidget *widget;
@@ -534,15 +534,15 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
widget->activate_state(C, event, widget, WIDGET_ACTIVATE);
}
- WM_operator_properties_create_ptr(&widget->opptr, ot);
+ WM_operator_properties_create_ptr(&widget->propptr, ot);
/* time to initialize those properties now */
if (widget->initialize_op) {
- widget->initialize_op(C, event, widget, &widget->opptr);
+ widget->initialize_op(C, event, widget, &widget->propptr);
}
CTX_wm_widget_set(C, widget);
- WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &widget->opptr);
+ WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &widget->propptr);
wmap->active_widget = widget;
return;
}
@@ -569,7 +569,7 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C
widget->activate_state(C, event, widget, WIDGET_DEACTIVATE);
}
- WM_operator_properties_free(&widget->opptr);
+ WM_operator_properties_free(&widget->propptr);
}
CTX_wm_widget_set(C, NULL);
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index 08781bb..d7c235d 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -37,6 +37,7 @@ struct wmEvent;
struct wmWidgetMap;
struct wmOperatorType;
struct PointerRNA;
+struct wmOperator;
typedef struct wmPaintCursor {
struct wmPaintCursor *next, *prev;
@@ -62,10 +63,10 @@ typedef struct wmWidget {
void (*render_3d_intersection)(const struct bContext *C, struct wmWidget *widget, float scale, int selectionbase);
/* initialize the operator properties when the user clicks the widget */
- int (*initialize_op)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct PointerRNA *opptr);
+ int (*initialize_op)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct PointerRNA *propptr);
/* handler used by the widget. Usually handles interaction tied to a widget type */
- int (*handler)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget);
+ int (*handler)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct wmOperator *op);
int flag; /* flags
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list