Primitive take system: active edit groups now dictate playlist decisions.
authorSampo Savolainen <v2@iki.fi>
Sun, 5 Oct 2008 19:14:03 +0000 (19:14 +0000)
committerSampo Savolainen <v2@iki.fi>
Sun, 5 Oct 2008 19:14:03 +0000 (19:14 +0000)
(I will port this to 3.0 after it's deemed usable)

git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3871 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor.cc
gtk2_ardour/editor.h
gtk2_ardour/route_time_axis.cc
gtk2_ardour/route_time_axis.h

index 2b10e2421d0d7086bed8441d9c105055d79240a2..0202a5398a10b1bd6ecf61b75d9f3464d94048ab 100644 (file)
@@ -4101,7 +4101,9 @@ void
 Editor::new_playlists (TimeAxisView* v)
 {
        begin_reversible_command (_("new playlists"));
-       mapover_audio_tracks (mem_fun (*this, &Editor::mapped_use_new_playlist), v);
+       vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
+       session->get_playlists(playlists);
+       mapover_audio_tracks ( bind(mem_fun (*this, &Editor::mapped_use_new_playlist), playlists), v );
        commit_reversible_command ();
 }
 
@@ -4116,7 +4118,9 @@ void
 Editor::copy_playlists (TimeAxisView* v)
 {
        begin_reversible_command (_("copy playlists"));
-       mapover_audio_tracks (mem_fun (*this, &Editor::mapped_use_copy_playlist), v);
+       vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
+       session->get_playlists(playlists);
+       mapover_audio_tracks ( bind(mem_fun (*this, &Editor::mapped_use_copy_playlist), playlists), v );
        commit_reversible_command ();
 }
 
@@ -4131,20 +4135,22 @@ void
 Editor::clear_playlists (TimeAxisView* v)
 {
        begin_reversible_command (_("clear playlists"));
-       mapover_audio_tracks (mem_fun (*this, &Editor::mapped_clear_playlist), v);
+       vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
+       session->get_playlists(playlists);
+       mapover_audio_tracks ( mem_fun (*this, &Editor::mapped_clear_playlist), v );
        commit_reversible_command ();
 }
 
 void 
-Editor::mapped_use_new_playlist (AudioTimeAxisView& atv, uint32_t sz)
+Editor::mapped_use_new_playlist (AudioTimeAxisView& atv, uint32_t sz, vector<boost::shared_ptr<ARDOUR::Playlist> > const & playlists)
 {
-       atv.use_new_playlist (sz > 1 ? false : true);
+       atv.use_new_playlist (sz > 1 ? false : true, playlists);
 }
 
 void
-Editor::mapped_use_copy_playlist (AudioTimeAxisView& atv, uint32_t sz)
+Editor::mapped_use_copy_playlist (AudioTimeAxisView& atv, uint32_t sz, vector<boost::shared_ptr<ARDOUR::Playlist> > const & playlists)
 {
-       atv.use_copy_playlist (sz > 1 ? false : true);
+       atv.use_copy_playlist (sz > 1 ? false : true, playlists);
 }
 
 void 
index 019ffcadc12f252712e98b2158775b85f1c259d9..a81b09de01f9bed3764105003dc01c3f319a7467 100644 (file)
@@ -512,8 +512,8 @@ class Editor : public PublicEditor
        /* functions to be passed to mapover_audio_tracks(), possibly with sigc::bind()-supplied arguments */
 
        void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*);
-       void mapped_use_new_playlist (AudioTimeAxisView&, uint32_t);
-       void mapped_use_copy_playlist (AudioTimeAxisView&, uint32_t);
+       void mapped_use_new_playlist (AudioTimeAxisView&, uint32_t, vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
+       void mapped_use_copy_playlist (AudioTimeAxisView&, uint32_t, vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
        void mapped_clear_playlist (AudioTimeAxisView&, uint32_t);
 
        /* end */
index f2c8575e7af68270d6802492079f2f1d639c86d7..7131be8fbd71ce05ce86b5d47d7124a3037cf9bd 100644 (file)
@@ -875,8 +875,46 @@ RouteTimeAxisView::rename_current_playlist ()
        }
 }
 
+std::string 
+RouteTimeAxisView::resolve_new_group_playlist_name(std::string &basename, vector<boost::shared_ptr<Playlist> > const & playlists)
+{
+       std::string ret(basename);
+
+       std::string group_string = "."+edit_group()->name()+".";
+
+       if (basename.find(group_string) == string::npos) {
+               int maxnumber = 0;
+
+               // iterate through all playlists
+               for (vector<boost::shared_ptr<Playlist> >::const_iterator i = playlists.begin(); i != playlists.end(); ++i) {
+                       std::string tmp = (*i)->name();
+
+                       std::string::size_type idx = tmp.find(group_string);                    
+                       // find those which belong to this group
+                       if (idx != string::npos) {
+                               tmp = tmp.substr(idx + group_string.length());
+
+                               // and find the largest current number
+                               int x = atoi(tmp.c_str());
+                               if (x > maxnumber) {
+                                       maxnumber = x;
+                               }
+                       }
+               }
+
+               maxnumber++;
+
+               char buf[32];
+                snprintf (buf, sizeof(buf), "%d", maxnumber);
+               
+               ret = this->name()+"."+edit_group()->name()+"."+buf;
+       }
+
+       return ret;
+}
+
 void
-RouteTimeAxisView::use_copy_playlist (bool prompt)
+RouteTimeAxisView::use_copy_playlist (bool prompt, vector<boost::shared_ptr<Playlist> > const & playlists_before_op)
 {
        string name;
        
@@ -889,10 +927,14 @@ RouteTimeAxisView::use_copy_playlist (bool prompt)
                return;
 
        name = pl->name();
+       
+       if (edit_group() && edit_group()->is_active()) {
+               name = resolve_new_group_playlist_name(name, playlists_before_op);
+       }
 
-       do {
+       while (_session.playlist_by_name(name)) {
                name = Playlist::bump_name (name, _session);
-       } while (_session.playlist_by_name(name));
+       }
 
        // TODO: The prompter "new" button should be de-activated if the user
        // specifies a playlist name which already exists in the session.
@@ -924,7 +966,7 @@ RouteTimeAxisView::use_copy_playlist (bool prompt)
 }
 
 void
-RouteTimeAxisView::use_new_playlist (bool prompt)
+RouteTimeAxisView::use_new_playlist (bool prompt, vector<boost::shared_ptr<Playlist> > const & playlists_before_op)
 {
        string name;
        
@@ -937,10 +979,14 @@ RouteTimeAxisView::use_new_playlist (bool prompt)
                return;
 
        name = pl->name();
+       
+       if (edit_group() && edit_group()->is_active()) {
+               name = resolve_new_group_playlist_name(name,playlists_before_op);
+       }
 
-       do {
+       while (_session.playlist_by_name(name)) {
                name = Playlist::bump_name (name, _session);
-       } while (_session.playlist_by_name(name));
+       }
 
 
        if (prompt) {
@@ -1338,8 +1384,17 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu)
        playlist_items.push_back (MenuElem (_("Rename"), mem_fun(*this, &RouteTimeAxisView::rename_current_playlist)));
        playlist_items.push_back (SeparatorElem());
 
-       playlist_items.push_back (MenuElem (_("New"), bind(mem_fun(editor, &PublicEditor::new_playlists), this)));
-       playlist_items.push_back (MenuElem (_("New Copy"), bind(mem_fun(editor, &PublicEditor::copy_playlists), this)));
+       if (!edit_group() || !edit_group()->is_active()) {
+               playlist_items.push_back (MenuElem (_("New"), bind(mem_fun(editor, &PublicEditor::new_playlists), this)));
+               playlist_items.push_back (MenuElem (_("New Copy"), bind(mem_fun(editor, &PublicEditor::copy_playlists), this)));
+
+       } else {
+               // Use a label which tells the user what is happening
+               playlist_items.push_back (MenuElem (_("New Take"), bind(mem_fun(editor, &PublicEditor::new_playlists), this)));
+               playlist_items.push_back (MenuElem (_("Copy Take"), bind(mem_fun(editor, &PublicEditor::copy_playlists), this)));
+               
+       }
+
        playlist_items.push_back (SeparatorElem());
        playlist_items.push_back (MenuElem (_("Clear Current"), bind(mem_fun(editor, &PublicEditor::clear_playlists), this)));
        playlist_items.push_back (SeparatorElem());
@@ -1361,7 +1416,51 @@ RouteTimeAxisView::use_playlist (boost::weak_ptr<Playlist> wpl)
        boost::shared_ptr<AudioPlaylist> apl = boost::dynamic_pointer_cast<AudioPlaylist> (pl);
        
        if (apl) {
+               if (get_diskstream()->playlist() == apl) {
+                       // radio button cotnrols mean this function is called for both the 
+                       // old and new playlist
+                       return;
+               }
                get_diskstream()->use_playlist (apl);
+
+
+               if (edit_group() && edit_group()->is_active()) {
+                       //PBD::stacktrace(cerr, 20);
+                       std::string group_string = "."+edit_group()->name()+".";
+
+                       std::string take_name = apl->name();
+                       std::string::size_type idx = take_name.find(group_string);
+
+                       if (idx == std::string::npos)
+                               return;
+
+                       take_name = take_name.substr(idx + group_string.length()); // find the bit containing the take number / name
+                       
+                       for (list<Route*>::const_iterator i = edit_group()->route_list().begin(); i != edit_group()->route_list().end(); ++i) {
+                               if ( (*i) == this->route().get()) {
+                                       continue;
+                               }
+                               
+                               std::string playlist_name = (*i)->name()+group_string+take_name;
+
+                               Track *track = dynamic_cast<Track *>(*i);
+                               if (!track) {
+                                       std::cerr << "route " << (*i)->name() << " is not a Track" << std::endl;
+                                       continue;
+                               }
+
+                               boost::shared_ptr<Playlist> ipl = session().playlist_by_name(playlist_name);
+                               if (!ipl) {
+                                       // No playlist for this track for this take yet, make it
+                                       track->diskstream()->use_new_playlist();
+                                       track->diskstream()->playlist()->set_name(playlist_name);
+                               } else {
+                                       track->diskstream()->use_playlist(ipl);
+                               }
+                               
+                               //(*i)->get_dis
+                       }
+               }
        }
 }
 
index 992c1a01c57b533c10bee411a0e5e99401d7cce7..75862965aba81b199a09ba39cf40f7314f8c26a9 100644 (file)
@@ -33,6 +33,7 @@
 #include <gtkmm2ext/slider_controller.h>
 #include <list>
 
+#include <ardour/playlist.h>
 #include <ardour/types.h>
 
 #include "ardour_dialog.h"
@@ -93,9 +94,13 @@ public:
        list<TimeAxisView*> get_child_list();
 
        /* The editor calls these when mapping an operation across multiple tracks */
-       void use_new_playlist (bool prompt);
-       void use_copy_playlist (bool prompt);
+       void use_new_playlist (bool prompt, vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
+       void use_copy_playlist (bool prompt, vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
        void clear_playlist ();
+
+       /* group playlist name resolving */
+       std::string resolve_new_group_playlist_name(std::string &, vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
+
        
        void build_playlist_menu (Gtk::Menu *);