add self-removing Sends (remove on disconnect)
[ardour.git] / gtk2_ardour / editor_ops.cc
index 55d38f3a884e9da23d7f2346a77a30eee84cbc22..d5386523352fdb3f1da87a22f4f8324d8d95ae44 100644 (file)
@@ -1921,7 +1921,7 @@ Editor::temporal_zoom_region (bool both_axes)
 
 
 bool
-Editor::get_selection_extents ( framepos_t &start, framepos_t &end )
+Editor::get_selection_extents (framepos_t &start, framepos_t &end) const
 {
        start = max_framepos;
        end = 0;
@@ -2782,7 +2782,7 @@ Editor::rename_region ()
                return;
        }
 
-       ArdourDialog d (*this, _("Rename Region"), true, false);
+       ArdourDialog d (_("Rename Region"), true, false);
        Entry entry;
        Label label (_("New name:"));
        HBox hbox;
@@ -4567,7 +4567,7 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs)
 
                list<boost::shared_ptr<Playlist> > foo;
 
-               /* the pmap is in the same order as the tracks in which selected regions occured */
+               /* the pmap is in the same order as the tracks in which selected regions occurred */
 
                for (vector<PlaylistMapping>::iterator i = pmap.begin(); i != pmap.end(); ++i) {
                        if ((*i).pl) {
@@ -4811,18 +4811,9 @@ Editor::duplicate_selection (float times)
        }
 
        boost::shared_ptr<Playlist> playlist;
-       vector<boost::shared_ptr<Region> > new_regions;
-       vector<boost::shared_ptr<Region> >::iterator ri;
-
-       create_region_from_selection (new_regions);
-
-       if (new_regions.empty()) {
-               return;
-       }
-
-       ri = new_regions.begin();
 
        TrackViewList ts = selection->tracks.filter_to_unique_playlists ();
+
        bool in_command = false;
 
        for (TrackViewList::iterator i = ts.begin(); i != ts.end(); ++i) {
@@ -4830,27 +4821,34 @@ Editor::duplicate_selection (float times)
                        continue;
                }
                playlist->clear_changes ();
-               framepos_t end;
+
                if (clicked_selection) {
-                       end = selection->time[clicked_selection].end;
+                       playlist->duplicate_range (selection->time[clicked_selection], times);
                } else {
-                       end = selection->time.end_frame();
+                       playlist->duplicate_ranges (selection->time, times);
                }
-               playlist->duplicate (*ri, end + 1, times);
 
                if (!in_command) {
-                       begin_reversible_command (_("duplicate selection"));
+                       begin_reversible_command (_("duplicate range selection"));
                        in_command = true;
                }
                _session->add_command (new StatefulDiffCommand (playlist));
 
-               ++ri;
-               if (ri == new_regions.end()) {
-                       --ri;
-               }
        }
 
        if (in_command) {
+               // now "move" range selection to after the current range selection
+               framecnt_t distance = 0;
+
+               if (clicked_selection) {
+                       distance = selection->time[clicked_selection].end -
+                                  selection->time[clicked_selection].start;
+               } else {
+                       distance = selection->time.end_frame() - selection->time.start();
+               }
+
+               selection->move_time (distance);
+
                commit_reversible_command ();
        }
 }
@@ -5162,12 +5160,13 @@ Editor::strip_region_silence ()
        StripSilenceDialog d (_session, audio_only);
        int const r = d.run ();
 
-        d.drop_rects ();
+       d.drop_rects ();
 
-        if (r == Gtk::RESPONSE_OK) {
-                ARDOUR::AudioIntervalMap silences;
-                d.silences (silences);
+       if (r == Gtk::RESPONSE_OK) {
+               ARDOUR::AudioIntervalMap silences;
+               d.silences (silences);
                StripSilence s (*_session, silences, d.fade_length());
+
                apply_filter (s, _("strip silence"), &d);
        }
 }
@@ -5442,6 +5441,11 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
                                playlist->clear_changes ();
                                playlist->clear_owned_changes ();
 
+                               if (!in_command) {
+                                       begin_reversible_command (command);
+                                       in_command = true;
+                               }
+
                                if (filter.results.empty ()) {
 
                                        /* no regions returned; remove the old one */
@@ -5462,14 +5466,10 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
                                        }
 
                                }
+
                                /* We might have removed regions, which alters other regions' layering_index,
                                   so we need to do a recursive diff here.
                                */
-
-                               if (!in_command) {
-                                       begin_reversible_command (command);
-                                       in_command = true;
-                               }
                                vector<Command*> cmds;
                                playlist->rdiff (cmds);
                                _session->add_commands (cmds);
@@ -7226,12 +7226,10 @@ Editor::do_insert_time ()
                return;
        }
 
-       InsertTimeOption opt = d.intersected_region_action ();
-
        insert_time (
-               get_preferred_edit_position(),
+               get_preferred_edit_position (EDIT_IGNORE_MOUSE),
                d.distance(),
-               opt,
+               d.intersected_region_action (),
                d.all_playlists(),
                d.move_glued(),
                d.move_markers(),
@@ -7429,7 +7427,7 @@ Editor::remove_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
                        pl->shift (pos, -frames, true, ignore_music_glue);
 
                        if (!in_command) {
-                               begin_reversible_command (_("cut time"));
+                               begin_reversible_command (_("remove time"));
                                in_command = true;
                        }
                        XMLNode &after = pl->get_state();
@@ -7441,7 +7439,7 @@ Editor::remove_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
                RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*x);
                if (rtav) {
                        if (!in_command) {
-                               begin_reversible_command (_("cut time"));
+                               begin_reversible_command (_("remove time"));
                                in_command = true;
                        }
                        rtav->route ()->shift (pos, -frames);
@@ -7514,7 +7512,7 @@ Editor::remove_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
 
                if (moved) {
                        if (!in_command) {
-                               begin_reversible_command (_("cut time"));
+                               begin_reversible_command (_("remove time"));
                                in_command = true;
                        }
                        XMLNode& after (_session->locations()->get_state());
@@ -7601,7 +7599,7 @@ Editor::fit_tracks (TrackViewList & tracks)
        double first_y_pos = DBL_MAX;
 
        if (h < TimeAxisView::preset_height (HeightSmall)) {
-               MessageDialog msg (*this, _("There are too many tracks to fit in the current window"));
+               MessageDialog msg (_("There are too many tracks to fit in the current window"));
                /* too small to be displayed */
                return;
        }