From de53fac3032b87017d83e3f44101eb3edf76888a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 16 Sep 2015 01:20:27 +0200 Subject: pre-sort recent-sessions by modification time - #6575 --- gtk2_ardour/session_dialog.cc | 27 +++++++++++++++++++++++---- gtk2_ardour/session_dialog.h | 6 +++--- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc index e65ef5a552..13d114c770 100644 --- a/gtk2_ardour/session_dialog.cc +++ b/gtk2_ardour/session_dialog.cc @@ -24,6 +24,9 @@ #include #include +#include +#include + #include #include "pbd/failed_constructor.h" @@ -582,11 +585,12 @@ int SessionDialog::redisplay_recent_sessions () { std::vector session_directories; - RecentSessionsSorter cmp; + RecentSessionsTimeSorter cmp; recent_session_display.set_model (Glib::RefPtr(0)); recent_session_model->clear (); + // code below is a near from ARDOUR_UI::redisplay_recent_sessions() ARDOUR::RecentSessions rs; ARDOUR::read_recent_sessions (rs); @@ -594,11 +598,26 @@ SessionDialog::redisplay_recent_sessions () recent_session_display.set_model (recent_session_model); return 0; } - // - // sort them alphabetically - sort (rs.begin(), rs.end(), cmp); + // sort by session modificaion time. + // TODO it would be nicer to sort using the model (and make the TV sortable) + std::vector< std::pair > rss; for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) { + std::vector state_file_paths; + get_state_files_in_directory ((*i).second, state_file_paths); + if (state_file_paths.empty()) { + continue; + } + GStatBuf gsb; + if (g_stat (state_file_paths.front().c_str(), &gsb)) { + continue; + } + rss.push_back (std::make_pair((int64_t)gsb.st_mtime, (*i).second)); + } + + sort (rss.begin(), rss.end(), cmp); + + for (std::vector< std::pair >::iterator i = rss.begin(); i != rss.end(); ++i) { session_directories.push_back ((*i).second); } diff --git a/gtk2_ardour/session_dialog.h b/gtk2_ardour/session_dialog.h index ef3717b778..7b79b0bff6 100644 --- a/gtk2_ardour/session_dialog.h +++ b/gtk2_ardour/session_dialog.h @@ -102,9 +102,9 @@ class SessionDialog : public ArdourDialog { void setup_existing_session_page (); - struct RecentSessionsSorter { - bool operator() (std::pair a, std::pair b) const { - return ARDOUR::cmp_nocase(a.first, b.first) == -1; + struct RecentSessionsTimeSorter { + bool operator() (std::pair a, std::pair b) const { + return a.first > b.first; } }; -- cgit v1.2.3