Commit: a484385bca23926c3a19fd8824c79cda51a7520d
Author: Julian Eisel
Date:   Tue Dec 22 15:42:00 2015 +0100
Branches: temp_widgets_c++_experiment
https://developer.blender.org/rBa484385bca23926c3a19fd8824c79cda51a7520d

Use C++ widget-map for widget operators, move them to wm_operators.c

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

M       source/blender/windowmanager/intern/widgets/wm_widgets_c_api.cc
M       source/blender/windowmanager/intern/widgets/wm_widgets_c_api.h
M       source/blender/windowmanager/intern/wm_operators.c
M       source/blender/windowmanager/intern/wm_widgets.c
M       source/blender/windowmanager/wm.h
M       source/blender/windowmanager/wm_event_types.h

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

diff --git a/source/blender/windowmanager/intern/widgets/wm_widgets_c_api.cc 
b/source/blender/windowmanager/intern/widgets/wm_widgets_c_api.cc
index c5b506a..62d7671 100644
--- a/source/blender/windowmanager/intern/widgets/wm_widgets_c_api.cc
+++ b/source/blender/windowmanager/intern/widgets/wm_widgets_c_api.cc
@@ -158,9 +158,3 @@ wmKeyMap 
*WM_widgetgrouptype_user_keymap_get(wmWidgetGroupType *wgrouptype)
        return wgrouptype->get_keymap();
 }
 
-
-void fix_linking_widgets(void)
-{
-       (void)0;
-}
-
diff --git a/source/blender/windowmanager/intern/widgets/wm_widgets_c_api.h 
b/source/blender/windowmanager/intern/widgets/wm_widgets_c_api.h
index 4b8033b..5b77bb2 100644
--- a/source/blender/windowmanager/intern/widgets/wm_widgets_c_api.h
+++ b/source/blender/windowmanager/intern/widgets/wm_widgets_c_api.h
@@ -99,8 +99,6 @@ size_t      WM_widgetgrouptype_idname_get(struct 
wmWidgetGroupType *wgrouptype,
 wmOperator *WM_widgetgrouptype_operator_get(struct wmWidgetGroupType 
*wgrouptype);
 wmKeyMap   *WM_widgetgrouptype_user_keymap_get(struct wmWidgetGroupType 
*wgrouptype);
 
-void fix_linking_widgets(void);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/windowmanager/intern/wm_operators.c 
b/source/blender/windowmanager/intern/wm_operators.c
index e09b73d..8f4c42e 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -5250,6 +5250,208 @@ static void WM_OT_stereo3d_set(wmOperatorType *ot)
        RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
+/* ************************** wmWidget ***************** */
+
+/** \name Widget operators
+ *
+ * Basic operators for widget interaction with user configurable keymaps.
+ *
+ * \{ */
+
+static int widget_select_invoke(bContext *C, wmOperator *op)
+{
+       ARegion *ar = CTX_wm_region(C);
+
+       bool extend = RNA_boolean_get(op->ptr, "extend");
+       bool deselect = RNA_boolean_get(op->ptr, "deselect");
+       bool toggle = RNA_boolean_get(op->ptr, "toggle");
+
+
+       for (Link *link = ar->widgetmaps.first; link; link = link->next) {
+               struct wmWidgetMap *wmap = (struct wmWidgetMap *)link;
+               wmWidget *highlighted = 
wm_widgetmap_highlighted_widget_get(wmap);
+
+               /* deselect all first */
+               if (extend == false && deselect == false && toggle == false) {
+                       WM_widgetmap_select_all(wmap, C, SEL_DESELECT);
+               }
+
+               if (highlighted) {
+                       const bool is_selected = (highlighted->flag & 
WM_WIDGET_SELECTED);
+
+                       if (toggle) {
+                               /* toggle: deselect if already selected, else 
select */
+                               deselect = is_selected;
+                       }
+
+                       if (deselect) {
+                               if (is_selected)
+                                       wm_widget_deselect(wmap, C, 
highlighted);
+                       }
+                       else {
+                               wm_widget_select(wmap, C, highlighted);
+                       }
+
+                       return OPERATOR_FINISHED;
+               }
+               else {
+                       BLI_assert(0);
+                       return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
+               }
+       }
+
+       return OPERATOR_PASS_THROUGH;
+}
+
+static void WM_OT_widget_select(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Widget Select";
+       ot->description = "Select the currently highlighted widget";
+       ot->idname = "WM_OT_widget_select";
+
+       /* api callbacks */
+       ot->exec = widget_select_invoke;
+
+       ot->flag = OPTYPE_UNDO;
+
+       WM_operator_properties_mouse_select(ot);
+       fix_linking_widgets();
+}
+
+typedef struct WidgetTweakData {
+       struct wmWidgetMap *wmap;
+       wmWidget *active;
+
+       int init_event; /* initial event type */
+       int flag;       /* tweak flags */
+} WidgetTweakData;
+
+static void widget_tweak_finish(bContext *C, wmOperator *op)
+{
+       WidgetTweakData *wtweak = op->customdata;
+       wm_widgetmap_active_widget_set(wtweak->wmap, C, NULL, NULL);
+       MEM_freeN(wtweak);
+}
+
+static void widget_tweak_cancel(bContext *C, wmOperator *op)
+{
+       WidgetTweakData *wtweak = op->customdata;
+       if (wtweak->active->cancel) {
+               wtweak->active->cancel(C, wtweak->active);
+       }
+       widget_tweak_finish(C, op);
+}
+
+static int widget_tweak_modal(bContext *C, wmOperator *op, const wmEvent 
*event)
+{
+       WidgetTweakData *wtweak = op->customdata;
+       wmWidget *widget = wtweak->active;
+
+       if (!widget) {
+               BLI_assert(0);
+               return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
+       }
+
+       if (event->type == wtweak->init_event && event->val == KM_RELEASE) {
+               widget_tweak_finish(C, op);
+               return OPERATOR_FINISHED;
+       }
+
+
+       if (event->type == EVT_MODAL_MAP) {
+               switch (event->val) {
+                       case WIDGET_TWEAK_MODAL_CANCEL:
+                               widget_tweak_cancel(C, op);
+                               return OPERATOR_CANCELLED;
+                       case WIDGET_TWEAK_MODAL_CONFIRM:
+                               widget_tweak_finish(C, op);
+                               return OPERATOR_FINISHED;
+                       case WIDGET_TWEAK_MODAL_PRECISION_ON:
+                               wtweak->flag |= WM_WIDGET_TWEAK_PRECISE;
+                               break;
+                       case WIDGET_TWEAK_MODAL_PRECISION_OFF:
+                               wtweak->flag &= ~WM_WIDGET_TWEAK_PRECISE;
+                               break;
+               }
+       }
+
+       /* handle widget */
+       if (widget->handler) {
+               widget->handler(C, event, widget, wtweak->flag);
+       }
+
+       /* Ugly hack to send widget events */
+       ((wmEvent *)event)->type = EVT_WIDGET_UPDATE;
+
+       /* always return PASS_THROUGH so modal handlers
+        * with widgets attached can update */
+       return OPERATOR_PASS_THROUGH;
+}
+
+static int widget_tweak_invoke(bContext *C, wmOperator *op, const wmEvent 
*event)
+{
+       ARegion *ar = CTX_wm_region(C);
+       Link *link;
+       struct wmWidgetMap *wmap;
+       wmWidget *widget;
+
+       for (link = ar->widgetmaps.first; link; link = link->next) {
+               wmap = (struct wmWidgetMap *)link;
+               if ((widget = wm_widgetmap_highlighted_widget_get(wmap)))
+                       break;
+       }
+
+       if (!widget) {
+               /* wm_handlers_do_intern shouldn't let this happen */
+               BLI_assert(0);
+               return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
+       }
+
+
+       /* activate highlighted widget */
+       wm_widgetmap_active_widget_set(wmap, C, event, widget);
+
+       /* XXX temporary workaround for modal widget operator
+        * conflicting with modal operator attached to widget */
+       if (widget->opname) {
+               wmOperatorType *ot = WM_operatortype_find(widget->opname, true);
+               if (ot->modal) {
+                       return OPERATOR_FINISHED;
+               }
+       }
+
+
+       WidgetTweakData *wtweak = MEM_mallocN(sizeof(WidgetTweakData), 
__func__);
+
+       wtweak->init_event = event->type;
+       wtweak->active = widget;
+       wtweak->wmap = wmap;
+       wtweak->flag = 0;
+
+       op->customdata = wtweak;
+
+       WM_event_add_modal_handler(C, op);
+
+       return OPERATOR_RUNNING_MODAL;
+}
+
+static void WM_OT_widget_tweak(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Widget Tweak";
+       ot->description = "Tweak the active widget";
+       ot->idname = "WM_OT_widget_tweak";
+
+       /* api callbacks */
+       ot->invoke = widget_tweak_invoke;
+       ot->modal = widget_tweak_modal;
+       ot->cancel = widget_tweak_cancel;
+}
+
+/** \} */ // Widget operators
+
+
 /* ******************************************************* */
 /* called on initialize WM_exit() */
 void wm_operatortype_free(void)
@@ -5302,8 +5504,8 @@ void wm_operatortype_init(void)
        WM_operatortype_append(WM_OT_doc_view_manual_ui_context);
 
        /* widgets */
-       WM_operatortype_append(WIDGETGROUP_OT_widget_select);
-       WM_operatortype_append(WIDGETGROUP_OT_widget_tweak);
+       WM_operatortype_append(WM_OT_widget_select);
+       WM_operatortype_append(WM_OT_widget_tweak);
 }
 
 /* circleselect-like modal operators */
diff --git a/source/blender/windowmanager/intern/wm_widgets.c 
b/source/blender/windowmanager/intern/wm_widgets.c
index 22702ef..ed72e0c 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -91,11 +91,6 @@ wmWidget *WM_widget_new(void (*draw)(const bContext *C, 
wmWidget *customdata),
        return widget;
 }
 
-BLI_INLINE bool widget_compare(const wmWidget *a, const wmWidget *b)
-{
-       return STREQ(a->idname, b->idname);
-}
-
 /**
  * Assign an idname that is unique in \a wgroup to \a widget.
  *
@@ -248,219 +243,16 @@ void WM_widget_set_colors(wmWidget *widget, const float 
col[4], const float col_
 /** \} */ // Widget Creation API
 
 
-/** \name Widget operators
- *
- * Basic operators for widget interaction with user configurable keymaps.
- *
- * \{ */
-
-static int widget_select_invoke(bContext *C, wmOperator *op)
-{
-       ARegion *ar = CTX_wm_region(C);
-
-       bool extend = RNA_boolean_get(op->ptr, "extend");
-       bool deselect = RNA_boolean_get(op->ptr, "deselect");
-       bool toggle = RNA_boolean_get(op->ptr, "toggle");
-
-
-       for (Link *link = ar->widgetmaps.first; link; link = link->next) {
-               struct wmWidgetMap *wmap = (struct wmWidgetMap *)link;
-               wmWidget *highlighted = 
wm_widgetmap_highlighted_widget_get(wmap);
-
-               /* deselect all first */
-               if (extend == false && deselect == false && toggle == false) {
-                       WM_widgetmap_select_all(wmap, C, SEL_DESELECT);
-               }
-
-               if (highlighted) {
-                       const bool is_selected = (highlighted->flag & 
WM_WIDGET_SELECTED);
-
-                       if (toggle) {
-                               /* toggle: deselect if already selected, else 
select */
-                               deselect = is_selected;
-                       }
-
-                       if (deselect) {
-                               if (is_selected)
-                                       wm_widget_deselect(wmap, C, 
highlighted);
-                       }
-                       else {
-                               wm_widget_select(wmap, C, highlighted);
-                       }
-
-                       return OPERATOR_FINISHED;
-               }
-               else {
-                       BLI_assert(0);
-                       return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH);
-               }
-       }
-
-       return OPERATOR_PASS_THROUGH;
-}
-
-void WIDGETGROUP_OT_widget_select(wmOperatorType *ot)
-{
-       /* identifiers */
-       ot->name = "Widget Select";
-       ot->description = "Select the currently highlighted widget";
-       ot->idname = "WIDGETGROUP_OT_widget_select";
-
-       /* api callbacks */
-       ot->exec = widget_select_invoke;
-
-       ot->flag = OPTYPE_UNDO;
-
-       WM_operator_properties_mouse_select(ot);
-}
-
-typedef struct WidgetTweakData {
-       wmWidgetMapC *wmap;
-       wmWidget *active;
-
-       int init_event; /* initial event type */
-       int flag;       /* tweak flags */
-} WidgetTweakData;
-
-enum {
-       TWEAK_MODAL_CANCEL = 1,
-       TWEAK_MODAL_CONFIRM,
-       TWEAK_MODAL_PRECISION_ON,
-       TWEAK_MODAL_PRECISION_OFF,
-};
-
-static void widget_tweak_finish(bContext *C, wmOperator *op)
-{
-       WidgetTweakData *wtweak = op->customdata;
-       wm_widgetmap_active_widget_set(wtweak->wmap, C, NULL, NULL);
-       MEM_freeN(wtweak);
-}
-
-static void widget_tweak_cancel(bContext *C, wmOperator *op)
-{
-       WidgetTweakData *wtweak = op->customdata;
-       if (wtweak->active->cancel) {
-               wtweak->active->cancel(C, wtweak->active);
-       }
-       widget_tweak_finish(C, op);
-}
-
-static int widget_tweak_modal(bContext *C, wmOperator *op, const 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to