modified fix from carl for region copy-moves-original-to-start bug; change verbose...
[ardour.git] / gtk2_ardour / editor_ops.cc
index 0db98831cc5568df10d269dc9dabb1b2b3e8ae2a..f80ec708ebee70178fc003a5c0493ab44989ce7c 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/choice.h>
+#include <gtkmm2ext/window_title.h>
 
 #include <ardour/audioengine.h>
 #include <ardour/session.h>
@@ -67,6 +68,7 @@ using namespace ARDOUR;
 using namespace PBD;
 using namespace sigc;
 using namespace Gtk;
+using namespace Gtkmm2ext;
 using namespace Editing;
 
 /***********************************************************************
@@ -1506,19 +1508,13 @@ Editor::insert_region_list_drag (boost::shared_ptr<AudioRegion> region, int x, i
                return;
        }
        
-       cerr << "drop target playlist, UC  = " << playlist.use_count() << endl;
-
        snap_to (where);
        
        begin_reversible_command (_("insert dragged region"));
         XMLNode &before = playlist->get_state();
-       cerr << "pre add target playlist, UC  = " << playlist.use_count() << endl;
        playlist->add_region (RegionFactory::create (region), where, 1.0);
-       cerr << "post add target playlist, UC  = " << playlist.use_count() << endl;
        session->add_command(new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
        commit_reversible_command ();
-
-       cerr << "post drop target playlist, UC  = " << playlist.use_count() << endl;
 }
 
 void
@@ -1763,7 +1759,10 @@ Editor::rename_region ()
                return;
        }
 
-       dialog.set_title (_("ardour: rename region"));
+       WindowTitle title(Glib::get_application_name());
+       title += _("Rename Region");
+
+       dialog.set_title (title.get_string());
        dialog.set_name ("RegionRenameWindow");
        dialog.set_size_request (300, -1);
        dialog.set_position (Gtk::WIN_POS_MOUSE);
@@ -1994,6 +1993,12 @@ Editor::separate_region_from_selection ()
                if ((atv = dynamic_cast<AudioTimeAxisView*> ((*i))) != 0) {
 
                        if (atv->is_audio_track()) {
+
+                               /* no edits to destructive tracks */
+
+                               if (atv->audio_track()->audio_diskstream()->destructive()) {
+                                       continue;
+                               }
                                        
                                if ((playlist = atv->playlist()) != 0) {
                                        if (!doing_undo) {
@@ -2047,6 +2052,12 @@ Editor::separate_regions_using_location (Location& loc)
 
                        if (atv->is_audio_track()) {
                                        
+                               /* no edits to destructive tracks */
+
+                               if (atv->audio_track()->audio_diskstream()->destructive()) {
+                                       continue;
+                               }
+
                                if ((playlist = atv->playlist()) != 0) {
                                         XMLNode *before;
                                        if (!doing_undo) {
@@ -2076,75 +2087,76 @@ Editor::separate_regions_using_location (Location& loc)
 void
 Editor::crop_region_to_selection ()
 {
-       if (selection->time.empty()) {
+       if (selection->time.empty() || selection->tracks.empty()) {
                return;
        }
 
        vector<boost::shared_ptr<Playlist> > playlists;
        boost::shared_ptr<Playlist> playlist;
 
-       if (clicked_trackview != 0) {
-
-               if ((playlist = clicked_trackview->playlist()) == 0) {
-                       return;
-               }
-
-               playlists.push_back (playlist);
-
-       } else {
+       sort_track_selection ();
+       
+       for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
                
-               sort_track_selection ();
-
-               for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
-
-                       AudioTimeAxisView* atv;
+               AudioTimeAxisView* atv;
+               
+               if ((atv = dynamic_cast<AudioTimeAxisView*> ((*i))) != 0) {
+                       
+                       if (atv->is_audio_track()) {
+                               
+                               /* no edits to destructive tracks */
 
-                       if ((atv = dynamic_cast<AudioTimeAxisView*> ((*i))) != 0) {
+                               if (atv->audio_track()->audio_diskstream()->destructive()) {
+                                       continue;
+                               }
 
-                               if (atv->is_audio_track()) {
-                                       
-                                       if ((playlist = atv->playlist()) != 0) {
-                                               playlists.push_back (playlist);
-                                       }
+                               if ((playlist = atv->playlist()) != 0) {
+                                       playlists.push_back (playlist);
                                }
                        }
                }
        }
 
-       if (!playlists.empty()) {
-
-               nframes_t start;
-               nframes_t end;
-               nframes_t cnt;
-
-               begin_reversible_command (_("trim to selection"));
-
-               for (vector<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) {
-                       
-                       boost::shared_ptr<Region> region;
-                       
-                       start = selection->time.start();
-
-                       if ((region = (*i)->top_region_at(start)) == 0) {
-                               continue;
-                       }
-                       
-                       /* now adjust lengths to that we do the right thing
-                          if the selection extends beyond the region
-                       */
-                       
-                       start = max (start, region->position());
-                       end = min (selection->time.end_frame(), start + region->length() - 1);
-                       cnt = end - start + 1;
-
-                        XMLNode &before = (*i)->get_state();
-                       region->trim_to (start, cnt, this);
-                        XMLNode &after = (*i)->get_state();
-                       session->add_command (new MementoCommand<Playlist>(*(*i), &before, &after));
+       if (playlists.empty()) {
+               return;
+       }
+               
+       nframes_t start;
+       nframes_t end;
+       nframes_t cnt;
+       
+       begin_reversible_command (_("trim to selection"));
+       
+       for (vector<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) {
+               
+               boost::shared_ptr<Region> region;
+               
+               start = selection->time.start();
+               
+               if ((region = (*i)->top_region_at(start)) == 0) {
+                       continue;
                }
-
-               commit_reversible_command ();
+               
+               /* now adjust lengths to that we do the right thing
+                  if the selection extends beyond the region
+               */
+               
+               start = max (start, region->position());
+               if (max_frames - start < region->length()) {
+                       end = start + region->length() - 1;
+               } else {
+                       end = max_frames;
+               }
+               end = min (selection->time.end_frame(), end);
+               cnt = end - start + 1;
+               
+               XMLNode &before = (*i)->get_state();
+               region->trim_to (start, cnt, this);
+               XMLNode &after = (*i)->get_state();
+               session->add_command (new MementoCommand<Playlist>(*(*i), &before, &after));
        }
+       
+       commit_reversible_command ();
 }              
 
 void
@@ -2526,8 +2538,10 @@ Editor::freeze_route ()
        if (interthread_progress_window == 0) {
                build_interthread_progress_window ();
        }
-       
-       interthread_progress_window->set_title (_("ardour: freeze"));
+
+       WindowTitle title(Glib::get_application_name());
+       title += _("Freeze");
+       interthread_progress_window->set_title (title.get_string());
        interthread_progress_window->set_position (Gtk::WIN_POS_MOUSE);
        interthread_progress_window->show_all ();
        interthread_progress_bar.set_fraction (0.0f);
@@ -2569,15 +2583,15 @@ Editor::bounce_range_selection ()
                return;
        }
 
-       TrackViewList *views = get_valid_views (selection->time.track, selection->time.group);
+       TrackSelection views = selection->tracks;
 
        nframes_t start = selection->time[clicked_selection].start;
        nframes_t end = selection->time[clicked_selection].end;
        nframes_t cnt = end - start + 1;
-       
+
        begin_reversible_command (_("bounce range"));
 
-       for (TrackViewList::iterator i = views->begin(); i != views->end(); ++i) {
+       for (TrackViewList::iterator i = views.begin(); i != views.end(); ++i) {
 
                AudioTimeAxisView* atv;
 
@@ -2596,7 +2610,7 @@ Editor::bounce_range_selection ()
                itt.done = false;
                itt.cancel = false;
                itt.progress = false;
-               
+
                 XMLNode &before = playlist->get_state();
                atv->audio_track()->bounce_range (start, cnt, itt);
                 XMLNode &after = playlist->get_state();
@@ -2604,8 +2618,6 @@ Editor::bounce_range_selection ()
        }
        
        commit_reversible_command ();
-       
-       delete views;
 }
 
 void
@@ -2806,19 +2818,22 @@ Editor::cut_copy_regions (CutCopyOp op)
                }
                
                boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>((*x)->region());
+               boost::shared_ptr<Region> _xx;
                
                switch (op) {
                case Cut:
                        if (!ar) break;
                        
-                       npl->add_region (RegionFactory::create (ar), (*x)->region()->position() - first_position);
+                       _xx = RegionFactory::create ((*x)->region());
+                       npl->add_region (_xx, (*x)->region()->position() - first_position);
                        pl->remove_region (((*x)->region()));
                        break;
                        
                case Copy:
                        if (!ar) break;
-                       
-                       npl->add_region (RegionFactory::create (ar), (*x)->region()->position() - first_position);
+
+                       /* copy region before adding, so we're not putting same object into two different playlists */
+                       npl->add_region (RegionFactory::create ((*x)->region()), (*x)->region()->position() - first_position);
                        break;
                        
                case Clear:
@@ -2838,10 +2853,11 @@ Editor::cut_copy_regions (CutCopyOp op)
                foo.push_back ((*i).pl);
        }
        
+
        if (!foo.empty()) {
                cut_buffer->set (foo);
        }
-       
+
        for (set<PlaylistState, lt_playlist>::iterator pl = freezelist.begin(); pl != freezelist.end(); ++pl) {
                (*pl).playlist->thaw ();
                session->add_command (new MementoCommand<Playlist>(*(*pl).playlist, (*pl).before, &(*pl).playlist->get_state()));