Fix crash when showing plugin-UI in safe-mode
[ardour.git] / gtk2_ardour / editor_ops.cc
index 6f4c3610fb0e3d590b132d1e35399fb82f9c54b7..ecc9fa1f06c9c7382a9ee7e02ee3ee355cdaabcd 100644 (file)
@@ -1451,6 +1451,22 @@ Editor::scroll_tracks_up_line ()
        reset_y_origin (vertical_adjustment.get_value() - 60);
 }
 
+void
+Editor::select_topmost_track ()
+{
+       const double top_of_trackviews = vertical_adjustment.get_value();
+       for (TrackViewList::iterator t = track_views.begin(); t != track_views.end(); ++t) {
+               if ((*t)->hidden()) {
+                       continue;
+               }
+               std::pair<TimeAxisView*,double> res = (*t)->covers_y_position (top_of_trackviews);
+               if (res.first) {
+                       selection->set (*t);
+                       break;
+               }
+       }
+}
+
 bool
 Editor::scroll_down_one_track (bool skip_child_views)
 {
@@ -2635,7 +2651,7 @@ Editor::play_with_preroll ()
                const framepos_t preroll = _session->preroll_samples (start);
 
                framepos_t ret = start;
-               
+
                if (start > preroll) {
                        start = start - preroll;
                }
@@ -2653,7 +2669,7 @@ Editor::play_with_preroll ()
                const framepos_t preroll = _session->preroll_samples (ph);
                framepos_t start;
                if (ph > preroll) {
-                       start = ph - preroll; 
+                       start = ph - preroll;
                } else {
                        start = 0;
                }
@@ -2670,6 +2686,11 @@ Editor::rec_with_preroll ()
        _session->request_preroll_record_trim (ph, preroll);
 }
 
+void
+Editor::rec_with_count_in ()
+{
+       _session->request_count_in_record ();
+}
 
 void
 Editor::play_location (Location& location)
@@ -4237,7 +4258,7 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
 
        /* user could select points in any order */
        selection->points.sort(PointsSelectionPositionSorter ());
-       
+
        /* Go through all selected points, making an AutomationRecord for each distinct AutomationList */
        for (PointSelection::iterator sel_point = selection->points.begin(); sel_point != selection->points.end(); ++sel_point) {
                const AutomationLine&                   line = (*sel_point)->line();
@@ -4316,7 +4337,7 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
                        boost::shared_ptr<AutomationList> al = line.the_list();
 
                        bool erase = true;
-                       
+
                        if (dynamic_cast<AudioRegionGainLine*> (&line)) {
                                /* removing of first and last gain point in region gain lines is prohibited*/
                                if (line.is_last_point (*(*sel_point)) || line.is_first_point (*(*sel_point))) {
@@ -5212,6 +5233,38 @@ Editor::adjust_region_gain (bool up)
        }
 }
 
+void
+Editor::reset_region_gain ()
+{
+       RegionSelection rs = get_regions_from_selection_and_entered ();
+
+       if (!_session || rs.empty()) {
+               return;
+       }
+
+       bool in_command = false;
+
+       for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*r);
+               if (!arv) {
+                       continue;
+               }
+
+               arv->region()->clear_changes ();
+
+               arv->audio_region()->set_scale_amplitude (1.0f);
+
+               if (!in_command) {
+                               begin_reversible_command ("reset region gain");
+                               in_command = true;
+               }
+               _session->add_command (new StatefulDiffCommand (arv->region()));
+       }
+
+       if (in_command) {
+               commit_reversible_command ();
+       }
+}
 
 void
 Editor::reverse_region ()
@@ -6406,7 +6459,7 @@ Editor::set_auto_punch_range ()
                        set_punch_range (tpl->start(), now, _("Auto Punch In/Out"));
                        _session->config.set_punch_out(true);
                }
-       } else  {
+       } else  {
                if (_session->config.get_punch_out()) {
                        _session->config.set_punch_out(false);
                }
@@ -6705,12 +6758,13 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
        XMLNode& before (_session->tempo_map().get_state());
 
        if (do_global) {
-               _session->tempo_map().change_initial_tempo (beats_per_minute, t.note_type());
+               _session->tempo_map().change_initial_tempo (beats_per_minute, t.note_type(), t.end_note_types_per_minute());
        } else if (t.frame() == start) {
-               _session->tempo_map().change_existing_tempo_at (start, beats_per_minute, t.note_type());
+               _session->tempo_map().change_existing_tempo_at (start, beats_per_minute, t.note_type(), t.end_note_types_per_minute());
        } else {
+               /* constant tempo */
                const Tempo tempo (beats_per_minute, t.note_type());
-               _session->tempo_map().add_tempo (tempo, 0.0, start, TempoSection::Constant, AudioTime);
+               _session->tempo_map().add_tempo (tempo, 0.0, start, AudioTime);
        }
 
        XMLNode& after (_session->tempo_map().get_state());
@@ -6986,10 +7040,12 @@ Editor::snap_regions_to_grid ()
                        used_playlists.push_back(pl);
                        pl->freeze();
                }
+               (*r)->region()->clear_changes ();
 
                MusicFrame start ((*r)->region()->first_frame (), 0);
                snap_to (start);
                (*r)->region()->set_position (start.frame, start.division);
+               _session->add_command(new StatefulDiffCommand ((*r)->region()));
        }
 
        while (used_playlists.size() > 0) {
@@ -7477,6 +7533,11 @@ Editor::insert_time (
                        (*i)->clear_changes ();
                        (*i)->clear_owned_changes ();
 
+                       if (!in_command) {
+                               begin_reversible_command (_("insert time"));
+                               in_command = true;
+                       }
+
                        if (opt == SplitIntersected) {
                                /* non musical split */
                                (*i)->split (MusicFrame (pos, 0));
@@ -7484,10 +7545,6 @@ Editor::insert_time (
 
                        (*i)->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue);
 
-                       if (!in_command) {
-                               begin_reversible_command (_("insert time"));
-                               in_command = true;
-                       }
                        vector<Command*> cmds;
                        (*i)->rdiff (cmds);
                        _session->add_commands (cmds);
@@ -7615,16 +7672,17 @@ Editor::remove_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
 
                        XMLNode &before = pl->get_state();
 
+                       if (!in_command) {
+                               begin_reversible_command (_("remove time"));
+                               in_command = true;
+                       }
+
                        std::list<AudioRange> rl;
                        AudioRange ar(pos, pos+frames, 0);
                        rl.push_back(ar);
                        pl->cut (rl);
                        pl->shift (pos, -frames, true, ignore_music_glue);
 
-                       if (!in_command) {
-                               begin_reversible_command (_("remove time"));
-                               in_command = true;
-                       }
                        XMLNode &after = pl->get_state();
 
                        _session->add_command (new MementoCommand<Playlist> (*pl, &before, &after));