Fix related to T67385: disallow some modifiers ops from Edit mode.

Some modifier operators cannot be reliably executed from Edit mode
currently, so disable them from the generic mod ops pool function.

Have been very conservative here from now, keeping existing behavior
most of the time, and only forbidding Edit mode when code was already
doing it in its own way, or when it was obviously not possible.
This commit is contained in:
Bastien Montagne 2019-07-28 16:07:15 +02:00
parent 3e45f01494
commit 1c40227bfa
3 changed files with 24 additions and 14 deletions

View File

@ -760,7 +760,7 @@ void OBJECT_OT_data_transfer(wmOperatorType *ot)
static bool datalayout_transfer_poll(bContext *C)
{
return (edit_modifier_poll_generic(C, &RNA_DataTransferModifier, (1 << OB_MESH)) ||
return (edit_modifier_poll_generic(C, &RNA_DataTransferModifier, (1 << OB_MESH), true) ||
data_transfer_poll(C));
}

View File

@ -137,7 +137,10 @@ void COLLECTION_OT_objects_add_active(struct wmOperatorType *ot);
void COLLECTION_OT_objects_remove_active(struct wmOperatorType *ot);
/* object_modifier.c */
bool edit_modifier_poll_generic(struct bContext *C, struct StructRNA *rna_type, int obtype_flag);
bool edit_modifier_poll_generic(struct bContext *C,
struct StructRNA *rna_type,
int obtype_flag,
const bool is_editmode_allowed);
bool edit_modifier_poll(struct bContext *C);
void edit_modifier_properties(struct wmOperatorType *ot);
int edit_modifier_invoke_properties(struct bContext *C, struct wmOperator *op);

View File

@ -912,7 +912,10 @@ void OBJECT_OT_modifier_add(wmOperatorType *ot)
/********** generic functions for operators using mod names and data context *********************/
bool edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obtype_flag)
bool edit_modifier_poll_generic(bContext *C,
StructRNA *rna_type,
int obtype_flag,
const bool is_editmode_allowed)
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "modifier", rna_type);
Object *ob = (ptr.id.data) ? ptr.id.data : ED_object_active_context(C);
@ -932,12 +935,17 @@ bool edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obtype_fla
return (((ModifierData *)ptr.data)->flag & eModifierFlag_OverrideLibrary_Local) != 0;
}
if (!is_editmode_allowed && CTX_data_edit_object(C) != NULL) {
CTX_wm_operator_poll_msg_set(C, "This modifier operation is not allowed from Edit mode");
return 0;
}
return 1;
}
bool edit_modifier_poll(bContext *C)
{
return edit_modifier_poll_generic(C, &RNA_Modifier, 0);
return edit_modifier_poll_generic(C, &RNA_Modifier, 0, true);
}
void edit_modifier_properties(wmOperatorType *ot)
@ -1274,7 +1282,7 @@ void OBJECT_OT_modifier_copy(wmOperatorType *ot)
static bool multires_poll(bContext *C)
{
return edit_modifier_poll_generic(C, &RNA_MultiresModifier, (1 << OB_MESH));
return edit_modifier_poll_generic(C, &RNA_MultiresModifier, (1 << OB_MESH), true);
}
static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op)
@ -1627,14 +1635,13 @@ static void modifier_skin_customdata_delete(Object *ob)
static bool skin_poll(bContext *C)
{
return (!CTX_data_edit_object(C) &&
edit_modifier_poll_generic(C, &RNA_SkinModifier, (1 << OB_MESH)));
return (edit_modifier_poll_generic(C, &RNA_SkinModifier, (1 << OB_MESH), false));
}
static bool skin_edit_poll(bContext *C)
{
return (CTX_data_edit_object(C) &&
edit_modifier_poll_generic(C, &RNA_SkinModifier, (1 << OB_MESH)));
edit_modifier_poll_generic(C, &RNA_SkinModifier, (1 << OB_MESH), true));
}
static void skin_root_clear(BMVert *bm_vert, GSet *visited, const int cd_vert_skin_offset)
@ -1987,7 +1994,7 @@ void OBJECT_OT_skin_armature_create(wmOperatorType *ot)
static bool correctivesmooth_poll(bContext *C)
{
return edit_modifier_poll_generic(C, &RNA_CorrectiveSmoothModifier, 0);
return edit_modifier_poll_generic(C, &RNA_CorrectiveSmoothModifier, 0, true);
}
static int correctivesmooth_bind_exec(bContext *C, wmOperator *op)
@ -2065,7 +2072,7 @@ void OBJECT_OT_correctivesmooth_bind(wmOperatorType *ot)
static bool meshdeform_poll(bContext *C)
{
return edit_modifier_poll_generic(C, &RNA_MeshDeformModifier, 0);
return edit_modifier_poll_generic(C, &RNA_MeshDeformModifier, 0, true);
}
static int meshdeform_bind_exec(bContext *C, wmOperator *op)
@ -2138,7 +2145,7 @@ void OBJECT_OT_meshdeform_bind(wmOperatorType *ot)
static bool explode_poll(bContext *C)
{
return edit_modifier_poll_generic(C, &RNA_ExplodeModifier, 0);
return edit_modifier_poll_generic(C, &RNA_ExplodeModifier, 0, true);
}
static int explode_refresh_exec(bContext *C, wmOperator *op)
@ -2188,7 +2195,7 @@ void OBJECT_OT_explode_refresh(wmOperatorType *ot)
static bool ocean_bake_poll(bContext *C)
{
return edit_modifier_poll_generic(C, &RNA_OceanModifier, 0);
return edit_modifier_poll_generic(C, &RNA_OceanModifier, 0, true);
}
typedef struct OceanBakeJob {
@ -2389,7 +2396,7 @@ void OBJECT_OT_ocean_bake(wmOperatorType *ot)
static bool laplaciandeform_poll(bContext *C)
{
return edit_modifier_poll_generic(C, &RNA_LaplacianDeformModifier, 0);
return edit_modifier_poll_generic(C, &RNA_LaplacianDeformModifier, 0, false);
}
static int laplaciandeform_bind_exec(bContext *C, wmOperator *op)
@ -2464,7 +2471,7 @@ void OBJECT_OT_laplaciandeform_bind(wmOperatorType *ot)
static bool surfacedeform_bind_poll(bContext *C)
{
return edit_modifier_poll_generic(C, &RNA_SurfaceDeformModifier, 0);
return edit_modifier_poll_generic(C, &RNA_SurfaceDeformModifier, 0, true);
}
static int surfacedeform_bind_exec(bContext *C, wmOperator *op)