Commit: a99f5a7463f8b3579d66d44a0af6af1895b4ec3e Author: Antony Riakiotakis Date: Thu Nov 27 11:35:50 2014 +0100 Branches: wiggly-widgets https://developer.blender.org/rBa99f5a7463f8b3579d66d44a0af6af1895b4ec3e
Add stub operator for widget operation so it is blocking and events do not get lost when region changes. =================================================================== M source/blender/windowmanager/intern/wm_event_system.c M source/blender/windowmanager/intern/wm_generic_widgets.c M source/blender/windowmanager/intern/wm_operators.c M source/blender/windowmanager/intern/wm_widgets.c M source/blender/windowmanager/wm.h =================================================================== diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index e76421f..e371519 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1590,7 +1590,6 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand break; case LEFTMOUSE: - { if (event->val == KM_RELEASE) { ARegion *ar = CTX_wm_region(C); if (widget->prop) @@ -1600,7 +1599,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand handler->op_widget = NULL; } break; - } + default: if (!widget->prop) { retval = ot->modal(C, op, event); diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c index 05deb30..99676ee 100644 --- a/source/blender/windowmanager/intern/wm_generic_widgets.c +++ b/source/blender/windowmanager/intern/wm_generic_widgets.c @@ -340,10 +340,7 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event, } /* set the property for the operator and call its modal function */ - if (op && widget->propname) { - - } - else if (widget->prop) { + if (widget->prop) { float value; value = data->orig_offset + facdir * len_v3(offset); @@ -367,6 +364,9 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event, else arrow->offset = RNA_property_float_get(widget->ptr, widget->prop); } + else if (op && widget->propname) { + + } else { arrow->offset = facdir * len_v3(offset); } diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index f993f82..89f5e6b 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -4498,6 +4498,36 @@ static void WM_OT_radial_control(wmOperatorType *ot) RNA_def_boolean(ot->srna, "secondary_tex", false, "Secondary Texture", "Tweak brush secondary/mask texture"); } +/* ************************** widget property tweak *************** */ + +static int widget_tweak_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) +{ + WM_event_add_modal_handler(C, op); + return OPERATOR_RUNNING_MODAL; +} + +static int widget_tweak_modal(bContext *UNUSED(C), wmOperator *UNUSED(op), const wmEvent *event) +{ + if (event->type == EVT_WIDGET_RELEASED) + return OPERATOR_FINISHED; + + return OPERATOR_RUNNING_MODAL; +} + +static void WM_OT_widget_tweak(wmOperatorType *ot) +{ + ot->name = "Radial Control"; + ot->idname = "WM_OT_widget_tweak"; + ot->description = "Tweak property attached to a widget"; + + ot->invoke = widget_tweak_invoke; + ot->modal = widget_tweak_modal; + + ot->flag = OPTYPE_REGISTER | OPTYPE_BLOCKING | OPTYPE_UNDO; +} + + + /* ************************** timer for testing ***************** */ /* uses no type defines, fully local testing function anyway... ;) */ @@ -4737,6 +4767,7 @@ void wm_operatortype_init(void) WM_operatortype_append(WM_OT_call_menu); WM_operatortype_append(WM_OT_call_menu_pie); WM_operatortype_append(WM_OT_radial_control); + WM_operatortype_append(WM_OT_widget_tweak); #if defined(WIN32) WM_operatortype_append(WM_OT_console_toggle); #endif diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c index f602f1e..6c4eb8b 100644 --- a/source/blender/windowmanager/intern/wm_widgets.c +++ b/source/blender/windowmanager/intern/wm_widgets.c @@ -620,9 +620,12 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C /* widget does nothing, pass */ wmap->active_widget = NULL; } - else if (widget->opname) { - wmOperatorType *ot = WM_operatortype_find(widget->opname, 0); - + else if (widget->opname || widget->ptr) { + wmOperatorType *ot; + const char *opname = (widget->opname) ? widget->opname : "WM_OT_widget_tweak"; + + ot = WM_operatortype_find(opname, 0); + if (ot) { widget->flag |= WM_WIDGET_ACTIVE; /* first activate the widget itself */ @@ -630,15 +633,15 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C widget->activate_state(C, event, widget, WIDGET_ACTIVATE); } - WM_operator_properties_alloc(&widget->ptr, &widget->properties, widget->opname); + WM_operator_properties_alloc(&widget->opptr, &widget->properties, opname); /* time to initialize those properties now */ if (widget->initialize_op) { - widget->initialize_op(C, event, widget, widget->ptr); + widget->initialize_op(C, event, widget, widget->opptr); } CTX_wm_widget_set(C, widget); - WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, widget->ptr); + WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, widget->opptr); wmap->active_widget = widget; return; } @@ -648,16 +651,6 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C return; } } - /* no operator, but we have a pointer */ - else if (widget->ptr) { - /* first activate the widget itself */ - if (widget->activate_state) { - widget->activate_state(C, event, widget, WIDGET_ACTIVATE); - } - - CTX_wm_widget_set(C, widget); - wmap->active_widget = widget; - } else { /* widget does nothing, pass */ wmap->active_widget = NULL; @@ -675,16 +668,11 @@ void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C widget->activate_state(C, event, widget, WIDGET_DEACTIVATE); } - if (widget->opname && widget->ptr) { - WM_operator_properties_free(widget->ptr); - MEM_freeN(widget->ptr); + if (widget->opptr) { + WM_operator_properties_free(widget->opptr); + MEM_freeN(widget->opptr); widget->properties = NULL; - widget->ptr = NULL; - } - else if (widget->prop) { - char undo_str[256]; - BLI_snprintf(undo_str, 256, "widget_undo: %s", RNA_property_ui_name(widget->prop)); - ED_undo_push(C, undo_str); + widget->opptr = NULL; } } diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h index ac6ff16..5460a42 100644 --- a/source/blender/windowmanager/wm.h +++ b/source/blender/windowmanager/wm.h @@ -101,6 +101,7 @@ typedef struct wmWidget { /* operator properties if widget spawns and controls an operator, or owner pointer if widget spawns and controls a property */ struct PointerRNA *ptr; + struct PointerRNA *opptr; struct IDProperty *properties; /* operator properties, assigned to ptr->data and can be written to a file */ struct PropertyRNA *prop; } wmWidget; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs