summaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-08-25 16:33:55 +0100
committerCarl Hetherington <cth@carlh.net>2014-08-25 16:33:55 +0100
commit7edf8e601ed2ede5b6758840fb9d8940393cf7e2 (patch)
treea3c5b068c226cd503219ba0bf6a02a4209dad6cd /src/tools
parent49e401f651ccf6c409fc84f57aa205f1920ef070 (diff)
Basic recent files list in the File menu.
Suggested-by: Carsten Kurz
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/dcpomatic.cc103
1 files changed, 82 insertions, 21 deletions
diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc
index cf6be18f6..09aebd39c 100644
--- a/src/tools/dcpomatic.cc
+++ b/src/tools/dcpomatic.cc
@@ -63,6 +63,7 @@
using std::cout;
using std::string;
+using std::vector;
using std::wstring;
using std::map;
using std::make_pair;
@@ -116,7 +117,9 @@ enum {
ID_file_open,
ID_file_save,
ID_file_properties,
- ID_content_scale_to_fit_width,
+ ID_file_history,
+ /* Allow spare IDs after _history for the recent files list */
+ ID_content_scale_to_fit_width = 100,
ID_content_scale_to_fit_height,
ID_jobs_make_dcp,
ID_jobs_make_kdms,
@@ -135,6 +138,10 @@ public:
, _hints_dialog (0)
, _servers_list_dialog (0)
, _config_dialog (0)
+ , _file_menu (0)
+ , _history_items (0)
+ , _history_position (0)
+ , _history_separator (0)
{
#if defined(DCPOMATIC_WINDOWS) && defined(DCPOMATIC_WINDOWS_CONSOLE)
AllocConsole();
@@ -156,10 +163,14 @@ public:
setup_menu (bar);
SetMenuBar (bar);
+ Config::instance()->Changed.connect (boost::bind (&Frame::config_changed, this));
+ config_changed ();
+
Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_new, this), ID_file_new);
Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_open, this), ID_file_open);
Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_save, this), ID_file_save);
Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_properties, this), ID_file_properties);
+ Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_history, this, _1), ID_file_history, ID_file_history + HISTORY_SIZE);
Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_exit, this), wxID_EXIT);
Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::edit_preferences, this), wxID_PREFERENCES);
Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::content_scale_to_fit_width, this), ID_content_scale_to_fit_width);
@@ -211,7 +222,10 @@ public:
}
void load_film (boost::filesystem::path file)
+ try
{
+ maybe_save_then_delete_film ();
+
shared_ptr<Film> film (new Film (file));
list<string> const notes = film->read_metadata ();
@@ -229,6 +243,11 @@ public:
set_film (film);
}
+ catch (std::exception& e) {
+ wxString p = std_to_wx (file.string ());
+ wxCharBuffer b = p.ToUTF8 ();
+ error_dialog (this, wxString::Format (_("Could not open film at %s (%s)"), p.data(), std_to_wx (e.what()).data()));
+ }
void set_film (shared_ptr<Film> film)
{
@@ -236,6 +255,7 @@ public:
_film_viewer->set_film (_film);
_film_editor->set_film (_film);
set_menu_sensitivity ();
+ Config::instance()->add_to_history (_film->directory ());
}
shared_ptr<Film> film () const {
@@ -307,14 +327,7 @@ private:
}
if (r == wxID_OK) {
- maybe_save_then_delete_film ();
- try {
- load_film (wx_to_std (c->GetPath ()));
- } catch (std::exception& e) {
- wxString p = c->GetPath ();
- wxCharBuffer b = p.ToUTF8 ();
- error_dialog (this, wxString::Format (_("Could not open film at %s (%s)"), p.data(), std_to_wx (e.what()).data()));
- }
+ load_film (wx_to_std (c->GetPath ()));
}
c->Destroy ();
@@ -331,6 +344,15 @@ private:
d->ShowModal ();
d->Destroy ();
}
+
+ void file_history (wxCommandEvent& event)
+ {
+ vector<boost::filesystem::path> history = Config::instance()->history ();
+ int n = event.GetId() - ID_file_history;
+ if (n >= 0 && n < static_cast<int> (history.size ())) {
+ load_film (history[n]);
+ }
+ }
void file_exit ()
{
@@ -561,25 +583,28 @@ private:
void setup_menu (wxMenuBar* m)
{
- wxMenu* file = new wxMenu;
- add_item (file, _("New..."), ID_file_new, ALWAYS);
- add_item (file, _("&Open..."), ID_file_open, ALWAYS);
- file->AppendSeparator ();
- add_item (file, _("&Save"), ID_file_save, NEEDS_FILM);
- file->AppendSeparator ();
- add_item (file, _("&Properties..."), ID_file_properties, NEEDS_FILM);
+ _file_menu = new wxMenu;
+ add_item (_file_menu, _("New..."), ID_file_new, ALWAYS);
+ add_item (_file_menu, _("&Open..."), ID_file_open, ALWAYS);
+ _file_menu->AppendSeparator ();
+ add_item (_file_menu, _("&Save"), ID_file_save, NEEDS_FILM);
+ _file_menu->AppendSeparator ();
+ add_item (_file_menu, _("&Properties..."), ID_file_properties, NEEDS_FILM);
+
+ _history_position = _file_menu->GetMenuItems().GetCount();
+
#ifndef __WXOSX__
- file->AppendSeparator ();
+ _file_menu->AppendSeparator ();
#endif
#ifdef __WXOSX__
- add_item (file, _("&Exit"), wxID_EXIT, ALWAYS);
+ add_item (_file_menu, _("&Exit"), wxID_EXIT, ALWAYS);
#else
- add_item (file, _("&Quit"), wxID_EXIT, ALWAYS);
+ add_item (_file_menu, _("&Quit"), wxID_EXIT, ALWAYS);
#endif
#ifdef __WXOSX__
- add_item (file, _("&Preferences..."), wxID_PREFERENCES, ALWAYS);
+ add_item (_file_menu, _("&Preferences..."), wxID_PREFERENCES, ALWAYS);
#else
wxMenu* edit = new wxMenu;
add_item (edit, _("&Preferences..."), wxID_PREFERENCES, ALWAYS);
@@ -607,7 +632,7 @@ private:
add_item (help, _("About"), wxID_ABOUT, ALWAYS);
#endif
- m->Append (file, _("&File"));
+ m->Append (_file_menu, _("&File"));
#ifndef __WXOSX__
m->Append (edit, _("&Edit"));
#endif
@@ -616,13 +641,49 @@ private:
m->Append (tools, _("&Tools"));
m->Append (help, _("&Help"));
}
+
+ void config_changed ()
+ {
+ for (int i = 0; i < _history_items; ++i) {
+ delete _file_menu->Remove (ID_file_history + i);
+ }
+
+ if (_history_separator) {
+ _file_menu->Remove (_history_separator);
+ }
+ delete _history_separator;
+ _history_separator = 0;
+
+ int pos = _history_position;
+
+ vector<boost::filesystem::path> history = Config::instance()->history ();
+
+ if (!history.empty ()) {
+ _history_separator = _file_menu->InsertSeparator (pos++);
+ }
+
+ for (size_t i = 0; i < history.size(); ++i) {
+ SafeStringStream s;
+ if (i < 9) {
+ s << "&" << (i + 1) << " ";
+ }
+ s << history[i].string();
+ _file_menu->Insert (pos++, ID_file_history + i, std_to_wx (s.str ()));
+ }
+
+ _history_items = history.size ();
+ }
FilmEditor* _film_editor;
FilmViewer* _film_viewer;
HintsDialog* _hints_dialog;
ServersListDialog* _servers_list_dialog;
wxPreferencesEditor* _config_dialog;
+ wxMenu* _file_menu;
shared_ptr<Film> _film;
+ int _history_items;
+ int _history_position;
+ wxMenuItem* _history_separator;
};
static const wxCmdLineEntryDesc command_line_description[] = {