Fix (unreported) broken handling of constraints reordering with liboverride.

New drag&drop reordering code would call constraints reordering operator
with the generic context, and not the one from the panel's layout.
missing the "constraint" member which is mandatory for poll function to
properly deal with override vs. local constraints.

This commit fixes it by generating a temp bContextStore in the panel
re-ordering callback.

NOTE: this fix will have to be extended to modifiers (which happen to
work currently because they have an 'active' status), and gpencil
modifiers (which are also broken currently).

Differential Revision: https://developer.blender.org/D13291
This commit is contained in:
Bastien Montagne 2021-11-19 17:56:42 +01:00
parent 1b2ee3cf20
commit 6eaa69c66c
Notes: blender-bot 2023-02-14 05:51:15 +01:00
Referenced by commit 0b246ed813, Revert "Fix (unreported) broken handling of constraints reordering with liboverride."
1 changed files with 15 additions and 0 deletions

View File

@ -2036,6 +2036,15 @@ static void constraint_reorder(bContext *C, Panel *panel, int new_index)
PointerRNA *con_ptr = UI_panel_custom_data_get(panel);
bConstraint *con = (bConstraint *)con_ptr->data;
/* Ensure called operator does have a context with the expected "constraint" member. */
ListBase contexts = {NULL};
bContextStore *previous_context_store = CTX_store_get(C);
if (previous_context_store != NULL) {
BLI_addtail(&contexts, previous_context_store);
}
bContextStore *constraint_context_store = CTX_store_add(&contexts, "constraint", con_ptr);
CTX_store_set(C, constraint_context_store);
PointerRNA props_ptr;
wmOperatorType *ot = WM_operatortype_find("CONSTRAINT_OT_move_to_index", false);
WM_operator_properties_create_ptr(&props_ptr, ot);
@ -2045,6 +2054,12 @@ static void constraint_reorder(bContext *C, Panel *panel, int new_index)
RNA_enum_set(&props_ptr, "owner", constraint_from_bone ? 1 : 0);
WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &props_ptr);
WM_operator_properties_free(&props_ptr);
/* Cleanup modified context. */
CTX_store_set(C, previous_context_store);
if (previous_context_store != constraint_context_store) {
CTX_store_free(constraint_context_store);
}
}
/**