Commit: 9f00ec6f4fd88f5f488b5424ab14cd51758c308c
Author: Julian Eisel
Date:   Mon Dec 28 04:39:54 2015 +0100
Branches: temp_widgets_c++_experiment
https://developer.blender.org/rB9f00ec6f4fd88f5f488b5424ab14cd51758c308c

Port wmWidget struct to lower-level C++ class

Main changes here are moving wmWidget to windowmanager/widgets/wm_widget.h, 
making it a class with private members, and adding/adjusting needed _get/_set 
API calls. To avoid lots of noise in code, D1697 is applied.
And of course there is some cleanup too.

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

M       intern/guardedalloc/MEM_guardedalloc.h
M       source/blender/editors/transform/transform_manipulator.c
M       source/blender/windowmanager/intern/wm_operators.c
M       source/blender/windowmanager/widgets/widget_library/arrow_widget.cc
M       source/blender/windowmanager/widgets/widget_library/cage_widget.cc
M       source/blender/windowmanager/widgets/widget_library/dial_widget.cc
M       source/blender/windowmanager/widgets/widget_library/facemap_widget.cc
M       source/blender/windowmanager/widgets/widget_library/plane_widget.cc
M       source/blender/windowmanager/widgets/wm_widget.cc
M       source/blender/windowmanager/widgets/wm_widget.h
M       source/blender/windowmanager/widgets/wm_widgetgroup.cc
M       source/blender/windowmanager/widgets/wm_widgetgrouptype.cc
M       source/blender/windowmanager/widgets/wm_widgetmap.cc
M       source/blender/windowmanager/widgets/wm_widgets_c_api.cc
M       source/blender/windowmanager/widgets/wm_widgets_c_api.h
M       source/blender/windowmanager/wm.h

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

diff --git a/intern/guardedalloc/MEM_guardedalloc.h 
b/intern/guardedalloc/MEM_guardedalloc.h
index 05a98c1..c5bce4c 100644
--- a/intern/guardedalloc/MEM_guardedalloc.h
+++ b/intern/guardedalloc/MEM_guardedalloc.h
@@ -228,9 +228,15 @@ public:                                                    
                   \
 #if defined __GNUC__ || defined __sun
 #  define OBJECT_GUARDED_NEW(type, args ...) \
        new(MEM_mallocN(sizeof(type), __func__)) type(args)
+/* Same as OBJECT_GUARDED_NEW, but uses calloc */
+#  define OBJECT_GUARDED_NEW_CALLOC(type, args ...) \
+       new(MEM_callocN(sizeof(type), __func__)) type(args)
 #else
 #  define OBJECT_GUARDED_NEW(type, ...) \
        new(MEM_mallocN(sizeof(type), __FUNCTION__)) type(__VA_ARGS__)
+/* Same as OBJECT_GUARDED_NEW, but uses calloc */
+#  define OBJECT_GUARDED_NEW_CALLOC(type, ...) \
+       new(MEM_callocN(sizeof(type), __FUNCTION__)) type(__VA_ARGS__)
 #endif
 #define OBJECT_GUARDED_DELETE(what, type) \
        { if(what) { \
diff --git a/source/blender/editors/transform/transform_manipulator.c 
b/source/blender/editors/transform/transform_manipulator.c
index a888bc7..ecee26f 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1139,7 +1139,7 @@ void WIDGETGROUP_manipulator_create(const bContext *C, 
wmWidgetGroup *wgroup)
                WM_widget_set_origin(axis, rv3d->twmat[3]);
                WM_widget_set_colors(axis, col, col_hi);
                /* custom handler! */
-               axis->handler = manipulator_handler;
+               WM_widget_set_func_handler(axis, manipulator_handler);
 
                switch(axis_idx) {
                        case MAN_AXIS_TRANS_X:
diff --git a/source/blender/windowmanager/intern/wm_operators.c 
b/source/blender/windowmanager/intern/wm_operators.c
index 57a8f65..4828387 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -5277,7 +5277,7 @@ static int widget_select_invoke(bContext *C, wmOperator 
*op)
                }
 
                if (highlighted) {
-                       const bool is_selected = (highlighted->flag & 
WM_WIDGET_SELECTED);
+                       const bool is_selected = 
WM_widget_flag_is_set(highlighted, WM_WIDGET_SELECTED);
 
                        if (toggle) {
                                /* toggle: deselect if already selected, else 
select */
@@ -5286,10 +5286,10 @@ static int widget_select_invoke(bContext *C, wmOperator 
*op)
 
                        if (deselect) {
                                if (is_selected)
-                                       wm_widget_deselect(wmap, C, 
highlighted);
+                                       wm_widget_deselect(highlighted, wmap, 
C);
                        }
                        else {
-                               wm_widget_select(wmap, C, highlighted);
+                               wm_widget_select(highlighted, wmap, C);
                        }
 
                        return OPERATOR_FINISHED;
@@ -5336,9 +5336,7 @@ static void widget_tweak_finish(bContext *C, wmOperator 
*op)
 static void widget_tweak_cancel(bContext *C, wmOperator *op)
 {
        WidgetTweakData *wtweak = op->customdata;
-       if (wtweak->active->cancel) {
-               wtweak->active->cancel(C, wtweak->active);
-       }
+       wm_widget_tweak_cancel(wtweak->active, C);
        widget_tweak_finish(C, op);
 }
 
@@ -5375,10 +5373,7 @@ static int widget_tweak_modal(bContext *C, wmOperator 
*op, const wmEvent *event)
                }
        }
 
-       /* handle widget */
-       if (widget->handler) {
-               widget->handler(C, event, widget, wtweak->flag);
-       }
+       wm_widget_handle(widget, C, event, wtweak->flag);
 
        /* Ugly hack to send widget events */
        ((wmEvent *)event)->type = EVT_WIDGET_UPDATE;
@@ -5394,6 +5389,7 @@ static int widget_tweak_invoke(bContext *C, wmOperator 
*op, const wmEvent *event
        Link *link;
        wmWidgetMap *wmap;
        wmWidget *widget;
+       const char *opname;
 
        for (link = ar->widgetmaps.first; link; link = link->next) {
                wmap = (wmWidgetMap *)link;
@@ -5413,8 +5409,8 @@ static int widget_tweak_invoke(bContext *C, wmOperator 
*op, const wmEvent *event
 
        /* 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 ((opname = WM_widget_get_operatorname(widget))) {
+               wmOperatorType *ot = WM_operatortype_find(opname, true);
                if (ot->modal) {
                        return OPERATOR_FINISHED;
                }
diff --git 
a/source/blender/windowmanager/widgets/widget_library/arrow_widget.cc 
b/source/blender/windowmanager/widgets/widget_library/arrow_widget.cc
index f3524e6..84ebaea 100644
--- a/source/blender/windowmanager/widgets/widget_library/arrow_widget.cc
+++ b/source/blender/windowmanager/widgets/widget_library/arrow_widget.cc
@@ -34,6 +34,8 @@
  *        cone, box, etc.
  */
 
+#include <new>
+
 #include "BIF_gl.h"
 
 #include "BKE_context.h"
@@ -75,6 +77,8 @@ enum {
 };
 
 typedef struct ArrowWidget: wmWidget {
+       ArrowWidget(wmWidgetGroup *wgroup, const char *name);
+
        int style;
        int arrow_flag;
 
@@ -107,6 +111,12 @@ typedef struct ArrowInteraction {
 #define ARROW_PRECISION_FAC 0.05f
 
 
+ArrowWidget::ArrowWidget(wmWidgetGroup *wgroup, const char *name)
+    : wmWidget(wgroup, name)
+{
+       
+}
+
 static void widget_arrow_get_final_pos(wmWidget *widget, float r_pos[3])
 {
        ArrowWidget *arrow = (ArrowWidget *)widget;
@@ -545,7 +555,7 @@ wmWidget *WIDGET_arrow_new(wmWidgetGroup *wgroup, const 
char *name, const int st
        }
 
 
-       ArrowWidget *arrow = (ArrowWidget *)MEM_callocN(sizeof(ArrowWidget), 
name);
+       ArrowWidget *arrow = OBJECT_GUARDED_NEW_CALLOC(ArrowWidget, wgroup, 
name);
        const float dir_default[3] = {0.0f, 0.0f, 1.0f};
 
        arrow->draw                    = widget_arrow_draw;
@@ -563,8 +573,6 @@ wmWidget *WIDGET_arrow_new(wmWidgetGroup *wgroup, const 
char *name, const int st
        arrow->range_fac = 1.0f;
        copy_v3_v3(arrow->direction, dir_default);
 
-       wm_widget_register(wgroup, arrow, name);
-
        return (wmWidget *)arrow;
 }
 
diff --git a/source/blender/windowmanager/widgets/widget_library/cage_widget.cc 
b/source/blender/windowmanager/widgets/widget_library/cage_widget.cc
index a154959..0e7dbe2 100644
--- a/source/blender/windowmanager/widgets/widget_library/cage_widget.cc
+++ b/source/blender/windowmanager/widgets/widget_library/cage_widget.cc
@@ -33,6 +33,8 @@
  * \brief Rectangular widget acting as a 'cage' around its content. 
Interacting scales or translates the widget.
  */
 
+#include <new>
+
 #include "BIF_gl.h"
 
 #include "BKE_context.h"
@@ -66,6 +68,8 @@ enum {
 #define WIDGET_RESIZER_WIDTH  20.0f
 
 typedef struct RectTransformWidget: wmWidget {
+       RectTransformWidget(wmWidgetGroup *wgroup, const char *name, const int 
max_prop);
+
        float w, h;      /* dimensions of widget */
        float rotation;  /* rotation of the rectangle */
        float scale[2]; /* scaling for the widget for non-destructive editing. 
*/
@@ -73,6 +77,12 @@ typedef struct RectTransformWidget: wmWidget {
 } RectTransformWidget;
 
 
+RectTransformWidget::RectTransformWidget(wmWidgetGroup *wgroup, const char 
*name, const int max_prop)
+    : wmWidget(wgroup, name, max_prop)
+{
+       
+}
+
 static void rect_transform_draw_corners(rctf *r, const float offsetx, const 
float offsety)
 {
        glBegin(GL_LINES);
@@ -515,7 +525,7 @@ wmWidget *WIDGET_rect_transform_new(
         wmWidgetGroup *wgroup, const char *name, const int style,
         const float width, const float height)
 {
-       RectTransformWidget *cage = (RectTransformWidget 
*)MEM_callocN(sizeof(RectTransformWidget), name);
+       RectTransformWidget *cage = 
OBJECT_GUARDED_NEW_CALLOC(RectTransformWidget, wgroup, name, 2);
 
        cage->draw          = widget_rect_transform_draw;
        cage->invoke        = widget_rect_transform_invoke;
@@ -524,15 +534,12 @@ wmWidget *WIDGET_rect_transform_new(
        cage->intersect     = widget_rect_transform_intersect;
        cage->cancel        = widget_rect_transform_cancel;
        cage->get_cursor    = widget_rect_transform_get_cursor;
-       cage->max_prop      = 2;
        cage->flag         |= WM_WIDGET_DRAW_ACTIVE;
        cage->scale[0]      = cage->scale[1] = 1.0f;
        cage->style         = style;
        cage->w             = width;
        cage->h             = height;
 
-       wm_widget_register(wgroup, cage, name);
-
        return (wmWidget *)cage;
 }
 
diff --git a/source/blender/windowmanager/widgets/widget_library/dial_widget.cc 
b/source/blender/windowmanager/widgets/widget_library/dial_widget.cc
index b706fce..da12fad 100644
--- a/source/blender/windowmanager/widgets/widget_library/dial_widget.cc
+++ b/source/blender/windowmanager/widgets/widget_library/dial_widget.cc
@@ -33,6 +33,8 @@
  * \brief Circle shaped widget for circular interaction. Currently no own 
handling, use with operator only.
  */
 
+#include <new>
+
 #include "BIF_gl.h"
 
 #include "BKE_context.h"
@@ -62,11 +64,19 @@ WidgetDrawInfo dial_draw_info = {0};
 #endif
 
 typedef struct DialWidget: wmWidget {
+       DialWidget(wmWidgetGroup *wgroup, const char *name);
+
        int style;
        float direction[3];
 } DialWidget;
 
 
+DialWidget::DialWidget(wmWidgetGroup *wgroup, const char *name)
+    : wmWidget(wgroup, name)
+{
+       
+}
+
 static void dial_draw_geom(const DialWidget *dial, const bool select)
 {
 #ifdef WIDGET_USE_CUSTOM_DIAS
@@ -166,7 +176,7 @@ static void widget_dial_draw(const bContext *C, wmWidget 
*widget)
 
 wmWidget *WIDGET_dial_new(wmWidgetGroup *wgroup, const char *name, const int 
style)
 {
-       DialWidget *dial = (DialWidget *)MEM_callocN(sizeof(DialWidget), name);
+       DialWidget *dial = OBJECT_GUARDED_NEW_CALLOC(DialWidget, wgroup, name);
        const float dir_default[3] = {0.0f, 0.0f, 1.0f};
 
 #ifdef WIDGET_USE_CUSTOM_DIAS
@@ -189,8 +199,6 @@ wmWidget *WIDGET_dial_new(wmWidgetGroup *wgroup, const char 
*name, const int sty
        /* defaults */
        copy_v3_v3(dial->direction, dir_default);
 
-       wm_widget_register(wgroup, dial, name);
-
        return (wmWidget *)dial;
 }
 
diff --git 
a/source/blender/windowmanager/widgets/widget_library/facemap_widget.cc 
b/source/blender/windowmanager/widgets/widget_library/facemap_widget.cc
index c8eef0f..707d8a1 100644
--- a/source/blender/windowmanager/widgets/widget_library/facemap_widget.cc
+++ b/source/blender/windowmanager/widgets/widget_library/facemap_widget.cc
@@ -33,6 +33,8 @@
  * \brief Widget representing shape of a face map. Currently no own handling, 
use with operator only.
  */
 
+#include <new>
+
 #include "BIF_gl.h"
 
 #include "BKE_context.h"
@@ -57,12 +59,20 @@
 #include "widget_geometry.h"
 
 typedef struct FacemapWidget: wmWidget {
+       FacemapWidget(wmWidgetGroup *wgroup, const char *name);
+
        Object *ob;
        int facemap;
        int style;
 } FacemapWidget;

@@ 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