summaryrefslogtreecommitdiff
path: root/gtk2_ardour/session_dialog.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-09-16 01:20:27 +0200
committerRobin Gareus <robin@gareus.org>2015-09-16 01:28:55 +0200
commitde53fac3032b87017d83e3f44101eb3edf76888a (patch)
tree0f06086473edc678f4a1bb2170c4fc79e417f04e /gtk2_ardour/session_dialog.cc
parent50a6487e771f24803d82a1a1c6c3938448b07ae2 (diff)
pre-sort recent-sessions by modification time - #6575
Diffstat (limited to 'gtk2_ardour/session_dialog.cc')
-rw-r--r--gtk2_ardour/session_dialog.cc27
1 files changed, 23 insertions, 4 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 <fstream>
#include <algorithm>
+#include <glib.h>
+#include <glib/gstdio.h>
+
#include <gtkmm/filechooser.h>
#include "pbd/failed_constructor.h"
@@ -582,11 +585,12 @@ int
SessionDialog::redisplay_recent_sessions ()
{
std::vector<std::string> session_directories;
- RecentSessionsSorter cmp;
+ RecentSessionsTimeSorter cmp;
recent_session_display.set_model (Glib::RefPtr<TreeModel>(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<int64_t,std::string> > rss;
for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
+ std::vector<std::string> 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<int64_t,std::string> >::iterator i = rss.begin(); i != rss.end(); ++i) {
session_directories.push_back ((*i).second);
}