Alter snap modifier so that it turns the grid on when it's off as well as vice-versa.
authorCarl Hetherington <carl@carlh.net>
Mon, 24 Aug 2009 20:26:34 +0000 (20:26 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 24 Aug 2009 20:26:34 +0000 (20:26 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@5584 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor.cc
gtk2_ardour/editor.h
gtk2_ardour/editor_drag.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/keyboard.h
gtk2_ardour/rc_option_editor.cc

index ec351be787e33bfab7c7502ab148e2d64977d78c..c262a763f2e4d35679f633718b7a794c5a101d0b 100644 (file)
@@ -2515,6 +2515,29 @@ Editor::trackview_by_y_position (double y)
        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)
 {
index 08a4c2996e156f03777b1c783636e2ffa7ecbaec..3cadb9d4ad2d34f5270a3bcd325f1cd3376861cc 100644 (file)
@@ -1489,6 +1489,7 @@ public:
        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);
index 8654cacdd81fc0313fa8eafdb3d35089f1740250..73296af8640edd0024860e3a3c2ebbb309f8e390 100644 (file)
@@ -159,9 +159,7 @@ Drag::adjusted_current_frame (GdkEvent* event) const
                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;
 }
@@ -423,12 +421,7 @@ RegionMotionDrag::compute_x_delta (GdkEvent const * event, nframes64_t* pending_
                        
                        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);
                        
@@ -1503,9 +1496,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
                left_direction = false;
        }
 
-       if (obey_snap) {
-               _editor->snap_to (_current_pointer_frame);
-       }
+       _editor->snap_to_with_modifier (_current_pointer_frame, event);
 
        if (first_move) {
 
@@ -1846,7 +1837,7 @@ CursorDrag::start_grab (GdkEvent* event, Gdk::Cursor* c)
                
                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);
 
        }
@@ -2499,8 +2490,8 @@ ControlPointDrag::motion (GdkEvent* event, bool)
        //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());
@@ -2648,11 +2639,11 @@ RubberbandSelectDrag::motion (GdkEvent* event, bool first_move)
                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 */
@@ -2750,9 +2741,7 @@ TimeFXDrag::motion (GdkEvent* event, bool)
 {
        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;
@@ -3102,9 +3091,7 @@ RangeMarkerBarDrag::motion (GdkEvent* event, bool first_move)
                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.
@@ -3272,12 +3259,10 @@ MouseZoomDrag::motion (GdkEvent* event, bool first_move)
        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) {
index 41d14c4f1eb89797b8e70580c4ed959f736500c4..4f85f2084663dc68505e3b54ce5e6145c1a0fcce 100644 (file)
@@ -1181,9 +1181,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 
                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;
@@ -1191,18 +1189,14 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                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;
@@ -2222,9 +2216,7 @@ Editor::point_trim (GdkEvent* event)
 
        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) {
index 29052993348cebf7f35e41765bf8d685943a5350..cff45b11f200ffbf1e47bbcb76209a2bb6e61bcf 100644 (file)
@@ -90,6 +90,11 @@ class Keyboard : public sigc::trackable, PBD::Stateful
        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; }
index 662387ef1c9563c0583c7071ae8ae57a751a5298..06908ca0c1a1d39e5778a2a7c14063f553e70d3e 100644 (file)
@@ -595,7 +595,7 @@ public:
                        }
                }
 
-               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);