Add reset region gain action for selected regions
[ardour.git] / gtk2_ardour / editor_ops.cc
index 288d12219f16de729524ef65c62fa08f92c30ddd..2b8a5fd018d0ddeac39d5abc9fd0cee4098e1ca1 100644 (file)
@@ -2635,7 +2635,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 +2653,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 +2670,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 +4242,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 +4321,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 +5217,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 ()
@@ -5743,11 +5780,17 @@ Editor::toggle_region_lock_style ()
                return;
        }
 
-       begin_reversible_command (_("region lock style"));
+       Glib::RefPtr<ToggleAction> a = Glib::RefPtr<ToggleAction>::cast_dynamic (_region_actions->get_action("toggle-region-lock-style"));
+       vector<Widget*> proxies = a->get_proxies();
+       Gtk::CheckMenuItem* cmi = dynamic_cast<Gtk::CheckMenuItem*> (proxies.front());
+
+       assert (cmi);
+
+       begin_reversible_command (_("toggle region lock style"));
 
        for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
                (*i)->region()->clear_changes ();
-               PositionLockStyle const ns = (*i)->region()->position_lock_style() == AudioTime ? MusicTime : AudioTime;
+               PositionLockStyle const ns = ((*i)->region()->position_lock_style() == AudioTime && !cmi->get_inconsistent()) ? MusicTime : AudioTime;
                (*i)->region()->set_position_lock_style (ns);
                _session->add_command (new StatefulDiffCommand ((*i)->region()));
        }
@@ -6400,7 +6443,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);
                }
@@ -6699,12 +6742,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());
@@ -6980,10 +7024,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) {
@@ -7079,11 +7125,14 @@ Editor::close_region_gaps ()
 
                (*r)->region()->clear_changes ();
                (*r)->region()->trim_front( (position - pull_back_frames));
+
+               last_region->clear_changes ();
                last_region->trim_end( (position - pull_back_frames + crossfade_len));
 
                _session->add_command (new StatefulDiffCommand ((*r)->region()));
-               last_region = (*r)->region();
+               _session->add_command (new StatefulDiffCommand (last_region));
 
+               last_region = (*r)->region();
                idx++;
        }
 
@@ -7468,6 +7517,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));
@@ -7475,10 +7529,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);