[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