[Bf-blender-cvs] [eff73afd720] soc-2017-normal-tools: Fix bad UI-related code in action callbacks of operators.

Bastien Montagne noreply at git.blender.org
Fri Oct 13 18:56:30 CEST 2017


Commit: eff73afd72081f9299ed667f322681bceb9f11d7
Author: Bastien Montagne
Date:   Fri Oct 13 18:45:54 2017 +0200
Branches: soc-2017-normal-tools
https://developer.blender.org/rBeff73afd72081f9299ed667f322681bceb9f11d7

Fix bad UI-related code in action callbacks of operators.

UI/drawing related code in action callbacks is really not nice,
especially since we do have a more consistent way to dynamically
show/hide some properties.

Note that transform_ops one remains rather hackish here (since we have
to use context for this case)... Not sure how to do it better so far.

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

M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/transform/transform.c
M	source/blender/editors/transform/transform_ops.c

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

diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 5cdd098a841..364172959a0 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -6008,15 +6008,7 @@ static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *UNUS
 
 	const bool point_away = RNA_boolean_get(op->ptr, "point_away");
 	const bool spherize = RNA_boolean_get(op->ptr, "spherize");
-	float zero[3] = { 0 };
-
-	PropertyRNA *prop = RNA_struct_find_property(op->ptr, "strength");
-	if (spherize) {
-		RNA_def_property_clear_flag(prop, PROP_HIDDEN);
-	}
-	else {
-		RNA_def_property_flag(prop, PROP_HIDDEN);
-	}
+	float zero[3] = { 0.0f };
 
 	for (int i = 0; i < ld->totloop; i++, tld++) {
 		if (spherize) {
@@ -6341,6 +6333,32 @@ static int edbm_point_normals_exec(bContext *C, wmOperator *op)
 	return OPERATOR_FINISHED;
 }
 
+static bool point_normals_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
+{
+	const char *prop_id = RNA_property_identifier(prop);
+	const bool spherize = RNA_boolean_get(ptr, "spherize");
+
+	/* Only show strength option if spherize is enabled. */
+	if (STREQ(prop_id, "strength")) {
+		return spherize;
+	}
+
+	/* Else, show it! */
+	return true;
+}
+
+static void edbm_point_normals_ui(bContext *C, wmOperator *op)
+{
+	uiLayout *layout = op->layout;
+	wmWindowManager *wm = CTX_wm_manager(C);
+	PointerRNA ptr;
+
+	RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
+
+	/* Main auto-draw call */
+	uiDefAutoButsRNA(layout, &ptr, point_normals_draw_check_prop, '\0');
+}
+
 void MESH_OT_point_normals(struct wmOperatorType *ot)
 {
 	PropertyRNA *prop;
@@ -6355,6 +6373,7 @@ void MESH_OT_point_normals(struct wmOperatorType *ot)
 	ot->invoke = edbm_point_normals_invoke;
 	ot->modal = edbm_point_normals_modal;
 	ot->poll = ED_operator_editmesh_auto_smooth;
+	ot->ui = edbm_point_normals_ui;
 
 	/* flags */
 	ot->flag = OPTYPE_BLOCKING | OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -6632,19 +6651,6 @@ static int edbm_average_loop_normals_exec(bContext *C, wmOperator *op)
 	float threshold = RNA_float_get(op->ptr, "threshold");
 	float weight = absweight / 50.0f;
 
-	if (average_type == LOOP_AVERAGE) {
-		PropertyRNA *prop = RNA_struct_find_property(op->ptr, "weight");
-		RNA_def_property_flag(prop, PROP_HIDDEN);
-		prop = RNA_struct_find_property(op->ptr, "threshold");
-		RNA_def_property_flag(prop, PROP_HIDDEN);
-	}
-	else {
-		PropertyRNA *prop = RNA_struct_find_property(op->ptr, "weight");
-		RNA_def_property_clear_flag(prop, PROP_HIDDEN);
-		prop = RNA_struct_find_property(op->ptr, "threshold");
-		RNA_def_property_clear_flag(prop, PROP_HIDDEN);
-	}
-
 	if (absweight == 100) {
 		weight = (float)SHRT_MAX;
 	}
@@ -6749,6 +6755,35 @@ static int edbm_average_loop_normals_exec(bContext *C, wmOperator *op)
 	return OPERATOR_FINISHED;
 }
 
+static bool average_loop_normals_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
+{
+	const char *prop_id = RNA_property_identifier(prop);
+	const int average_type = RNA_enum_get(ptr, "average_type");
+
+	/* Only show weight/threshold options in loop average type. */
+	if (STREQ(prop_id, "weight")) {
+		return (average_type == LOOP_AVERAGE);
+	}
+	else if (STREQ(prop_id, "threshold")) {
+		return (average_type == LOOP_AVERAGE);
+	}
+
+	/* Else, show it! */
+	return true;
+}
+
+static void edbm_average_loop_normals_ui(bContext *C, wmOperator *op)
+{
+	uiLayout *layout = op->layout;
+	wmWindowManager *wm = CTX_wm_manager(C);
+	PointerRNA ptr;
+
+	RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
+
+	/* Main auto-draw call */
+	uiDefAutoButsRNA(layout, &ptr, average_loop_normals_draw_check_prop, '\0');
+}
+
 void MESH_OT_average_loop_normals(struct wmOperatorType *ot)
 {
 	/* identifiers */
@@ -6759,6 +6794,7 @@ void MESH_OT_average_loop_normals(struct wmOperatorType *ot)
 	/* api callbacks */
 	ot->exec = edbm_average_loop_normals_exec;
 	ot->poll = ED_operator_editmesh_auto_smooth;
+	ot->ui = edbm_average_loop_normals_ui;
 
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -6797,7 +6833,7 @@ static int edbm_custom_normal_tools_exec(bContext *C, wmOperator *op)
 	BMEditMesh *em = BKE_editmesh_from_object(obedit);
 	BMesh *bm = em->bm;
 
-	int mode = RNA_enum_get(op->ptr, "mode");
+	const int mode = RNA_enum_get(op->ptr, "mode");
 	const bool absolute = RNA_boolean_get(op->ptr, "absolute");
 
 	BM_lnorspace_update(bm);
@@ -6806,17 +6842,6 @@ static int edbm_custom_normal_tools_exec(bContext *C, wmOperator *op)
 
 	float *normal_vector = scene->toolsettings->normal_vector;
 
-	PropertyRNA *prop = RNA_struct_find_property(op->ptr, "absolute");
-	if (mode == PASTE) {
-		if (!absolute) {
-			normalize_v3(normal_vector);
-		}
-		RNA_def_property_clear_flag(prop, PROP_HIDDEN);
-	}
-	else {
-		RNA_def_property_flag(prop, PROP_HIDDEN);
-	}
-
 	switch (mode) {
 		case COPY: 
 			if (bm->totfacesel != 1 && ld->totloop != 1 && bm->totvertsel != 1) {
@@ -6851,6 +6876,9 @@ static int edbm_custom_normal_tools_exec(bContext *C, wmOperator *op)
 			break;
 
 		case PASTE:
+			if (!absolute) {
+				normalize_v3(normal_vector);
+			}
 			for (int i = 0; i < ld->totloop; i++, tld++) {
 				if (absolute) {
 					float abs_normal[3];
@@ -6903,6 +6931,32 @@ static int edbm_custom_normal_tools_exec(bContext *C, wmOperator *op)
 	return OPERATOR_FINISHED;
 }
 
+static bool custom_normal_tools_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
+{
+	const char *prop_id = RNA_property_identifier(prop);
+	const int mode = RNA_enum_get(ptr, "mode");
+
+	/* Only show absolute option in paste mode. */
+	if (STREQ(prop_id, "absolute")) {
+		return (mode == PASTE);
+	}
+
+	/* Else, show it! */
+	return true;
+}
+
+static void edbm_custom_normal_tools_ui(bContext *C, wmOperator *op)
+{
+	uiLayout *layout = op->layout;
+	wmWindowManager *wm = CTX_wm_manager(C);
+	PointerRNA ptr;
+
+	RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
+
+	/* Main auto-draw call */
+	uiDefAutoButsRNA(layout, &ptr, custom_normal_tools_draw_check_prop, '\0');
+}
+
 void MESH_OT_custom_normal_tools(struct wmOperatorType *ot)
 {
 	/* identifiers */
@@ -6913,6 +6967,7 @@ void MESH_OT_custom_normal_tools(struct wmOperatorType *ot)
 	/* api callbacks */
 	ot->exec = edbm_custom_normal_tools_exec;
 	ot->poll = ED_operator_editmesh_auto_smooth;
+	ot->ui = edbm_custom_normal_tools_ui;
 
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 119bd0aa401..a9b3a5ef0c1 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -2396,19 +2396,20 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
 	if ((prop = RNA_struct_find_property(op->ptr, "preserve_clnor"))) {
 		if (t->obedit && t->obedit->type == OB_MESH && (((Mesh *)(t->obedit->data))->flag & ME_AUTOSMOOTH)) {
 			BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
-			RNA_def_property_clear_flag(prop, PROP_HIDDEN);
 			bool all_select = false;
 
+			/* Currently only used for 3 most frequent transform ops, can include more ops. */
 			if (ELEM(t->mode, TFM_TRANSLATION, TFM_ROTATION, TFM_RESIZE)) {
-				if (em->bm->totvertsel == em->bm->totvert) {	//Currently only used for 3 most frequent transform ops, can include more ops		
-					all_select = true;							//No need to invalidate if whole mesh is selected
+				if (em->bm->totvertsel == em->bm->totvert) {
+					/* No need to invalidate if whole mesh is selected. */
+					all_select = true;
 				}
 			}
 			if (t->flag & T_MODAL) {
-				RNA_boolean_set(op->ptr, "preserve_clnor", false);
+				RNA_property_boolean_set(op->ptr, prop, false);
 			}
 			if (!all_select) {
-				const bool preserve_clnor = RNA_boolean_get(op->ptr, "preserve_clnor");
+				const bool preserve_clnor = RNA_property_boolean_get(op->ptr, prop);
 				if (preserve_clnor) {
 					BM_lnorspace_update(em->bm);
 					t->flag |= T_CLNOR_REBUILD;
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index bfc2b372458..e307059b69f 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -498,6 +498,35 @@ static int transform_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 	}
 }
 
+static bool transform_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
+{
+	const char *prop_id = RNA_property_identifier(prop);
+
+	/* Only show preserve_clnor option if requested (kinda hackish, we need to take that decision based on context... */
+	if (STREQ(prop_id, "preserve_clnor")) {
+		return RNA_boolean_get(ptr, "show_preserve_clnor");;
+	}
+
+	/* Else, show it! */
+	return true;
+}
+
+static void transform_ui(bContext *C, wmOperator *op)
+{
+	uiLayout *layout = op->layout;
+	wmWindowManager *wm = CTX_wm_manager(C);
+	PointerRNA ptr;
+	Object *obedit = CTX_data_edit_object(C);
+
+	RNA_boolean_set(op->ptr, "show_preserve_clnor",
+	                (obedit && obedit->type == OB_MESH && (((Mesh *)(obedit->data))->flag & ME_AUTOSMOOTH)));
+
+	RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
+
+	/* Main auto-draw call */
+	uiDefAutoButsRNA(layout, &ptr, transform_draw_check_prop, '\0');
+}
+
 void Transform_Properties(struct wmOperatorType *ot, int flags)
 {
 	PropertyRNA *prop;
@@ -586,8 +615,9 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
 	}
 
 	if (flags & P_CLNOR_INVALIDATE) {
-		prop = RNA_def_boolean(ot->srna, "preserve_clnor", 0, "Keep custom normal", "Keep custom normal during transform");
-		RNA_def_property_flag(prop, PROP_HIDDEN);
+		RNA_def_boolean(ot->srna, "preserve_clnor", false, "Preserve Normals", "Keep custom normals during transform");
+		prop = RNA_def_boolean(ot->srna, "show_preserve_clnor", false, "Show Preserve Normals", "");
+		RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
 	}
 }
 
@@ -605,6 +635,7 @@ static void TRANSFORM_OT_translate(struct wmOperatorType *ot)
 	ot->modal  = transform_modal;
 	ot->cancel = transform_cancel;
 	ot->poll   = ED_operator_screenactive;
+	ot->ui  

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list