Fix #121266: Snap toggle in UI not updating during transform

During transform operations, the 'Snap Toggle' shortcut
(default: Shift + Tab) enables or disables snapping.

Previously, the UI did not reflect the toggle state until the operation
was finished.

It now updates live during the operation.
This commit is contained in:
Germano Cavalcante
2025-07-15 16:51:30 -03:00
parent eed8683234
commit bda79fe4c3

View File

@@ -1028,6 +1028,23 @@ static bool transform_event_modal_constraint(TransInfo *t, short modal_type)
return true;
}
static void tool_settings_update_snap_toggle(TransInfo *t)
{
bool is_snap_enabled = (t->modifiers & MOD_SNAP) != 0;
/* Type is #eSnapFlag, but type must match various snap attributes in #ToolSettings. */
short *snap_flag_ptr;
wmMsgParams_RNA msg_key_params = {{}};
msg_key_params.ptr = RNA_pointer_create_discrete(&t->scene->id, &RNA_ToolSettings, t->settings);
if ((snap_flag_ptr = transform_snap_flag_from_spacetype_ptr(t, &msg_key_params.prop)) &&
(is_snap_enabled != bool(*snap_flag_ptr & SCE_SNAP)))
{
SET_FLAG_FROM_TEST(*snap_flag_ptr, is_snap_enabled, SCE_SNAP);
WM_msg_publish_rna_params(t->mbus, &msg_key_params);
}
}
wmOperatorStatus transformEvent(TransInfo *t, wmOperator *op, const wmEvent *event)
{
bool is_navigating = t->vod ? ((RegionView3D *)t->region->regiondata)->rflag & RV3D_NAVIGATING :
@@ -1174,6 +1191,7 @@ wmOperatorStatus transformEvent(TransInfo *t, wmOperator *op, const wmEvent *eve
case TFM_MODAL_SNAP_TOGGLE:
t->modifiers ^= MOD_SNAP;
transform_snap_flag_from_modifiers_set(t);
tool_settings_update_snap_toggle(t);
t->redraw |= TREDRAW_HARD;
break;
case TFM_MODAL_AXIS_X:
@@ -1775,7 +1793,6 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
/* Save snapping settings. */
if ((prop = RNA_struct_find_property(op->ptr, "snap"))) {
bool is_snap_enabled = (t->modifiers & MOD_SNAP) != 0;
/* Update the snap toggle in `ToolSettings`. */
if (
@@ -1788,19 +1805,10 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
/* Skip updating the snap toggle if snapping was enabled via operator properties. */
!RNA_property_is_set(op->ptr, prop))
{
/* Type is #eSnapFlag, but type must match various snap attributes in #ToolSettings. */
short *snap_flag_ptr;
wmMsgParams_RNA msg_key_params = {{}};
msg_key_params.ptr = RNA_pointer_create_discrete(&t->scene->id, &RNA_ToolSettings, ts);
if ((snap_flag_ptr = transform_snap_flag_from_spacetype_ptr(t, &msg_key_params.prop)) &&
(is_snap_enabled != bool(*snap_flag_ptr & SCE_SNAP)))
{
SET_FLAG_FROM_TEST(*snap_flag_ptr, is_snap_enabled, SCE_SNAP);
WM_msg_publish_rna_params(t->mbus, &msg_key_params);
}
tool_settings_update_snap_toggle(t);
}
bool is_snap_enabled = (t->modifiers & MOD_SNAP) != 0;
RNA_property_boolean_set(op->ptr, prop, is_snap_enabled);
if ((prop = RNA_struct_find_property(op->ptr, "snap_elements"))) {