diff options
author | Germano Cavalcante <mano-wii> | 2022-03-11 00:33:04 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2022-03-11 00:47:38 +0300 |
commit | e3de755ae31503284277681b52947c02aef5d411 (patch) | |
tree | 481eb60ba38e1a2fe3522501e162cb599c5468f6 /source/blender/editors/transform | |
parent | edcb2ad7b3a07f9cd09243cc5fbf5e563e853964 (diff) |
Transform/UI: individualize the option to use snap per editor type
`3DView`'s `use_snap` option has little or nothing to do with using
snapping in `UV`, `Nodes` or `Sequencer`.
So there are no real advantages to keeping these options in sync.
Therefore, individualize the option to use snap for each "spacetype".
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D13310
Diffstat (limited to 'source/blender/editors/transform')
-rw-r--r-- | source/blender/editors/transform/transform.c | 36 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.h | 3 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_snap.c | 43 |
3 files changed, 60 insertions, 22 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index bb80109d8c9..92d312cebce 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1513,14 +1513,42 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op) if (t->flag & T_MODAL) { /* do we check for parameter? */ if (transformModeUseSnap(t)) { - if (!(t->modifiers & MOD_SNAP) != !(ts->snap_flag & SCE_SNAP)) { + if (!(t->modifiers & MOD_SNAP) != !(t->tsnap.flag & SCE_SNAP)) { + char *snap_flag_ptr; + + wmMsgParams_RNA msg_key_params = {{0}}; + RNA_pointer_create(&t->scene->id, &RNA_ToolSettings, ts, &msg_key_params.ptr); + + _WM_MESSAGE_EXTERN_BEGIN; + extern PropertyRNA rna_ToolSettings_use_snap; + extern PropertyRNA rna_ToolSettings_use_snap_node; + extern PropertyRNA rna_ToolSettings_use_snap_sequencer; + extern PropertyRNA rna_ToolSettings_use_snap_uv; + _WM_MESSAGE_EXTERN_END; + if (t->spacetype == SPACE_NODE) { + snap_flag_ptr = &ts->snap_flag_node; + msg_key_params.prop = &rna_ToolSettings_use_snap_node; + } + else if (t->spacetype == SPACE_IMAGE) { + snap_flag_ptr = &ts->snap_uv_flag; + msg_key_params.prop = &rna_ToolSettings_use_snap_uv; + } + else if (t->spacetype == SPACE_SEQ) { + snap_flag_ptr = &ts->snap_flag_seq; + msg_key_params.prop = &rna_ToolSettings_use_snap_sequencer; + } + else { + snap_flag_ptr = &ts->snap_flag; + msg_key_params.prop = &rna_ToolSettings_use_snap; + } + if (t->modifiers & MOD_SNAP) { - ts->snap_flag |= SCE_SNAP; + *snap_flag_ptr |= SCE_SNAP; } else { - ts->snap_flag &= ~SCE_SNAP; + *snap_flag_ptr &= ~SCE_SNAP; } - WM_msg_publish_rna_prop(t->mbus, &t->scene->id, ts, ToolSettings, use_snap); + WM_msg_publish_rna_params(t->mbus, &msg_key_params); } } } diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 21592032af2..713cf487ac7 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -295,7 +295,8 @@ typedef struct TransSnapPoint { } TransSnapPoint; typedef struct TransSnap { - short mode; + char flag; + char mode; short target; short modePoint; short modeSelect; diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 2f3c021ba38..7ace6343985 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -561,7 +561,22 @@ static bool bm_face_is_snap_target(BMFace *f, void *UNUSED(user_data)) return true; } -static short snap_mode_from_scene(TransInfo *t) +static char snap_flag_from_spacetype(TransInfo *t) +{ + ToolSettings *ts = t->settings; + if (t->spacetype == SPACE_NODE) { + return ts->snap_flag_node; + } + else if (t->spacetype == SPACE_IMAGE) { + return ts->snap_uv_flag; + } + else if (t->spacetype == SPACE_SEQ) { + return ts->snap_flag_seq; + } + return ts->snap_flag; +} + +static short snap_mode_from_spacetype(TransInfo *t) { ToolSettings *ts = t->settings; short r_snap_mode = SCE_SNAP_MODE_INCREMENT; @@ -580,7 +595,7 @@ static short snap_mode_from_scene(TransInfo *t) else if (t->spacetype == SPACE_SEQ) { r_snap_mode = SEQ_tool_settings_snap_mode_get(t->scene); } - else if (ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE) && !(t->options & CTX_CAMERA)) { + else if ((t->spacetype == SPACE_VIEW3D) && !(t->options & CTX_CAMERA)) { /* All obedit types will match. */ const int obedit_type = t->obedit_type; if ((t->options & (CTX_GPENCIL_STROKES | CTX_CURSOR | CTX_OBMODE_XFORM_OBDATA)) || @@ -652,7 +667,7 @@ static short snap_select_type_get(TransInfo *t) static void initSnappingMode(TransInfo *t) { ToolSettings *ts = t->settings; - t->tsnap.mode = snap_mode_from_scene(t); + t->tsnap.mode = snap_mode_from_spacetype(t); t->tsnap.modeSelect = snap_select_type_get(t); if ((t->spacetype != SPACE_VIEW3D) || !(ts->snap_mode & SCE_SNAP_MODE_FACE)) { @@ -701,10 +716,9 @@ static void initSnappingMode(TransInfo *t) void initSnapping(TransInfo *t, wmOperator *op) { - ToolSettings *ts = t->settings; - short snap_target = t->settings->snap_target; - resetSnapping(t); + t->tsnap.flag = snap_flag_from_spacetype(t); + short snap_target = t->settings->snap_target; /* if snap property exists */ PropertyRNA *prop; @@ -745,19 +759,14 @@ void initSnapping(TransInfo *t, wmOperator *op) } /* use scene defaults only when transform is modal */ else if (t->flag & T_MODAL) { - if (ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE, SPACE_NODE)) { - if (transformModeUseSnap(t) && (ts->snap_flag & SCE_SNAP)) { - t->modifiers |= MOD_SNAP; - } - - t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) != 0); - t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) != 0); - t->tsnap.snap_self = !((t->settings->snap_flag & SCE_SNAP_NO_SELF) != 0); - t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) != 0); - } - else if ((t->spacetype == SPACE_SEQ) && (ts->snap_flag & SCE_SNAP_SEQ)) { + if (transformModeUseSnap(t) && (t->tsnap.flag & SCE_SNAP)) { t->modifiers |= MOD_SNAP; } + + t->tsnap.align = ((t->tsnap.flag & SCE_SNAP_ROTATE) != 0); + t->tsnap.project = ((t->tsnap.flag & SCE_SNAP_PROJECT) != 0); + t->tsnap.snap_self = !((t->tsnap.flag & SCE_SNAP_NO_SELF) != 0); + t->tsnap.peel = ((t->tsnap.flag & SCE_SNAP_PROJECT) != 0); } t->tsnap.target = snap_target; |