[Bf-blender-cvs] [a484385] temp_widgets_c++_experiment: Use C++ widget-map for widget operators, move them to wm_operators.c

Julian Eisel noreply at git.blender.org
Tue Dec 22 15:44:18 CET 2015


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




More information about the Bf-blender-cvs mailing list