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
This commit is contained in:
parent
edcb2ad7b3
commit
e3de755ae3
Notes:
blender-bot
2023-02-14 07:40:56 +01:00
Referenced by issue #95662, Grabbing Keyframes in Graph Editor Disables Snapping in Viewport
|
@ -1224,7 +1224,7 @@ def km_uv_editor(params):
|
|||
("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
|
||||
("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
|
||||
("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("data_path", 'tool_settings.use_snap')]}),
|
||||
{"properties": [("data_path", 'tool_settings.use_snap_uv')]}),
|
||||
("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
{"properties": [("data_path", 'tool_settings.snap_uv_element')]}),
|
||||
*_template_items_context_menu("IMAGE_MT_uvs_context_menu", params.context_menu_event),
|
||||
|
@ -2089,7 +2089,7 @@ def km_node_editor(params):
|
|||
{"type": params.select_mouse, "value": 'CLICK_DRAG', "alt": True},
|
||||
{"properties": [("TRANSFORM_OT_translate", [("view2d_edge_pan", True)])]}),
|
||||
("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("data_path", 'tool_settings.use_snap')]}),
|
||||
{"properties": [("data_path", 'tool_settings.use_snap_node')]}),
|
||||
("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
{"properties": [("data_path", 'tool_settings.snap_node_element')]}),
|
||||
("wm.context_toggle", {"type": 'Z', "value": 'PRESS', "alt": True, "shift": True},
|
||||
|
|
|
@ -1152,7 +1152,7 @@ def km_node_editor(params):
|
|||
("node.move_detach_links_release", {"type": params.action_mouse, "value": 'CLICK_DRAG', "alt": True}, None),
|
||||
("node.move_detach_links", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "alt": True}, None),
|
||||
("wm.context_toggle", {"type": 'X', "value": 'PRESS'},
|
||||
{"properties": [("data_path", 'tool_settings.use_snap')]}),
|
||||
{"properties": [("data_path", 'tool_settings.use_snap_node')]}),
|
||||
])
|
||||
|
||||
return keymap
|
||||
|
|
|
@ -724,7 +724,7 @@ class IMAGE_HT_header(Header):
|
|||
act_snap_uv_element = tool_settings.bl_rna.properties['snap_uv_element'].enum_items[snap_uv_element]
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.prop(tool_settings, "use_snap", text="")
|
||||
row.prop(tool_settings, "use_snap_uv", text="")
|
||||
|
||||
sub = row.row(align=True)
|
||||
sub.popover(
|
||||
|
|
|
@ -185,7 +185,7 @@ class NODE_HT_header(Header):
|
|||
|
||||
# Snap
|
||||
row = layout.row(align=True)
|
||||
row.prop(tool_settings, "use_snap", text="")
|
||||
row.prop(tool_settings, "use_snap_node", text="")
|
||||
row.prop(tool_settings, "snap_node_element", icon_only=True)
|
||||
if tool_settings.snap_node_element != 'GRID':
|
||||
row.prop(tool_settings, "snap_target", text="")
|
||||
|
|
|
@ -1481,6 +1481,10 @@ static void version_liboverride_rnacollections_insertion_animdata(ID *id)
|
|||
/* NOLINTNEXTLINE: readability-function-size */
|
||||
void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
||||
{
|
||||
/* The #SCE_SNAP_SEQ flag has been removed in favor of the #SCE_SNAP which can be used for each
|
||||
* snap_flag member individually. */
|
||||
const int SCE_SNAP_SEQ = (1 << 7);
|
||||
|
||||
if (!MAIN_VERSION_ATLEAST(bmain, 300, 1)) {
|
||||
/* Set default value for the new bisect_threshold parameter in the mirror modifier. */
|
||||
if (!DNA_struct_elem_find(fd->filesdna, "MirrorModifierData", "float", "bisect_threshold")) {
|
||||
|
@ -2585,5 +2589,16 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
|||
ts->uv_relax_method = UV_SCULPT_TOOL_RELAX_LAPLACIAN;
|
||||
}
|
||||
}
|
||||
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
|
||||
ToolSettings *tool_settings = scene->toolsettings;
|
||||
tool_settings->snap_flag_seq = tool_settings->snap_flag & ~(SCE_SNAP | SCE_SNAP_SEQ);
|
||||
if (tool_settings->snap_flag & SCE_SNAP_SEQ) {
|
||||
tool_settings->snap_flag_seq |= SCE_SNAP;
|
||||
tool_settings->snap_flag &= ~SCE_SNAP_SEQ;
|
||||
}
|
||||
|
||||
tool_settings->snap_flag_node = tool_settings->snap_flag;
|
||||
tool_settings->snap_uv_flag |= tool_settings->snap_flag & SCE_SNAP;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -233,7 +233,7 @@ static bool use_sequencer_snapping(bContext *C)
|
|||
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
short snap_flag = SEQ_tool_settings_snap_flag_get(scene);
|
||||
return (scene->toolsettings->snap_flag & SCE_SNAP_SEQ) &&
|
||||
return (scene->toolsettings->snap_flag_seq & SCE_SNAP) &&
|
||||
(snap_flag & SEQ_SNAP_CURRENT_FRAME_TO_STRIPS);
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
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 {
|
||||
ts->snap_flag &= ~SCE_SNAP;
|
||||
snap_flag_ptr = &ts->snap_flag;
|
||||
msg_key_params.prop = &rna_ToolSettings_use_snap;
|
||||
}
|
||||
WM_msg_publish_rna_prop(t->mbus, &t->scene->id, ts, ToolSettings, use_snap);
|
||||
|
||||
if (t->modifiers & MOD_SNAP) {
|
||||
*snap_flag_ptr |= SCE_SNAP;
|
||||
}
|
||||
else {
|
||||
*snap_flag_ptr &= ~SCE_SNAP;
|
||||
}
|
||||
WM_msg_publish_rna_params(t->mbus, &msg_key_params);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -295,7 +295,8 @@ typedef struct TransSnapPoint {
|
|||
} TransSnapPoint;
|
||||
|
||||
typedef struct TransSnap {
|
||||
short mode;
|
||||
char flag;
|
||||
char mode;
|
||||
short target;
|
||||
short modePoint;
|
||||
short modeSelect;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1469,13 +1469,18 @@ typedef struct ToolSettings {
|
|||
/* Transform */
|
||||
char transform_pivot_point;
|
||||
char transform_flag;
|
||||
/** Snap elements (per spacetype). */
|
||||
char snap_mode;
|
||||
char snap_node_mode;
|
||||
char snap_uv_mode;
|
||||
/** Generic flags (per spacetype). */
|
||||
char snap_flag;
|
||||
/** UV equivalent of `snap_flag`, limited to: #SCE_SNAP_ABS_GRID. */
|
||||
char snap_flag_node;
|
||||
char snap_flag_seq;
|
||||
char snap_uv_flag;
|
||||
/** Default snap source. */
|
||||
char snap_target;
|
||||
/** Snap mask for transform modes. */
|
||||
char snap_transform_mode_flag;
|
||||
|
||||
char proportional_edit, prop_mode;
|
||||
|
@ -1505,16 +1510,14 @@ typedef struct ToolSettings {
|
|||
char gpencil_selectmode_vertex;
|
||||
|
||||
/* UV painting */
|
||||
char _pad2[1];
|
||||
char uv_sculpt_settings;
|
||||
char uv_relax_method;
|
||||
/* XXX: these sculpt_paint_* fields are deprecated, use the
|
||||
* unified_paint_settings field instead! */
|
||||
short sculpt_paint_settings DNA_DEPRECATED;
|
||||
|
||||
char workspace_tool_type;
|
||||
|
||||
char _pad5[1];
|
||||
/* XXX: these sculpt_paint_* fields are deprecated, use the
|
||||
* unified_paint_settings field instead! */
|
||||
short sculpt_paint_settings DNA_DEPRECATED;
|
||||
int sculpt_paint_unified_size DNA_DEPRECATED;
|
||||
float sculpt_paint_unified_unprojected_radius DNA_DEPRECATED;
|
||||
float sculpt_paint_unified_alpha DNA_DEPRECATED;
|
||||
|
@ -2055,7 +2058,6 @@ enum {
|
|||
#define SCE_SNAP_NO_SELF (1 << 4)
|
||||
#define SCE_SNAP_ABS_GRID (1 << 5)
|
||||
#define SCE_SNAP_BACKFACE_CULLING (1 << 6)
|
||||
#define SCE_SNAP_SEQ (1 << 7)
|
||||
|
||||
/** #ToolSettings.snap_target */
|
||||
#define SCE_SNAP_TARGET_CLOSEST 0
|
||||
|
|
|
@ -3149,6 +3149,25 @@ static void rna_def_tool_settings(BlenderRNA *brna)
|
|||
RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1);
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
|
||||
|
||||
prop = RNA_def_property(srna, "use_snap_node", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag_node", SCE_SNAP);
|
||||
RNA_def_property_ui_text(prop, "Snap", "Snap Node during transform");
|
||||
RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1);
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
|
||||
|
||||
prop = RNA_def_property(srna, "use_snap_sequencer", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag_seq", SCE_SNAP);
|
||||
RNA_def_property_ui_text(prop, "Use Snapping", "Snap to strip edges or current frame");
|
||||
RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1);
|
||||
RNA_def_property_boolean_default(prop, true);
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* Publish message-bus. */
|
||||
|
||||
prop = RNA_def_property(srna, "use_snap_uv", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "snap_uv_flag", SCE_SNAP);
|
||||
RNA_def_property_ui_text(prop, "Snap", "Snap UV during transform");
|
||||
RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1);
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
|
||||
|
||||
prop = RNA_def_property(srna, "use_snap_align_rotation", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_ROTATE);
|
||||
RNA_def_property_ui_text(
|
||||
|
@ -3163,13 +3182,6 @@ static void rna_def_tool_settings(BlenderRNA *brna)
|
|||
"Absolute grid alignment while translating (based on the pivot center)");
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
|
||||
|
||||
prop = RNA_def_property(srna, "use_snap_sequencer", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_SEQ);
|
||||
RNA_def_property_ui_text(prop, "Use Snapping", "Snap to strip edges or current frame");
|
||||
RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1);
|
||||
RNA_def_property_boolean_default(prop, true);
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* Publish message-bus. */
|
||||
|
||||
prop = RNA_def_property(srna, "snap_elements", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_bitflag_sdna(prop, NULL, "snap_mode");
|
||||
RNA_def_property_enum_items(prop, rna_enum_snap_element_items);
|
||||
|
|
Loading…
Reference in New Issue