enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / gtk2_ardour / editor_ops.cc
index 960b7b3123fda7dfa71346de68bf1cc84ff1e679..c83e96d67f15a269d77d3d561e7227c30e31d830 100644 (file)
 #include "transform_dialog.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -151,7 +151,7 @@ Editor::redo (uint32_t n)
 }
 
 void
-Editor::split_regions_at (framepos_t where, RegionSelection& regions)
+Editor::split_regions_at (framepos_t where, RegionSelection& regions, const int32_t sub_num)
 {
        bool frozen = false;
 
@@ -226,7 +226,7 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions)
 
                if (pl) {
                        pl->clear_changes ();
-                       pl->split_region ((*a)->region(), where);
+                       pl->split_region ((*a)->region(), where, sub_num);
                        _session->add_command (new StatefulDiffCommand (pl));
                }
 
@@ -433,6 +433,9 @@ Editor::nudge_forward (bool next, bool force_playhead)
                                        } else {
                                                loc->set_end (max_framepos);
                                        }
+                                       if (loc->is_session_range()) {
+                                               _session->set_end_is_free (false);
+                                       }
                                }
                                if (!in_command) {
                                        begin_reversible_command (_("nudge location forward"));
@@ -524,6 +527,9 @@ Editor::nudge_backward (bool next, bool force_playhead)
                                        } else {
                                                loc->set_end (loc->length());
                                        }
+                                       if (loc->is_session_range()) {
+                                               _session->set_end_is_free (false);
+                                       }
                                }
                                if (!in_command) {
                                        begin_reversible_command (_("nudge location forward"));
@@ -2233,6 +2239,8 @@ Editor::set_session_end_from_playhead ()
 
                commit_reversible_command ();
        }
+
+       _session->set_end_is_free (false);
 }
 
 void
@@ -2574,7 +2582,7 @@ Editor::play_from_edit_point_and_return ()
 void
 Editor::play_selection ()
 {
-       framepos_t start, end;
+       framepos_t start, end;
        if (!get_selection_extents ( start, end))
                return;
 
@@ -3043,62 +3051,63 @@ Editor::separate_regions_between (const TimeSelection& ts)
 
        for (TrackSelection::iterator i = tmptracks.begin(); i != tmptracks.end(); ++i) {
 
-               RouteTimeAxisView* rtv;
-
-               if ((rtv = dynamic_cast<RouteTimeAxisView*> ((*i))) != 0) {
+               RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> ((*i));
 
-                       if (rtv->is_track()) {
+               if (!rtv) {
+                       continue;
+               }
 
-                               /* no edits to destructive tracks */
+               if (!rtv->is_track()) {
+                       continue;
+               }
 
-                               if (rtv->track()->destructive()) {
-                                       continue;
-                               }
+               /* no edits to destructive tracks */
 
-                               if ((playlist = rtv->playlist()) != 0) {
+               if (rtv->track()->destructive()) {
+                       continue;
+               }
 
-                                       playlist->clear_changes ();
+               if ((playlist = rtv->playlist()) != 0) {
 
-                                       /* XXX need to consider musical time selections here at some point */
+                       playlist->clear_changes ();
 
-                                       double speed = rtv->track()->speed();
+                       /* 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) {
+                       for (list<AudioRange>::const_iterator t = ts.begin(); t != ts.end(); ++t) {
 
-                                               sigc::connection c = rtv->view()->RegionViewAdded.connect (
-                                                               sigc::mem_fun(*this, &Editor::collect_new_region_view));
+                               sigc::connection c = rtv->view()->RegionViewAdded.connect (
+                                       sigc::mem_fun(*this, &Editor::collect_new_region_view));
 
-                                               latest_regionviews.clear ();
+                               latest_regionviews.clear ();
 
-                                               playlist->partition ((framepos_t)((*t).start * speed),
-                                                               (framepos_t)((*t).end * speed), false);
+                               playlist->partition ((framepos_t)((*t).start * speed),
+                                                    (framepos_t)((*t).end * speed), false);
 
-                                               c.disconnect ();
+                               c.disconnect ();
 
-                                               if (!latest_regionviews.empty()) {
+                               if (!latest_regionviews.empty()) {
 
-                                                       rtv->view()->foreach_regionview (sigc::bind (
-                                                                               sigc::ptr_fun (add_if_covered),
-                                                                               &(*t), &new_selection));
+                                       rtv->view()->foreach_regionview (sigc::bind (
+                                                                                sigc::ptr_fun (add_if_covered),
+                                                                                &(*t), &new_selection));
 
-                                                       if (!in_command) {
-                                                               begin_reversible_command (_("separate"));
-                                                               in_command = true;
-                                                       }
+                                       if (!in_command) {
+                                               begin_reversible_command (_("separate"));
+                                               in_command = true;
+                                       }
 
-                                                       /* pick up changes to existing regions */
+                                       /* pick up changes to existing regions */
 
-                                                       vector<Command*> cmds;
-                                                       playlist->rdiff (cmds);
-                                                       _session->add_commands (cmds);
+                                       vector<Command*> cmds;
+                                       playlist->rdiff (cmds);
+                                       _session->add_commands (cmds);
 
-                                                       /* pick up changes to the playlist itself (adds/removes)
-                                                        */
+                                       /* pick up changes to the playlist itself (adds/removes)
+                                        */
 
-                                                       _session->add_command(new StatefulDiffCommand (playlist));
-                                               }
-                                       }
+                                       _session->add_command(new StatefulDiffCommand (playlist));
                                }
                        }
                }
@@ -3218,7 +3227,7 @@ Editor::separate_under_selected_regions ()
 
                if (!playlist) {
                        // is this check necessary?
-                       continue;
+                       continue;
                }
 
                vector<PlaylistState>::iterator i;
@@ -3293,17 +3302,18 @@ Editor::crop_region_to (framepos_t start, framepos_t end)
 
        for (TrackSelection::iterator i = ts.begin(); i != ts.end(); ++i) {
 
-               RouteTimeAxisView* rtv;
+               RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> ((*i));
 
-               if ((rtv = dynamic_cast<RouteTimeAxisView*> ((*i))) != 0) {
+               if (!rtv) {
+                       continue;
+               }
 
-                       boost::shared_ptr<Track> t = rtv->track();
+               boost::shared_ptr<Track> t = rtv->track();
 
-                       if (t != 0 && ! t->destructive()) {
+               if (t != 0 && ! t->destructive()) {
 
-                               if ((playlist = rtv->playlist()) != 0) {
-                                       playlists.push_back (playlist);
-                               }
+                       if ((playlist = rtv->playlist()) != 0) {
+                               playlists.push_back (playlist);
                        }
                }
        }
@@ -3392,7 +3402,7 @@ Editor::region_fill_track ()
                sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view));
 
                framepos_t const position = end_frame + (r->first_frame() - start_frame + 1);
-               playlist = (*i)->region()->playlist();
+               playlist = (*i)->region()->playlist();
                playlist->clear_changes ();
                playlist->duplicate_until (r, position, gap, end);
                _session->add_command(new StatefulDiffCommand (playlist));
@@ -3957,9 +3967,9 @@ Editor::bounce_range_selection (bool replace, bool enable_processing)
 
        for (TrackViewList::iterator i = views.begin(); i != views.end(); ++i) {
 
-               RouteTimeAxisView* rtv;
+               RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
 
-               if ((rtv = dynamic_cast<RouteTimeAxisView*> (*i)) == 0) {
+               if (!rtv) {
                        continue;
                }
 
@@ -4384,7 +4394,7 @@ Editor::remove_selected_regions ()
 
                if (!playlist) {
                        // is this check necessary?
-                       continue;
+                       continue;
                }
 
                /* get_regions_from_selection_and_entered() guarantees that
@@ -4633,7 +4643,7 @@ Editor::paste (float times, bool from_context)
 {
         DEBUG_TRACE (DEBUG::CutNPaste, "paste to preferred edit pos\n");
 
-       paste_internal (get_preferred_edit_position (EDIT_IGNORE_NONE, from_context), times);
+       paste_internal (get_preferred_edit_position (EDIT_IGNORE_NONE, from_context), times, get_grid_music_divisions (0));
 }
 
 void
@@ -4647,11 +4657,11 @@ Editor::mouse_paste ()
        }
 
        snap_to (where);
-       paste_internal (where, 1);
+       paste_internal (where, 1, get_grid_music_divisions (0));
 }
 
 void
-Editor::paste_internal (framepos_t position, float times)
+Editor::paste_internal (framepos_t position, float times, const int32_t sub_num)
 {
         DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("apparent paste position is %1\n", position));
 
@@ -4744,7 +4754,7 @@ Editor::paste_internal (framepos_t position, float times)
               "greedy" paste from one automation type to another. */
 
            PasteContext ctx(paste_count, times, ItemCounts(), true);
-           ts.front()->paste (position, *cut_buffer, ctx);
+           ts.front()->paste (position, *cut_buffer, ctx, sub_num);
 
        } else {
 
@@ -4752,7 +4762,7 @@ Editor::paste_internal (framepos_t position, float times)
 
                PasteContext ctx(paste_count, times, ItemCounts(), false);
                for (TrackViewList::iterator i = ts.begin(); i != ts.end(); ++i) {
-                       (*i)->paste (position, *cut_buffer, ctx);
+                       (*i)->paste (position, *cut_buffer, ctx, sub_num);
                }
        }
 
@@ -4788,7 +4798,7 @@ Editor::duplicate_some_regions (RegionSelection& regions, float times)
                sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view));
 
                framepos_t const position = end_frame + (r->first_frame() - start_frame + 1);
-               playlist = (*i)->region()->playlist();
+               playlist = (*i)->region()->playlist();
                playlist->clear_changes ();
                playlist->duplicate (r, position, gap, times);
                _session->add_command(new StatefulDiffCommand (playlist));
@@ -5699,11 +5709,11 @@ Editor::toggle_record_enable ()
                        continue;
 
                if (first) {
-                       new_state = !rtav->track()->record_enabled();
+                       new_state = !rtav->track()->rec_enable_control()->get_value();
                        first = false;
                }
 
-               rtav->track()->set_record_enabled (new_state, Controllable::UseGroup);
+               rtav->track()->rec_enable_control()->set_value (new_state, Controllable::UseGroup);
        }
 }
 
@@ -5712,7 +5722,7 @@ Editor::toggle_solo ()
 {
        bool new_state = false;
        bool first = true;
-       boost::shared_ptr<RouteList> rl (new RouteList);
+       boost::shared_ptr<ControlList> cl (new ControlList);
 
        for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
                RouteTimeAxisView *rtav = dynamic_cast<RouteTimeAxisView *>(*i);
@@ -5726,10 +5736,10 @@ Editor::toggle_solo ()
                        first = false;
                }
 
-               rl->push_back (rtav->route());
+               cl->push_back (rtav->route()->solo_control());
        }
 
-       _session->set_solo (rl, new_state, Session::rt_cleanup, Controllable::UseGroup);
+       _session->set_controls (cl, new_state ? 1.0 : 0.0, Controllable::UseGroup);
 }
 
 void
@@ -5754,7 +5764,7 @@ Editor::toggle_mute ()
                rl->push_back (rtav->route());
        }
 
-       _session->set_mute (rl, new_state, Session::rt_cleanup, Controllable::UseGroup);
+       _session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), new_state, Controllable::UseGroup);
 }
 
 void
@@ -6149,16 +6159,14 @@ Editor::split_region ()
                        return;
                }
 
-               split_regions_at (where, rs);
+               if (snap_musical()) {
+                       split_regions_at (where, rs, get_grid_music_divisions (0));
+               } else {
+                       split_regions_at (where, rs, 0);
+               }
        }
 }
 
-struct EditorOrderRouteSorter {
-    bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
-           return a->order_key () < b->order_key ();
-    }
-};
-
 void
 Editor::select_next_route()
 {
@@ -6172,6 +6180,7 @@ Editor::select_next_route()
        RouteUI *rui;
        do {
                for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+
                        if (*i == current) {
                                ++i;
                                if (i != track_views.end()) {
@@ -6183,10 +6192,12 @@ Editor::select_next_route()
                                break;
                        }
                }
+
                rui = dynamic_cast<RouteUI *>(current);
-       } while ( current->hidden() || (rui != NULL && !rui->route()->active()));
 
-       selection->set(current);
+       } while (current->hidden() || (rui == NULL) || !rui->route()->active());
+
+       selection->set (current);
 
        ensure_time_axis_view_is_visible (*current, false);
 }
@@ -6204,6 +6215,7 @@ Editor::select_prev_route()
        RouteUI *rui;
        do {
                for (TrackViewList::reverse_iterator i = track_views.rbegin(); i != track_views.rend(); ++i) {
+
                        if (*i == current) {
                                ++i;
                                if (i != track_views.rend()) {
@@ -6215,7 +6227,8 @@ Editor::select_prev_route()
                        }
                }
                rui = dynamic_cast<RouteUI *>(current);
-       } while ( current->hidden() || (rui != NULL && !rui->route()->active()));
+
+       } while (current->hidden() || (rui == NULL) || !rui->route()->active());
 
        selection->set (current);
 
@@ -6282,11 +6295,11 @@ Editor::set_session_extents_from_selection ()
 
        Location* loc;
        if ((loc = _session->locations()->session_range_location()) == 0) {
-               _session->set_session_extents ( start, end );  // this will create a new session range;  no need for UNDO
+               _session->set_session_extents (start, end);  // this will create a new session range;  no need for UNDO
        } else {
                XMLNode &before = loc->get_state();
 
-               _session->set_session_extents ( start, end );
+               _session->set_session_extents (start, end);
 
                XMLNode &after = loc->get_state();
 
@@ -6296,6 +6309,8 @@ Editor::set_session_extents_from_selection ()
 
                commit_reversible_command ();
        }
+
+       _session->set_end_is_free (false);
 }
 
 void
@@ -6476,7 +6491,7 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
 {
        framepos_t length = end - start;
 
-       const Meter& m (_session->tempo_map().meter_at (start));
+       const Meter& m (_session->tempo_map().meter_at_frame (start));
 
        /* length = 1 bar */
 
@@ -6501,7 +6516,7 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
 
        */
 
-       const TempoSection& t (_session->tempo_map().tempo_section_at (start));
+       const TempoSection& t (_session->tempo_map().tempo_section_at_frame (start));
 
        bool do_global = false;
 
@@ -6552,7 +6567,8 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
        } else if (t.frame() == start) {
                _session->tempo_map().change_existing_tempo_at (start, beats_per_minute, t.note_type());
        } else {
-               _session->tempo_map().add_tempo (Tempo (beats_per_minute, t.note_type()), start, TempoSection::Constant);
+               const Tempo tempo (beats_per_minute, t.note_type());
+               _session->tempo_map().add_tempo (tempo, 0.0, start, TempoSection::Constant, AudioTime);
        }
 
        XMLNode& after (_session->tempo_map().get_state());
@@ -7293,7 +7309,8 @@ Editor::insert_time (
                        (*i)->clear_owned_changes ();
 
                        if (opt == SplitIntersected) {
-                               (*i)->split (pos);
+                               /* non musical split */
+                               (*i)->split (pos, 0);
                        }
 
                        (*i)->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue);