return std::make_pair ( (TimeAxisView *) 0, 0);
}
+/** Snap a position to the grid, if appropriate, taking into account current
+ * grid settings and also the state of any snap modifier keys that may be pressed.
+ * @param start Position to snap.
+ * @param event Event to get current key modifier information from.
+ */
+void
+Editor::snap_to_with_modifier (nframes64_t& start, GdkEvent const * event, int32_t direction, bool for_mark)
+{
+ if (!session) {
+ return;
+ }
+
+ if (Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
+ if (snap_mode == SnapOff) {
+ snap_to_internal (start, direction, for_mark);
+ }
+ } else {
+ if (snap_mode != SnapOff) {
+ snap_to_internal (start, direction, for_mark);
+ }
+ }
+}
+
void
Editor::snap_to (nframes64_t& start, int32_t direction, bool for_mark)
{
void redisplay_tempo (bool immediate_redraw);
void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
+ void snap_to_with_modifier (nframes64_t& first, GdkEvent const *, int32_t direction = 0, bool for_mark = false);
void snap_to (nframes64_t& first, nframes64_t& last, int32_t direction = 0, bool for_mark = false);
double snap_length_beats (nframes64_t start);
pos = _current_pointer_frame - _pointer_frame_offset;
}
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
- _editor->snap_to (pos);
- }
+ _editor->snap_to_with_modifier (pos, event);
return pos;
}
sync_frame = *pending_region_position + (sync_dir*sync_offset);
- /* we snap if the snap modifier is not enabled.
- */
-
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
- _editor->snap_to (sync_frame);
- }
+ _editor->snap_to_with_modifier (sync_frame, event);
*pending_region_position = _primary->region()->adjust_to_sync (sync_frame);
left_direction = false;
}
- if (obey_snap) {
- _editor->snap_to (_current_pointer_frame);
- }
+ _editor->snap_to_with_modifier (_current_pointer_frame, event);
if (first_move) {
nframes64_t where = _editor->event_frame (event, 0, 0);
- _editor->snap_to (where);
+ _editor->snap_to_with_modifier (where, event);
_editor->playhead_cursor->set_position (where);
}
//translate cx to frames
nframes64_t cx_frames = _editor->unit_to_frame (cx);
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier()) && !_x_constrained) {
- _editor->snap_to (cx_frames);
+ if (!_x_constrained) {
+ _editor->snap_to_with_modifier (cx_frames, event);
}
float const fraction = 1.0 - (cy / _point->line().height());
return;
}
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier()) && Config->get_rubberbanding_snaps_to_grid()) {
+ if (Config->get_rubberbanding_snaps_to_grid()) {
if (first_move) {
- _editor->snap_to (_grab_frame);
+ _editor->snap_to_with_modifier (_grab_frame, event);
}
- _editor->snap_to (_current_pointer_frame);
+ _editor->snap_to_with_modifier (_current_pointer_frame, event);
}
/* base start and end on initial click position */
{
RegionView* rv = _primary;
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
- _editor->snap_to (_current_pointer_frame);
- }
+ _editor->snap_to_with_modifier (_current_pointer_frame, event);
if (_current_pointer_frame == _last_pointer_frame) {
return;
break;
}
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
- _editor->snap_to (_current_pointer_frame);
- }
+ _editor->snap_to_with_modifier (_current_pointer_frame, event);
/* only alter selection if the current frame is
different from the last frame position.
nframes64_t start;
nframes64_t end;
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
- _editor->snap_to (_current_pointer_frame);
-
- if (first_move) {
- _editor->snap_to (_grab_frame);
- }
+ _editor->snap_to_with_modifier (_current_pointer_frame, event);
+
+ if (first_move) {
+ _editor->snap_to_with_modifier (_grab_frame, event);
}
if (_current_pointer_frame == _last_pointer_frame) {
case MarkerBarItem:
if (!_dragging_playhead) {
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
- snap_to (where, 0, true);
- }
+ snap_to_with_modifier (where, event, 0, true);
mouse_add_new_marker (where);
}
return true;
case CdMarkerBarItem:
if (!_dragging_playhead) {
// if we get here then a dragged range wasn't done
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
- snap_to (where, 0, true);
- }
+ snap_to_with_modifier (where, event, 0, true);
mouse_add_new_marker (where, true);
}
return true;
case TempoBarItem:
if (!_dragging_playhead) {
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
- snap_to (where);
- }
+ snap_to_with_modifier (where, event);
mouse_add_new_tempo_event (where);
}
return true;
nframes64_t new_bound = _drag->current_pointer_frame();
- if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) {
- snap_to (new_bound);
- }
+ snap_to_with_modifier (new_bound, event);
/* Choose action dependant on which button was pressed */
switch (event->button.button) {
static bool no_modifiers_active (guint state);
static void set_snap_modifier (guint);
+
+ /** @return Modifier mask to temporarily toggle grid setting; with this modifier
+ * - magnetic or normal grid should become no grid and
+ * - no grid should become normal grid
+ */
static ModifierMask snap_modifier () { return ModifierMask (snap_mod); }
static guint edit_button() { return edit_but; }
}
}
- l = manage (new Label (_("Ignore snap using:")));
+ l = manage (new Label (_("Toggle snap using:")));
l->set_name ("OptionsLabel");
l->set_alignment (1.0, 0.5);