[Bf-blender-cvs] [54bc49e6f94] blender2.8: Manipulator: refactor/fix selection logic

Campbell Barton noreply at git.blender.org
Wed Jul 26 00:25:01 CEST 2017


Commit: 54bc49e6f940c6e4b1ee893ac28b87fa1b150656
Author: Campbell Barton
Date:   Wed Jul 26 08:12:46 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB54bc49e6f940c6e4b1ee893ac28b87fa1b150656

Manipulator: refactor/fix selection logic

- Cleanup array access, move into functions.
- Store allocated size to avoid realloc's on every add/remove.
- Make select editable from Python.
- Rename select callback to select_refresh
  (collided with select boolean).
- Call select_refresh when de-selecting as well as selection.

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

M	source/blender/makesrna/intern/rna_wm_manipulator.c
M	source/blender/windowmanager/manipulators/WM_manipulator_api.h
M	source/blender/windowmanager/manipulators/WM_manipulator_types.h
M	source/blender/windowmanager/manipulators/intern/wm_manipulator.c
M	source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
M	source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
M	source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c
M	source/blender/windowmanager/manipulators/wm_manipulator_fn.h

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

diff --git a/source/blender/makesrna/intern/rna_wm_manipulator.c b/source/blender/makesrna/intern/rna_wm_manipulator.c
index 919b632a07e..2fa2eaa5075 100644
--- a/source/blender/makesrna/intern/rna_wm_manipulator.c
+++ b/source/blender/makesrna/intern/rna_wm_manipulator.c
@@ -210,21 +210,19 @@ static void rna_manipulator_exit_cb(
 	RNA_parameter_list_free(&list);
 }
 
-static void rna_manipulator_select_cb(
-        struct bContext *C, struct wmManipulator *mpr, int action)
+static void rna_manipulator_select_refresh_cb(
+        struct wmManipulator *mpr)
 {
-	extern FunctionRNA rna_Manipulator_select_func;
+	extern FunctionRNA rna_Manipulator_select_refresh_func;
 	wmManipulatorGroup *mgroup = mpr->parent_mgroup;
 	PointerRNA mpr_ptr;
 	ParameterList list;
 	FunctionRNA *func;
 	RNA_pointer_create(NULL, mpr->type->ext.srna, mpr, &mpr_ptr);
-	/* RNA_struct_find_function(&mpr_ptr, "select"); */
-	func = &rna_Manipulator_select_func;
+	/* RNA_struct_find_function(&mpr_ptr, "select_refresh"); */
+	func = &rna_Manipulator_select_refresh_func;
 	RNA_parameter_list_create(&list, &mpr_ptr, func);
-	RNA_parameter_set_lookup(&list, "context", &C);
-	RNA_parameter_set_lookup(&list, "action", &action);
-	mgroup->type->ext.call((bContext *)C, &mpr_ptr, func, &list);
+	mgroup->type->ext.call((bContext *)NULL, &mpr_ptr, func, &list);
 	RNA_parameter_list_free(&list);
 }
 
@@ -375,6 +373,13 @@ RNA_MANIPULATOR_FLAG_RO_DEF(state_is_highlight, state, WM_MANIPULATOR_STATE_HIGH
 RNA_MANIPULATOR_FLAG_RO_DEF(state_is_modal, state, WM_MANIPULATOR_STATE_MODAL);
 RNA_MANIPULATOR_FLAG_RO_DEF(state_select, state, WM_MANIPULATOR_STATE_SELECT);
 
+static void rna_Manipulator_state_select_set(struct PointerRNA *ptr, int value)
+{
+	wmManipulator *mpr = ptr->data;
+	wmManipulatorGroup *mgroup = mpr->parent_mgroup;
+	WM_manipulator_select_set(mgroup->parent_mmap, mpr, value);
+}
+
 static void rna_Manipulator_name_get(PointerRNA *ptr, char *value)
 {
 	wmManipulator *mpr = ptr->data;
@@ -464,7 +469,7 @@ static StructRNA *rna_Manipulator_register(
 		dummywt.setup = (have_function[i++]) ? rna_manipulator_setup_cb : NULL;
 		dummywt.invoke = (have_function[i++]) ? rna_manipulator_invoke_cb : NULL;
 		dummywt.exit = (have_function[i++]) ? rna_manipulator_exit_cb : NULL;
-		dummywt.select = (have_function[i++]) ? rna_manipulator_select_cb : NULL;
+		dummywt.select_refresh = (have_function[i++]) ? rna_manipulator_select_refresh_cb : NULL;
 
 		BLI_assert(i == ARRAY_SIZE(have_function));
 	}
@@ -974,22 +979,10 @@ static void rna_def_manipulator(BlenderRNA *brna, PropertyRNA *cprop)
 	/* wmManipulator.cursor_get */
 	/* TODO */
 
-	/* wmManipulator.select */
-	/* TODO, de-duplicate! */
-	static EnumPropertyItem select_actions[] = {
-		{SEL_TOGGLE, "TOGGLE", 0, "Toggle", "Toggle selection for all elements"},
-		{SEL_SELECT, "SELECT", 0, "Select", "Select all elements"},
-		{SEL_DESELECT, "DESELECT", 0, "Deselect", "Deselect all elements"},
-		{SEL_INVERT, "INVERT", 0, "Invert", "Invert selection of all elements"},
-		{0, NULL, 0, NULL, NULL}
-	};
-	func = RNA_def_function(srna, "select", NULL);
+	/* wmManipulator.select_refresh */
+	func = RNA_def_function(srna, "select_refresh", NULL);
 	RNA_def_function_ui_description(func, "");
 	RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
-	parm = RNA_def_pointer(func, "context", "Context", "", "");
-	RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
-	parm = RNA_def_enum(func, "action", select_actions, 0, "Action", "Selection action to execute");
-	RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
 
 
 	/* -------------------------------------------------------------------- */
@@ -1092,10 +1085,10 @@ static void rna_def_manipulator(BlenderRNA *brna, PropertyRNA *cprop)
 	RNA_def_property_ui_text(prop, "Highlight", "");
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 	/* WM_MANIPULATOR_STATE_SELECT */
+	/* (note that setting is involved, needs to handle array) */
 	prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
-	RNA_def_property_boolean_funcs(prop, "rna_Manipulator_state_select_get", NULL);
+	RNA_def_property_boolean_funcs(prop, "rna_Manipulator_state_select_get", "rna_Manipulator_state_select_set");
 	RNA_def_property_ui_text(prop, "Select", "");
-	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 
 	RNA_api_manipulator(srna);
 
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
index 97d52556c9c..0d4e2866d6b 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
@@ -69,6 +69,8 @@ void WM_manipulator_free(
 
 void WM_manipulator_name_set(struct wmManipulatorGroup *mgroup, struct wmManipulator *mpr, const char *name);
 
+bool WM_manipulator_select_set(struct wmManipulatorMap *mmap, struct wmManipulator *mpr, bool select);
+
 struct PointerRNA *WM_manipulator_set_operator(
         struct wmManipulator *, struct wmOperatorType *ot, struct IDProperty *properties);
 
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index 6a637db5f46..d8e391bc31b 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -238,7 +238,7 @@ typedef struct wmManipulatorType {
 	wmManipulatorFnCursorGet cursor_get;
 
 	/* called when manipulator selection state changes */
-	wmManipulatorFnSelect select;
+	wmManipulatorFnSelectRefresh select_refresh;
 
 	/* RNA for properties */
 	struct StructRNA *srna;
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index 4246ecf93c0..e61200fa67b 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -201,7 +201,7 @@ void WM_manipulator_free(ListBase *manipulatorlist, wmManipulatorMap *mmap, wmMa
 		wm_manipulatormap_modal_set(mmap, C, NULL, NULL);
 	}
 	if (mpr->state & WM_MANIPULATOR_STATE_SELECT) {
-		wm_manipulator_deselect(mmap, mpr);
+		WM_manipulator_select_set(mmap, mpr, false);
 	}
 
 	if (mpr->op_data.ptr.data) {
@@ -386,73 +386,57 @@ void WM_manipulator_set_fn_custom_modal(struct wmManipulator *mpr, wmManipulator
 /* -------------------------------------------------------------------- */
 
 /**
- * Remove \a manipulator from selection.
+ * Add/Remove \a manipulator to selection.
  * Reallocates memory for selected manipulators so better not call for selecting multiple ones.
  *
  * \return if the selection has changed.
  */
-bool wm_manipulator_deselect(wmManipulatorMap *mmap, wmManipulator *mpr)
+bool wm_manipulator_select_set_ex(wmManipulatorMap *mmap, wmManipulator *mpr, bool select, bool use_array)
 {
-	if (!mmap->mmap_context.selected)
-		return false;
-
-	wmManipulator ***sel = &mmap->mmap_context.selected;
-	int *selected_len = &mmap->mmap_context.selected_len;
 	bool changed = false;
 
-	/* caller should check! */
-	BLI_assert(mpr->state & WM_MANIPULATOR_STATE_SELECT);
-
-	/* remove manipulator from selected_manipulators array */
-	for (int i = 0; i < (*selected_len); i++) {
-		if ((*sel)[i] == mpr) {
-			for (int j = i; j < ((*selected_len) - 1); j++) {
-				(*sel)[j] = (*sel)[j + 1];
+	if (select) {
+		if ((mpr->state & WM_MANIPULATOR_STATE_SELECT) == 0) {
+			if (use_array) {
+				wm_manipulatormap_select_array_push_back(mmap, mpr);
 			}
+			mpr->state |= WM_MANIPULATOR_STATE_SELECT;
 			changed = true;
-			break;
 		}
 	}
-
-	/* update array data */
-	if ((*selected_len) <= 1) {
-		wm_manipulatormap_selected_clear(mmap);
-	}
 	else {
-		*sel = MEM_reallocN(*sel, sizeof(**sel) * (*selected_len));
-		(*selected_len)--;
+		if (mpr->state & WM_MANIPULATOR_STATE_SELECT) {
+			if (use_array) {
+				wm_manipulatormap_select_array_remove(mmap, mpr);
+			}
+			mpr->state &= ~WM_MANIPULATOR_STATE_SELECT;
+			changed = true;
+		}
+	}
+
+	if (changed) {
+		if (mpr->type->select_refresh) {
+			mpr->type->select_refresh(mpr);
+		}
 	}
 
-	mpr->state &= ~WM_MANIPULATOR_STATE_SELECT;
 	return changed;
 }
 
-/**
- * Add \a manipulator to selection.
- * Reallocates memory for selected manipulators so better not call for selecting multiple ones.
- *
- * \return if the selection has changed.
- */
-bool wm_manipulator_select(bContext *C, wmManipulatorMap *mmap, wmManipulator *mpr)
+bool WM_manipulator_select_set(wmManipulatorMap *mmap, wmManipulator *mpr, bool select)
 {
-	wmManipulator ***sel = &mmap->mmap_context.selected;
-	int *selected_len = &mmap->mmap_context.selected_len;
+	return wm_manipulator_select_set_ex(mmap, mpr, select, true);
+}
 
-	if (!mpr || (mpr->state & WM_MANIPULATOR_STATE_SELECT))
+bool wm_manipulator_select_and_highlight(bContext *C, wmManipulatorMap *mmap, wmManipulator *mpr)
+{
+	if (WM_manipulator_select_set(mmap, mpr, true)) {
+		wm_manipulatormap_highlight_set(mmap, C, mpr, mpr->highlight_part);
+		return true;
+	}
+	else {
 		return false;
-
-	(*selected_len)++;
-
-	*sel = MEM_reallocN(*sel, sizeof(wmManipulator *) * (*selected_len));
-	(*sel)[(*selected_len) - 1] = mpr;
-
-	mpr->state |= WM_MANIPULATOR_STATE_SELECT;
-	if (mpr->type->select) {
-		mpr->type->select(C, mpr, SEL_SELECT);
 	}
-	wm_manipulatormap_highlight_set(mmap, C, mpr, mpr->highlight_part);
-
-	return true;
 }
 
 void wm_manipulator_calculate_scale(wmManipulator *mpr, const bContext *C)
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
index 0ae6698373d..5e0c7c42db2 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_group.c
@@ -226,7 +226,7 @@ static int manipulator_select_invoke(bContext *C, wmOperator *op, const wmEvent
 {
 	ARegion *ar = CTX_wm_region(C);
 	wmManipulatorMap *mmap = ar->manipulator_map;
-	wmManipulator ***sel = &mmap->mmap_context.selected;
+	wmManipulatorMapSelectState *msel = &mmap->mma

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list