add to LUA API (new Stripable API)
[ardour.git] / gtk2_ardour / editor_drag.cc
index b65c0825ef79f3f5ef3cb4f8ed9d619f19d37417..9b5838aaadfde2998a807cc4ac9fa84025fa463a 100644 (file)
@@ -1967,13 +1967,7 @@ RegionMoveDrag::RegionMoveDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p,
 {
        DEBUG_TRACE (DEBUG::Drags, "New RegionMoveDrag\n");
 
-       double speed = 1;
-       RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (&_primary->get_time_axis_view ());
-       if (rtv && rtv->is_track()) {
-               speed = rtv->track()->speed ();
-       }
-
-       _last_position = MusicFrame (static_cast<framepos_t> (_primary->region()->position() / speed), 0);
+       _last_position = MusicFrame (_primary->region()->position(), 0);
 }
 
 void
@@ -2878,17 +2872,12 @@ TrimDrag::TrimDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<Region
 void
 TrimDrag::start_grab (GdkEvent* event, Gdk::Cursor*)
 {
-       double speed = 1.0;
        TimeAxisView* tvp = &_primary->get_time_axis_view ();
        RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
 
-       if (tv && tv->is_track()) {
-               speed = tv->track()->speed();
-       }
-
-       framepos_t const region_start = (framepos_t) (_primary->region()->position() / speed);
-       framepos_t const region_end = (framepos_t) (_primary->region()->last_frame() / speed);
-       framecnt_t const region_length = (framecnt_t) (_primary->region()->length() / speed);
+       framepos_t const region_start = _primary->region()->position();
+       framepos_t const region_end = _primary->region()->last_frame();
+       framecnt_t const region_length = _primary->region()->length();
 
        framepos_t const pf = adjusted_current_frame (event);
        setup_snap_delta (MusicFrame(region_start, 0));
@@ -2945,15 +2934,11 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 {
        RegionView* rv = _primary;
 
-       double speed = 1.0;
        TimeAxisView* tvp = &_primary->get_time_axis_view ();
        RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
        pair<set<boost::shared_ptr<Playlist> >::iterator,bool> insert_result;
        frameoffset_t frame_delta = 0;
 
-       if (tv && tv->is_track()) {
-               speed = tv->track()->speed();
-       }
        MusicFrame adj_frame = adjusted_frame (_drags->current_pointer_frame () + snap_delta (event->button.state), event, true);
        framecnt_t dt = adj_frame.frame - raw_grab_frame () + _pointer_frame_offset - snap_delta (event->button.state);
 
@@ -3106,10 +3091,10 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 
        switch (_operation) {
        case StartTrim:
-               show_verbose_cursor_time ((framepos_t) (rv->region()->position() / speed));
+               show_verbose_cursor_time (rv->region()->position());
                break;
        case EndTrim:
-               show_verbose_cursor_duration ((framepos_t)  rv->region()->position() / speed, (framepos_t) rv->region()->last_frame() / speed);
+               show_verbose_cursor_duration (rv->region()->position(), rv->region()->last_frame());
                break;
        case ContentsTrim:
                // show_verbose_cursor_time (frame_delta);
@@ -3308,10 +3293,9 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
                        } else {
                                --bbt.bars;
                        }
-                       const double beat = map.beat_at_bbt (bbt);
-                       const framepos_t frame = map.frame_at_beat (beat);
+                       const framepos_t frame = map.frame_at_bbt (bbt);
                        _real_section = map.add_meter (Meter (_marker->meter().divisions_per_bar(), _marker->meter().note_divisor())
-                                                      , beat, bbt, frame, _real_section->position_lock_style());
+                                                      , bbt, frame, _real_section->position_lock_style());
                        if (!_real_section) {
                                aborted (true);
                                return;
@@ -3629,7 +3613,7 @@ BBTRulerDrag::motion (GdkEvent* event, bool first_move)
 
        if (ArdourKeyboard::indicates_constraint (event->button.state)) {
                /* adjust previous tempo to match pointer frame */
-               _editor->session()->tempo_map().gui_stretch_tempo (_tempo, map.frame_at_quarter_note (_grab_qn), pf);
+               _editor->session()->tempo_map().gui_stretch_tempo (_tempo, map.frame_at_quarter_note (_grab_qn), pf, _grab_qn, map.quarter_note_at_frame (pf));
        }
 
        ostringstream sstr;
@@ -3701,6 +3685,11 @@ TempoTwistDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
        _before_state = &map.get_state();
        _tempo = const_cast<TempoSection*> (&map.tempo_section_at_frame (raw_grab_frame()));
 
+       if (_tempo->locked_to_meter()) {
+               _drag_valid = false;
+               return;
+       }
+
        _next_tempo = map.next_tempo_section (_tempo);
        if (_next_tempo) {
                if (!map.next_tempo_section (_next_tempo)) {
@@ -3784,8 +3773,6 @@ TempoTwistDrag::motion (GdkEvent* event, bool first_move)
 void
 TempoTwistDrag::finished (GdkEvent* event, bool movement_occurred)
 {
-       TempoMap& map (_editor->session()->tempo_map());
-
        if (!movement_occurred || !_drag_valid) {
                return;
        }
@@ -3793,6 +3780,7 @@ TempoTwistDrag::finished (GdkEvent* event, bool movement_occurred)
        _editor->tempo_curve_selected (_tempo, false);
        _editor->tempo_curve_selected (_next_tempo, false);
 
+       TempoMap& map (_editor->session()->tempo_map());
        XMLNode &after = map.get_state();
        _editor->session()->add_command(new MementoCommand<TempoMap>(map, _before_state, &after));
        _editor->commit_reversible_command ();
@@ -3811,6 +3799,7 @@ TempoEndDrag::TempoEndDrag (Editor* e, ArdourCanvas::Item* i)
        , _grab_qn (0.0)
        , _tempo (0)
        , _before_state (0)
+       , _drag_valid (true)
 {
        DEBUG_TRACE (DEBUG::Drags, "New TempoEndDrag\n");
        TempoMarker* marker = reinterpret_cast<TempoMarker*> (_item->get_data ("marker"));
@@ -3827,6 +3816,10 @@ TempoEndDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
        /* get current state */
        _before_state = &tmap.get_state();
 
+       if (_tempo->locked_to_meter()) {
+               _drag_valid = false;
+               return;
+       }
 
        ostringstream sstr;
 
@@ -3856,14 +3849,16 @@ TempoEndDrag::setup_pointer_frame_offset ()
 void
 TempoEndDrag::motion (GdkEvent* event, bool first_move)
 {
+       if (!_drag_valid) {
+               return;
+       }
+
        TempoMap& map (_editor->session()->tempo_map());
 
        if (first_move) {
                _editor->begin_reversible_command (_("stretch end tempo"));
        }
 
-
-
        framepos_t const pf = adjusted_current_frame (event, false);
        map.gui_stretch_tempo_end (&map.tempo_section_at_frame (_tempo->frame() - 1), map.frame_at_quarter_note (_grab_qn), pf);
 
@@ -3880,7 +3875,7 @@ TempoEndDrag::motion (GdkEvent* event, bool first_move)
 void
 TempoEndDrag::finished (GdkEvent* event, bool movement_occurred)
 {
-       if (!movement_occurred) {
+       if (!movement_occurred || !_drag_valid) {
                return;
        }