From 97a96ee250a3efcf8004d7d560f578237bfecc4c Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 20 Sep 2010 19:18:17 +0000 Subject: [PATCH] region list displays actual playlist use count for each region, rather than a GUI-based count git-svn-id: svn://localhost/ardour2/branches/3.0@7814 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor_regions.cc | 55 ++++++++++++++++++++------ gtk2_ardour/editor_regions.h | 1 + libs/ardour/ardour/playlist.h | 1 + libs/ardour/ardour/session_playlists.h | 1 + libs/ardour/playlist.cc | 15 +++++++ libs/ardour/session.cc | 1 + libs/ardour/session_playlists.cc | 17 ++++++++ 7 files changed, 79 insertions(+), 12 deletions(-) diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc index 176b5c6345..a66282a7ef 100644 --- a/gtk2_ardour/editor_regions.cc +++ b/gtk2_ardour/editor_regions.cc @@ -25,11 +25,13 @@ #include "pbd/basename.h" #include "pbd/enumwriter.h" +#include "pbd/stacktrace.h" #include "ardour/audioregion.h" #include "ardour/audiofilesource.h" #include "ardour/region_factory.h" #include "ardour/session.h" +#include "ardour/session_playlists.h" #include "ardour/silentfilesource.h" #include "ardour/profile.h" @@ -62,6 +64,7 @@ EditorRegions::EditorRegions (Editor* e) , _no_redisplay (false) , ignore_region_list_selection_change (false) , ignore_selected_region_change (false) + , expanded (false) { _display.set_size_request (100, -1); _display.set_name ("RegionListDisplay"); @@ -547,6 +550,9 @@ EditorRegions::redisplay () insert_into_tmp_regionlist (i->second); } + stacktrace (cerr, 22); + cerr << "Redisplay with " << tmp_region_list.size() << " regions\n"; + for (list >::iterator r = tmp_region_list.begin(); r != tmp_region_list.end(); ++r) { add_region (*r); } @@ -709,7 +715,7 @@ void EditorRegions::populate_row (boost::shared_ptr region, TreeModel::Row const &row) { boost::shared_ptr audioregion = boost::dynamic_pointer_cast(region); - uint32_t used = _editor->get_regionview_count_from_region_list (region); + uint32_t used = _session->playlists->region_use_count (region); populate_row_position (region, row, used); populate_row_end (region, row, used); @@ -941,8 +947,10 @@ EditorRegions::set_full (bool f) { if (f) { _display.expand_all (); + expanded = true; } else { _display.collapse_all (); + expanded = false; } } @@ -1345,6 +1353,8 @@ EditorRegions::get_state () const void EditorRegions::set_state (const XMLNode & node) { + bool changed = false; + if (node.name() != X_("RegionList")) { return; } @@ -1352,6 +1362,9 @@ EditorRegions::set_state (const XMLNode & node) XMLProperty const * p = node.property (X_("sort-type")); if (p) { Editing::RegionListSortType const t = static_cast (string_2_enum (p->value(), _sort_type)); + if (_sort_type != t) { + changed = true; + } reset_sort_type (t, true); RefPtr ract = sort_type_action (t); ract->set_active (); @@ -1359,10 +1372,17 @@ EditorRegions::set_state (const XMLNode & node) p = node.property (X_("sort-ascending")); if (p) { - bool const a = string_is_affirmative (p->value ()); - reset_sort_direction (a); + bool const yn = string_is_affirmative (p->value ()); + SortType old_sort_type; + int old_sort_column; + + _model->get_sort_column_id (old_sort_column, old_sort_type); + if (old_sort_type != (yn ? SORT_ASCENDING : SORT_DESCENDING)) { + changed = true; + } + reset_sort_direction (yn); RefPtr act; - if (a) { + if (yn) { act = ActionManager::get_action (X_("RegionList"), X_("SortAscending")); } else { act = ActionManager::get_action (X_("RegionList"), X_("SortDescending")); @@ -1373,18 +1393,29 @@ EditorRegions::set_state (const XMLNode & node) p = node.property (X_("show-all")); if (p) { - bool const s = string_is_affirmative (p->value ()); - set_full (s); - toggle_full_action()->set_active (s); + bool const yn = string_is_affirmative (p->value ()); + if (expanded != yn) { + changed = true; + } + set_full (yn); + toggle_full_action()->set_active (yn); } p = node.property (X_("show-automatic-regions")); if (p) { - bool const s = string_is_affirmative (p->value ()); - _show_automatic_regions = s; - redisplay (); - toggle_show_auto_regions_action()->set_active (s); - } + bool const yn = string_is_affirmative (p->value ()); + if (yn != _show_automatic_regions) { + _show_automatic_regions = yn; + toggle_show_auto_regions_action()->set_active (yn); + /* no need to set changed because the above toggle + will have triggered a redisplay + */ + } + } + + if (changed) { + redisplay (); + } } RefPtr diff --git a/gtk2_ardour/editor_regions.h b/gtk2_ardour/editor_regions.h index 43aadaf11b..f899b00c55 100644 --- a/gtk2_ardour/editor_regions.h +++ b/gtk2_ardour/editor_regions.h @@ -176,6 +176,7 @@ private: PBD::ScopedConnection check_new_region_connection; bool ignore_region_list_selection_change; bool ignore_selected_region_change; + bool expanded; }; #endif /* __gtk_ardour_editor_regions_h__ */ diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index 67638cf15e..2cc1f570f4 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -151,6 +151,7 @@ public: uint32_t count_regions_at (framepos_t); RegionList* regions_touched (framepos_t start, framepos_t end); RegionList* regions_to_read (framepos_t start, framepos_t end); + uint32_t region_use_count (boost::shared_ptr) const; boost::shared_ptr find_region (const PBD::ID&) const; boost::shared_ptr top_region_at (framepos_t frame); boost::shared_ptr top_unmuted_region_at (framepos_t frame); diff --git a/libs/ardour/ardour/session_playlists.h b/libs/ardour/ardour/session_playlists.h index 4ca67bdee8..0a20c7b905 100644 --- a/libs/ardour/ardour/session_playlists.h +++ b/libs/ardour/ardour/session_playlists.h @@ -51,6 +51,7 @@ public: boost::shared_ptr by_name (std::string name); boost::shared_ptr by_id (const PBD::ID&); uint32_t source_use_count (boost::shared_ptr src) const; + uint32_t region_use_count (boost::shared_ptr region) const; template void foreach (T *obj, void (T::*func)(boost::shared_ptr)); void get (std::vector >&); void unassigned (std::list > & list); diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 334b3f163d..614c0f5e36 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -2712,6 +2712,21 @@ Playlist::find_region (const ID& id) const return boost::shared_ptr (); } +uint32_t +Playlist::region_use_count (boost::shared_ptr r) const +{ + RegionLock rlock (const_cast (this)); + uint32_t cnt = 0; + + for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) { + if ((*i) == r) { + cnt++; + } + } + + return cnt; +} + boost::shared_ptr Playlist::region_by_id (const ID& id) const { diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 4f18a300af..cda93d050f 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -4024,3 +4024,4 @@ Session::step_edit_status_change (bool yn) } } + diff --git a/libs/ardour/session_playlists.cc b/libs/ardour/session_playlists.cc index b54faba97e..66b4b53b67 100644 --- a/libs/ardour/session_playlists.cc +++ b/libs/ardour/session_playlists.cc @@ -413,3 +413,20 @@ SessionPlaylists::find_crossfade (const PBD::ID& id) return boost::shared_ptr (); } + +uint32_t +SessionPlaylists::region_use_count (boost::shared_ptr region) const +{ + Glib::Mutex::Lock lm (lock); + uint32_t cnt = 0; + + for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) { + cnt += (*i)->region_use_count (region); + } + + for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) { + cnt += (*i)->region_use_count (region); + } + + return cnt; +} -- 2.30.2