[Bf-blender-cvs] [9f00ec6] temp_widgets_c++_experiment: Port wmWidget struct to lower-level C++ class
Julian Eisel
noreply at git.blender.org
Mon Dec 28 04:55:06 CET 2015
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. @@
More information about the Bf-blender-cvs
mailing list