add to LUA API (new Stripable API)
[ardour.git] / gtk2_ardour / editor_ops.cc
index 05118c2319899b3fbda6ac193ded62a9c375f055..f7bd882260d309da105bba37430cb23c818d0745 100644 (file)
@@ -799,17 +799,6 @@ Editor::build_region_boundary_cache ()
                                break;
                        }
 
-                       float speed = 1.0f;
-                       RouteTimeAxisView *rtav;
-
-                       if (ontrack != 0 && (rtav = dynamic_cast<RouteTimeAxisView*>(ontrack)) != 0 ) {
-                               if (rtav->track() != 0) {
-                                       speed = rtav->track()->speed();
-                               }
-                       }
-
-                       rpos = track_frame_to_session_frame (rpos, speed);
-
                        if (rpos < lpos) {
                                lpos = rpos;
                        }
@@ -847,7 +836,6 @@ Editor::find_next_region (framepos_t frame, RegionPoint point, int32_t dir, Trac
        boost::shared_ptr<Region> ret;
        framepos_t rpos = 0;
 
-       float track_speed;
        framepos_t track_frame;
        RouteTimeAxisView *rtav;
 
@@ -856,13 +844,7 @@ Editor::find_next_region (framepos_t frame, RegionPoint point, int32_t dir, Trac
                framecnt_t distance;
                boost::shared_ptr<Region> r;
 
-               track_speed = 1.0f;
-               if ( (rtav = dynamic_cast<RouteTimeAxisView*>(*i)) != 0 ) {
-                       if (rtav->track()!=0)
-                               track_speed = rtav->track()->speed();
-               }
-
-               track_frame = session_frame_to_track_frame(frame, track_speed);
+               track_frame = frame;
 
                if ((r = (*i)->find_next_region (track_frame, point, dir)) == 0) {
                        continue;
@@ -882,9 +864,6 @@ Editor::find_next_region (framepos_t frame, RegionPoint point, int32_t dir, Trac
                        break;
                }
 
-               // rpos is a "track frame", converting it to "_session frame"
-               rpos = track_frame_to_session_frame(rpos, track_speed);
-
                if (rpos > frame) {
                        distance = rpos - frame;
                } else {
@@ -1052,17 +1031,6 @@ Editor::cursor_to_region_point (EditorCursor* cursor, RegionPoint point, int32_t
                break;
        }
 
-       float speed = 1.0f;
-       RouteTimeAxisView *rtav;
-
-       if ( ontrack != 0 && (rtav = dynamic_cast<RouteTimeAxisView*>(ontrack)) != 0 ) {
-               if (rtav->track() != 0) {
-                       speed = rtav->track()->speed();
-               }
-       }
-
-       pos = track_frame_to_session_frame(pos, speed);
-
        if (cursor == playhead_cursor) {
                _session->request_locate (pos);
        } else {
@@ -1243,17 +1211,6 @@ Editor::selected_marker_to_region_point (RegionPoint point, int32_t dir)
                break;
        }
 
-       float speed = 1.0f;
-       RouteTimeAxisView *rtav;
-
-       if (ontrack != 0 && (rtav = dynamic_cast<RouteTimeAxisView*>(ontrack)) != 0) {
-               if (rtav->track() != 0) {
-                       speed = rtav->track()->speed();
-               }
-       }
-
-       pos = track_frame_to_session_frame(pos, speed);
-
        loc->move_to (pos, 0);
 }
 
@@ -1789,49 +1746,12 @@ Editor::temporal_zoom_step_scale (bool zoom_out, double scale)
                }
        }
 
-       // ToDo:   encapsulate all of this into something like editor::get_session_extents() or editor::leftmost(), rightmost()
-       {
-               //ToDo: also incorporate automation regions (in case the session has no audio/midi but is just used for automating plugins or the like)
-
-               //calculate the extents of all regions in every playlist
-               framecnt_t session_extent_start = 0;
-               framecnt_t session_extent_end = 0;
-               {
-                       boost::shared_ptr<RouteList> rl = _session->get_routes();
-                       for (RouteList::iterator r = rl->begin(); r != rl->end(); ++r) {
-                               boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*r);
-                               if (tr) {
-                                       boost::shared_ptr<Playlist> pl = tr->playlist();
-                                       if (pl) {
-                                               pair<framepos_t, framepos_t> e;
-                                               e = pl->get_extent();
-                                               if (e.first < session_extent_start) {
-                                                       session_extent_start = e.first;
-                                               }
-                                               if (e.second > session_extent_end) {
-                                                       session_extent_end = e.second;
-                                               }
-                                       }
-                               }
-                       }
-               }
-               framecnt_t session_extents = session_extent_end - session_extent_start;
-
-               //in a session with no regions, use the start/end markers to set max zoom
-               framecnt_t const session_length = _session->current_end_frame() - _session->current_start_frame ();
-               if ( session_length > session_extents )
-                       session_extents = session_length;
-
-               //in a session with no regions or start/end markers, use 2 minutes to set max zoom
-               framecnt_t const min_length = _session->nominal_frame_rate()*60*2;
-               if ( min_length > session_extents )
-                       session_extents = min_length;
-
-               //convert to samples-per-pixel and limit our zoom to this value
-               framecnt_t session_extents_pp = session_extents / _visible_canvas_width;
-               if (nspp > session_extents_pp)
-                       nspp = session_extents_pp;
-       }
+       //zoom-behavior-tweaks
+       //limit our maximum zoom to the session gui extents value
+       std::pair<framepos_t, framepos_t> ext = session_gui_extents();
+       framecnt_t session_extents_pp = ( ext.second - ext.first )  / _visible_canvas_width;
+       if (nspp > session_extents_pp)
+               nspp = session_extents_pp;
 
        temporal_zoom (nspp);
 }
@@ -2095,6 +2015,39 @@ Editor::temporal_zoom_session ()
        }
 }
 
+void
+Editor::temporal_zoom_extents ()
+{
+       ENSURE_GUI_THREAD (*this, &Editor::temporal_zoom_extents)
+
+       if (_session) {
+               std::pair<framepos_t, framepos_t> ext = session_gui_extents( false );  //in this case we want to zoom to the extents explicitly; ignore the users prefs for extra padding
+
+               framecnt_t start = ext.first;
+               framecnt_t end = ext.second;
+
+               if (_session->actively_recording () ) {
+                       framepos_t cur = playhead_cursor->current_frame ();
+                       if (cur > end) {
+                               /* recording beyond the end marker; zoom out
+                                * by 5 seconds more so that if 'follow
+                                * playhead' is active we don't immediately
+                                * scroll.
+                                */
+                               end = cur + _session->frame_rate() * 5;
+                       }
+               }
+
+               if ((start == 0 && end == 0) || end < start) {
+                       return;
+               }
+
+               calc_extra_zoom_edges(start, end);
+
+               temporal_zoom_by_frame (start, end);
+       }
+}
+
 void
 Editor::temporal_zoom_by_frame (framepos_t start, framepos_t end)
 {
@@ -3093,7 +3046,7 @@ Editor::split_multichannel_region ()
        vector< boost::shared_ptr<Region> > v;
 
        for (list<RegionView*>::iterator x = rs.begin(); x != rs.end(); ++x) {
-               (*x)->region()->separate_by_channel (*_session, v);
+               (*x)->region()->separate_by_channel (v);
        }
 }
 
@@ -3188,8 +3141,6 @@ Editor::separate_regions_between (const TimeSelection& ts)
 
                        /* XXX need to consider musical time selections here at some point */
 
-                       double speed = rtv->track()->speed();
-
                        for (list<AudioRange>::const_iterator t = ts.begin(); t != ts.end(); ++t) {
 
                                sigc::connection c = rtv->view()->RegionViewAdded.connect (
@@ -3197,8 +3148,7 @@ Editor::separate_regions_between (const TimeSelection& ts)
 
                                latest_regionviews.clear ();
 
-                               playlist->partition ((framepos_t)((*t).start * speed),
-                                                    (framepos_t)((*t).end * speed), false);
+                               playlist->partition ((*t).start, (*t).end, false);
 
                                c.disconnect ();
 
@@ -3843,16 +3793,11 @@ Editor::trim_region_to_location (const Location& loc, const char* str)
                        return;
                }
 
-               float speed = 1.0;
                framepos_t start;
                framepos_t end;
 
-               if (tav->track() != 0) {
-                       speed = tav->track()->speed();
-               }
-
-               start = session_frame_to_track_frame (loc.start(), speed);
-               end = session_frame_to_track_frame (loc.end(), speed);
+               start = loc.start();
+               end = loc.end();
 
                rv->region()->clear_changes ();
                rv->region()->trim_to (start, (end - start));
@@ -3903,13 +3848,6 @@ Editor::trim_to_region(bool forward)
                        continue;
                }
 
-               float speed = 1.0;
-
-               if (atav->track() != 0) {
-                       speed = atav->track()->speed();
-               }
-
-
                boost::shared_ptr<Region> region = arv->region();
                boost::shared_ptr<Playlist> playlist (region->playlist());
 
@@ -3923,19 +3861,18 @@ Editor::trim_to_region(bool forward)
                                continue;
                        }
 
-                       region->trim_end((framepos_t) ( (next_region->first_frame() - 1) * speed));
-                       arv->region_changed (PropertyChange (ARDOUR::Properties::length));
+                   region->trim_end (next_region->first_frame() - 1);
+                   arv->region_changed (PropertyChange (ARDOUR::Properties::length));
                }
                else {
 
                        next_region = playlist->find_next_region (region->first_frame(), Start, 0);
 
-                       if(!next_region){
+                       if (!next_region) {
                                continue;
                        }
 
-                       region->trim_front((framepos_t) ((next_region->last_frame() + 1) * speed));
-
+                       region->trim_front (next_region->last_frame() + 1);
                        arv->region_changed (ARDOUR::bounds_change);
                }
 
@@ -5428,6 +5365,7 @@ Editor::apply_midi_note_edit_op (MidiOperator& op, const RegionSelection& rs)
 
        if (in_command) {
                commit_reversible_command ();
+               _session->set_dirty ();
        }
 }
 
@@ -5956,7 +5894,7 @@ Editor::toggle_mute ()
 {
        bool new_state = false;
        bool first = true;
-       StripableList sl;
+       boost::shared_ptr<ControlList> cl (new ControlList);
 
        for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
                StripableTimeAxisView *stav = dynamic_cast<StripableTimeAxisView *>(*i);
@@ -5970,10 +5908,10 @@ Editor::toggle_mute ()
                        first = false;
                }
 
-               sl.push_back (stav->stripable());
+               cl->push_back (stav->stripable()->mute_control());
        }
 
-       _session->set_controls (stripable_list_to_control_list (sl, &Stripable::mute_control), new_state, Controllable::UseGroup);
+       _session->set_controls (cl, new_state, Controllable::UseGroup);
 }
 
 void