[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