From b1d9aa4f97c26b45fb3a9e531d5e561c77df0f24 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 26 Jun 2009 17:43:38 +0000 Subject: [PATCH] playlist sort patch from nick_m, improves ordering of playlists in menu. small effect, but nice git-svn-id: http://subversion.ardour.org/svn/ardour2/ardour2/branches/2.0-ongoing@5284 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/route_time_axis.cc | 65 +++++++++++++++++++++++------------------- gtk2_ardour/route_time_axis.h | 2 +- libs/ardour/ardour/playlist.h | 5 ++++ libs/ardour/location.cc | 2 +- libs/ardour/playlist.cc | 37 +++++++++++++++++++++++- 5 files changed, 79 insertions(+), 32 deletions(-) diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index e92960724..63abdc251 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -1354,6 +1354,12 @@ RouteTimeAxisView::get_child_list() } +struct PlaylistSorter { + bool operator() (boost::shared_ptr a, boost::shared_ptr b) const { + return a->sort_id() < b->sort_id(); + } +}; + void RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu) { @@ -1367,33 +1373,32 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu) menu->set_name ("ArdourContextMenu"); playlist_items.clear(); - if (playlist_menu) { - delete playlist_menu; - } - - playlist_menu = new Menu; - playlist_menu->set_name ("ArdourContextMenu"); - - vector > playlists; + vector > playlists, playlists_ds; boost::shared_ptr ds = get_diskstream(); RadioMenuItem::Group playlist_group; - - _session.get_playlists (playlists); - for (vector >::iterator i = playlists.begin(); i != playlists.end(); ++i) { + _session.get_playlists (playlists); - if ((*i)->get_orig_diskstream_id() == ds->id()) { - playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name(), bind (mem_fun (*this, &RouteTimeAxisView::use_playlist), - boost::weak_ptr (*i)))); + /* find the playlists for this diskstream */ + for (vector >::iterator i = playlists.begin(); i != playlists.end(); ++i) { + if (((*i)->get_orig_diskstream_id() == ds->id()) || (ds->playlist()->id() == (*i)->id())) { + playlists_ds.push_back(*i); + } + } + + /* sort the playlists */ + PlaylistSorter cmp; + sort(playlists_ds.begin(), playlists_ds.end(), cmp); + + /* add the playlists to the menu */ + for (vector >::iterator i = playlists_ds.begin(); i != playlists_ds.end(); ++i) { + playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name())); + RadioMenuItem *item = static_cast(&playlist_items.back()); - if (ds->playlist()->id() == (*i)->id()) { - static_cast(&playlist_items.back())->set_active(); - } - } else if (ds->playlist()->id() == (*i)->id()) { - playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name(), bind (mem_fun (*this, &RouteTimeAxisView::use_playlist), - boost::weak_ptr(*i)))); - static_cast(&playlist_items.back())->set_active(); - + item->signal_toggled().connect(bind (mem_fun (*this, &RouteTimeAxisView::use_playlist), item, boost::weak_ptr (*i))); + + if (ds->playlist()->id() == (*i)->id()) { + item->set_active(); } } @@ -1404,26 +1409,28 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu) 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()); - playlist_items.push_back (MenuElem(_("Select from all ..."), mem_fun(*this, &RouteTimeAxisView::show_playlist_selector))); } void -RouteTimeAxisView::use_playlist (boost::weak_ptr wpl) +RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr wpl) { assert (is_track()); + // exit if we were triggered by deactivating the old playlist + if (!item->get_active()) { + return; + } + boost::shared_ptr pl (wpl.lock()); if (!pl) { @@ -1434,13 +1441,13 @@ RouteTimeAxisView::use_playlist (boost::weak_ptr wpl) if (apl) { if (get_diskstream()->playlist() == apl) { - // radio button cotnrols mean this function is called for both the - // old and new playlist + // exit when use_playlist is called by the creation of the playlist menu + // or the playlist choice is unchanged return; } + get_diskstream()->use_playlist (apl); - if (edit_group() && edit_group()->is_active()) { //PBD::stacktrace(cerr, 20); std::string group_string = "."+edit_group()->name()+"."; diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index 75862965a..2aa33c3cf 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -249,7 +249,7 @@ protected: Gtk::Menu* playlist_action_menu; Gtk::MenuItem* playlist_item; - void use_playlist (boost::weak_ptr); + void use_playlist (Gtk::RadioMenuItem*, boost::weak_ptr); ArdourCanvas::SimpleRect* timestretch_rect; diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index 232c0c15d..9e30130d7 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -68,6 +68,8 @@ class Playlist : public PBD::StatefulDestructible, public boost::enable_shared_f std::string name() const { return _name; } void set_name (std::string str); + + int sort_id() { return _sort_id; } bool frozen() const { return _frozen; } void set_frozen (bool yn); @@ -178,6 +180,7 @@ class Playlist : public PBD::StatefulDestructible, public boost::enable_shared_f RegionList regions; /* the current list of regions in the playlist */ std::set > all_regions; /* all regions ever added to this playlist */ string _name; + int _sort_id; Session& _session; mutable gint block_notifications; mutable gint ignore_state_changes; @@ -221,6 +224,8 @@ class Playlist : public PBD::StatefulDestructible, public boost::enable_shared_f void delay_notifications (); void release_notifications (); virtual void flush_notifications (); + + void _set_sort_id (); void notify_region_removed (boost::shared_ptr); void notify_region_added (boost::shared_ptr); diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc index 61471ee5b..103074511 100644 --- a/libs/ardour/location.cc +++ b/libs/ardour/location.cc @@ -377,7 +377,7 @@ Location::set_state (const XMLNode& node) */ _start = atoi (prop->value().c_str()); - + if ((prop = node.property ("end")) == 0) { error << _("XML node for Location has no end information") << endmsg; return -1; diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 9960074e9..eae97e19d 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -39,6 +39,8 @@ #include #include +#include + #include "i18n.h" using namespace std; @@ -78,7 +80,7 @@ Playlist::Playlist (Session& sess, string nom, bool hide) init (hide); first_set_state = false; _name = nom; - + _set_sort_id(); } Playlist::Playlist (Session& sess, const XMLNode& node, bool hide) @@ -86,6 +88,7 @@ Playlist::Playlist (Session& sess, const XMLNode& node, bool hide) { init (hide); _name = "unnamed"; /* reset by set_state */ + _set_sort_id(); /* set state called by derived class */ } @@ -270,6 +273,35 @@ Playlist::~Playlist () } void +Playlist::_set_sort_id () +{ + /* + Playlists are given names like . + or .. where id + is an integer. We extract the id and sort by that. + */ + + size_t dot_position = _name.find_last_of("."); + if (dot_position == string::npos) + { + _sort_id = 0; + } + else + { + string t = _name.substr(dot_position + 1); + + try + { + _sort_id = boost::lexical_cast(t); + } + catch (boost::bad_lexical_cast e) + { + _sort_id = 0; + } + } +} + +void Playlist::set_name (string str) { /* in a typical situation, a playlist is being used @@ -293,6 +325,8 @@ Playlist::set_name (string str) } _name = name; + _set_sort_id(); + NameChanged(); /* EMIT SIGNAL */ } @@ -1730,6 +1764,7 @@ Playlist::set_state (const XMLNode& node) if (prop->name() == X_("name")) { _name = prop->value(); + _set_sort_id(); } else if (prop->name() == X_("orig_diskstream_id")) { _orig_diskstream_id = prop->value (); } else if (prop->name() == X_("frozen")) { -- 2.11.4.GIT