more changes flowing from a persistent MonitorSection object
[ardour.git] / gtk2_ardour / editor_drag.cc
index aad17789725408640e9066d36d9b2da87a690e63..0b6b1e34b328b90d82af22acd1256730e7457060 100644 (file)
@@ -293,16 +293,9 @@ Drag::start_grab (GdkEvent* event, Gdk::Cursor *cursor)
                _was_rolling = false;
        }
 
-       switch (_editor->snap_type()) {
-       case SnapToRegionStart:
-       case SnapToRegionEnd:
-       case SnapToRegionSync:
-       case SnapToRegionBoundary:
-               _editor->build_region_boundary_cache ();
-               break;
-       default:
-               break;
-       }
+//     if ( UIConfiguration::instance().get_snap_to_region_start() || UIConfiguration::instance().get_snap_to_region_end() || UIConfiguration::instance().get_snap_to_region_sync() ) {
+//             _editor->build_region_boundary_cache ();
+//     }
 }
 
 /** Call to end a drag `successfully'.  Ungrabs item and calls
@@ -388,7 +381,7 @@ Drag::setup_snap_delta (MusicSample pos)
 {
        TempoMap& map (_editor->session()->tempo_map());
        MusicSample snap (pos);
-       _editor->snap_to (snap, ARDOUR::RoundNearest, false, true);
+       _editor->snap_to (snap, ARDOUR::RoundNearest, ARDOUR::SnapToAny_Visual, true);
        _snap_delta = snap.sample - pos.sample;
 
        _snap_delta_music = 0.0;
@@ -719,6 +712,8 @@ RegionMotionDrag::compute_x_delta (GdkEvent const * event, MusicSample* pending_
                }
        }
 
+       _editor->set_snapped_cursor_position(pending_region_position->sample);
+
        return dx;
 }
 
@@ -1433,6 +1428,10 @@ RegionMoveDrag::finished (GdkEvent* ev, bool movement_occurred)
 RouteTimeAxisView*
 RegionMoveDrag::create_destination_time_axis (boost::shared_ptr<Region> region, TimeAxisView* original)
 {
+       if (!ARDOUR_UI_UTILS::engine_is_running ()) {
+               return NULL;
+       }
+
        /* Add a new track of the correct type, and return the RouteTimeAxisView that is created to display the
           new track.
         */
@@ -2873,7 +2872,6 @@ void
 TrimDrag::start_grab (GdkEvent* event, Gdk::Cursor*)
 {
        TimeAxisView* tvp = &_primary->get_time_axis_view ();
-       RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
 
        samplepos_t const region_start = _primary->region()->position();
        samplepos_t const region_end = _primary->region()->last_sample();
@@ -2935,7 +2933,6 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
        RegionView* rv = _primary;
 
        TimeAxisView* tvp = &_primary->get_time_axis_view ();
-       RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
        pair<set<boost::shared_ptr<Playlist> >::iterator,bool> insert_result;
        sampleoffset_t sample_delta = 0;
 
@@ -3231,7 +3228,7 @@ TrimDrag::setup_pointer_sample_offset ()
 MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c)
        : Drag (e, i)
        , _copy (c)
-       , _old_snap_type (e->snap_type())
+       , _old_grid_type (e->grid_type())
        , _old_snap_mode (e->snap_mode())
        , before_state (0)
 {
@@ -3304,14 +3301,14 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
                }
                /* only snap to bars. leave snap mode alone for audio locked meters.*/
                if (_real_section->position_lock_style() != AudioTime) {
-                       _editor->set_snap_to (SnapToBar);
-                       _editor->set_snap_mode (SnapNormal);
+                       _editor->set_grid_to (GridTypeBar);
+                       _editor->set_snap_mode (SnapMagnetic);
                }
        }
 
        samplepos_t pf = adjusted_current_sample (event);
 
-       if (_real_section->position_lock_style() == AudioTime && _editor->snap_musical()) {
+       if (_real_section->position_lock_style() == AudioTime && _editor->grid_musical()) {
                /* never snap to music for audio locked */
                pf = adjusted_current_sample (event, false);
        }
@@ -3322,6 +3319,7 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
        _marker->set_position (adjusted_current_sample (event, false));
 
        show_verbose_cursor_time (_real_section->sample());
+       _editor->set_snapped_cursor_position(_real_section->sample());
 }
 
 void
@@ -3335,7 +3333,7 @@ MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
        }
 
        /* reinstate old snap setting */
-       _editor->set_snap_to (_old_snap_type);
+       _editor->set_grid_to (_old_grid_type);
        _editor->set_snap_mode (_old_snap_mode);
 
        TempoMap& map (_editor->session()->tempo_map());
@@ -3355,7 +3353,7 @@ MeterMarkerDrag::aborted (bool moved)
        _marker->set_position (_marker->meter().sample ());
        if (moved) {
                /* reinstate old snap setting */
-               _editor->set_snap_to (_old_snap_type);
+               _editor->set_grid_to (_old_grid_type);
                _editor->set_snap_mode (_old_snap_mode);
 
                _editor->session()->tempo_map().set_state (*before_state, Stateful::current_state_version);
@@ -3472,7 +3470,7 @@ TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
        } else if (_movable && !_real_section->locked_to_meter()) {
                samplepos_t pf;
 
-               if (_editor->snap_musical()) {
+               if (_editor->grid_musical()) {
                        /* we can't snap to a grid that we are about to move.
                         * gui_move_tempo() will sort out snap using the supplied beat divisions.
                        */
@@ -3487,6 +3485,7 @@ TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
                map.gui_set_tempo_position (_real_section, pf, sub_num);
 
                show_verbose_cursor_time (_real_section->sample());
+               _editor->set_snapped_cursor_position(_real_section->sample());
        }
        _marker->set_position (adjusted_current_sample (event, false));
 }
@@ -3605,7 +3604,7 @@ BBTRulerDrag::motion (GdkEvent* event, bool first_move)
        TempoMap& map (_editor->session()->tempo_map());
        samplepos_t pf;
 
-       if (_editor->snap_musical()) {
+       if (_editor->grid_musical()) {
                pf = adjusted_current_sample (event, false);
        } else {
                pf = adjusted_current_sample (event);
@@ -3753,7 +3752,7 @@ TempoTwistDrag::motion (GdkEvent* event, bool first_move)
 
        samplepos_t pf;
 
-       if (_editor->snap_musical()) {
+       if (_editor->grid_musical()) {
                pf = adjusted_current_sample (event, false);
        } else {
                pf = adjusted_current_sample (event);
@@ -4611,6 +4610,7 @@ MarkerDrag::motion (GdkEvent* event, bool)
        assert (!_copied_locations.empty());
 
        show_verbose_cursor_time (newframe);
+       _editor->set_snapped_cursor_position(newframe);
 }
 
 void
@@ -5096,7 +5096,7 @@ RubberbandSelectDrag::motion (GdkEvent* event, bool)
        MusicSample grab (grab_sample (), 0);
 
        if (UIConfiguration::instance().get_rubberbanding_snaps_to_grid ()) {
-               _editor->snap_to_with_modifier (grab, event);
+               _editor->snap_to_with_modifier (grab, event, RoundNearest, SnapToGrid_Scaled);
        } else {
                grab.sample = raw_grab_sample ();
        }
@@ -5679,12 +5679,16 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred)
 
                /* XXX what if its a music time selection? */
                if (s) {
-                       if (s->get_play_range() && s->transport_rolling()) {
-                               s->request_play_range (&_editor->selection->time, true);
-                       } else if (!s->config.get_external_sync()) {
-                               if (UIConfiguration::instance().get_follow_edits() && !s->transport_rolling()) {
-                                       s->request_locate (_editor->get_selection().time.start());
+
+                       //if Follow Edits is on, maybe try to follow the range selection  ... also consider range-audition mode
+                       if ( !s->config.get_external_sync() && s->transport_rolling() ) {
+                               if ( s->solo_selection_active() ) {
+                                       _editor->play_solo_selection(true);  //play the newly selected range, and move solos to match
+                               } else if ( UIConfiguration::instance().get_follow_edits() && s->get_play_range() ) {  //already rolling a selected range
+                                       s->request_play_range (&_editor->selection->time, true);  //play the newly selected range
                                }
+                       } else if ( !s->transport_rolling() && UIConfiguration::instance().get_follow_edits() ) {
+                               s->request_locate (_editor->get_selection().time.start());
                        }
 
                        if (_editor->get_selection().time.length() != 0) {
@@ -6075,7 +6079,7 @@ NoteDrag::total_dx (GdkEvent * event) const
 
        /* possibly snap and return corresponding delta in quarter notes */
        MusicSample snap (st, 0);
-       _editor->snap_to_with_modifier (snap, event);
+       _editor->snap_to_with_modifier (snap, event, RoundNearest, SnapToGrid_Unscaled);
        double ret = map.exact_qn_at_sample (snap.sample, snap.division) - n_qn - snap_delta_music (event->button.state);
 
        /* prevent the earliest note being dragged earlier than the region's start position */
@@ -6146,6 +6150,8 @@ NoteDrag::motion (GdkEvent * event, bool first_move)
                        uint8_t new_note = min (max (_primary->note()->note() + note_delta, 0), 127);
 
                        _region->show_verbose_cursor_for_new_note_value (_primary->note(), new_note);
+
+                       _editor->set_snapped_cursor_position( _region->source_beats_to_absolute_samples(_primary->note()->time()) );
                }
        }
 }
@@ -6646,8 +6652,8 @@ samplecnt_t
 NoteCreateDrag::grid_samples (samplepos_t t) const
 {
 
-       const Evoral::Beats grid_beats = _region_view->get_grid_beats (t);
-       const Evoral::Beats t_beats = _region_view->region_samples_to_region_beats (t);
+       const Temporal::Beats grid_beats = _region_view->get_grid_beats (t);
+       const Temporal::Beats t_beats = _region_view->region_samples_to_region_beats (t);
 
        return _region_view->region_beats_to_region_samples (t_beats + grid_beats)
                - _region_view->region_beats_to_region_samples (t_beats);
@@ -6664,7 +6670,7 @@ NoteCreateDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
        const samplepos_t pf = _drags->current_pointer_sample ();
        const int32_t divisions = _editor->get_grid_music_divisions (event->button.state);
 
-       const Evoral::Beats grid_beats = _region_view->get_grid_beats (pf);
+       const Temporal::Beats grid_beats = _region_view->get_grid_beats (pf);
 
        double eqaf = map.exact_qn_at_sample (pf, divisions);
 
@@ -6706,7 +6712,7 @@ NoteCreateDrag::motion (GdkEvent* event, bool)
 
        if (divisions != 0) {
 
-               const Evoral::Beats grid_beats = _region_view->get_grid_beats (pf);
+               const Temporal::Beats grid_beats = _region_view->get_grid_beats (pf);
 
                const double qaf = map.quarter_note_at_sample (pf);
                /* Hack so that we always snap to the note that we are over, instead of snapping
@@ -6743,7 +6749,7 @@ NoteCreateDrag::finished (GdkEvent* ev, bool had_movement)
 
        TempoMap& map (_editor->session()->tempo_map());
        const double qn_length = map.quarter_notes_between_samples (start_sess_rel, start_sess_rel + length);
-       Evoral::Beats qn_length_beats = max (Evoral::Beats::ticks(1), Evoral::Beats (qn_length));
+       Temporal::Beats qn_length_beats = max (Temporal::Beats::ticks(1), Temporal::Beats (qn_length));
 
        _editor->begin_reversible_command (_("Create Note"));
        _region_view->clear_editor_note_selection();
@@ -6798,7 +6804,7 @@ HitCreateDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
        }
 
        const samplepos_t start = map.sample_at_quarter_note (eqaf) - _region_view->region()->position();
-       Evoral::Beats length = _region_view->get_grid_beats (pf);
+       Temporal::Beats length = _region_view->get_grid_beats (pf);
 
        _editor->begin_reversible_command (_("Create Hit"));
        _region_view->clear_editor_note_selection();
@@ -6826,7 +6832,7 @@ HitCreateDrag::motion (GdkEvent* event, bool)
                return;
        }
 
-       Evoral::Beats length = _region_view->get_grid_beats (pf);
+       Temporal::Beats length = _region_view->get_grid_beats (pf);
 
        boost::shared_ptr<MidiRegion> mr = _region_view->midi_region();
 
@@ -6958,16 +6964,11 @@ CrossfadeEdgeDrag::aborted (bool)
 
 RegionCutDrag::RegionCutDrag (Editor* e, ArdourCanvas::Item* item, samplepos_t pos)
        : Drag (e, item, true)
-       , line (new EditorCursor (*e))
 {
-       line->set_position (pos);
-       line->show ();
-       line->track_canvas_item().reparent (_editor->_drag_motion_group);
 }
 
 RegionCutDrag::~RegionCutDrag ()
 {
-       delete line;
 }
 
 void
@@ -6980,10 +6981,6 @@ RegionCutDrag::start_grab (GdkEvent* event, Gdk::Cursor* c)
 void
 RegionCutDrag::motion (GdkEvent* event, bool)
 {
-       MusicSample pos (_drags->current_pointer_sample(), 0);
-       _editor->snap_to_with_modifier (pos, event);
-
-       line->set_position (pos.sample);
 }
 
 void
@@ -6994,7 +6991,6 @@ RegionCutDrag::finished (GdkEvent* event, bool)
 
        MusicSample pos (_drags->current_pointer_sample(), 0);
        _editor->snap_to_with_modifier (pos, event);
-       line->hide ();
 
        RegionSelection rs = _editor->get_regions_from_selection_and_mouse (pos.sample);
 
@@ -7002,7 +6998,7 @@ RegionCutDrag::finished (GdkEvent* event, bool)
                return;
        }
 
-       _editor->split_regions_at (pos, rs, false);
+       _editor->split_regions_at (pos, rs);
 }
 
 void