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

Reply via email to