X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic.cc;h=aa37f2fb7d81b37099ef0765f43b2a56ec8e8533;hp=1f320f088ec57be6c0aba504b78ae2b995d044a5;hb=ad5c8849fc3ef5aad88201f28db5474a60db4436;hpb=94056bf7f8fdef32da3cd78eff68d58560b4e6be diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 1f320f088..aa37f2fb7 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -38,6 +38,8 @@ #include "wx/content_panel.h" #include "wx/report_problem_dialog.h" #include "wx/video_waveform_dialog.h" +#include "wx/save_template_dialog.h" +#include "wx/templates_dialog.h" #include "lib/film.h" #include "lib/config.h" #include "lib/util.h" @@ -143,6 +145,7 @@ enum { ID_file_new = 1, ID_file_open, ID_file_save, + ID_file_save_as_template, ID_file_history, /* Allow spare IDs after _history for the recent files list */ ID_content_scale_to_fit_width = 100, @@ -156,6 +159,7 @@ enum { ID_tools_video_waveform, ID_tools_hints, ID_tools_encoding_servers, + ID_tools_manage_templates, ID_tools_check_for_updates, ID_tools_restore_default_preferences, ID_help_report_a_problem, @@ -174,6 +178,7 @@ public: , _servers_list_dialog (0) , _config_dialog (0) , _kdm_dialog (0) + , _templates_dialog (0) , _file_menu (0) , _history_items (0) , _history_position (0) @@ -207,27 +212,29 @@ public: _config_changed_connection = Config::instance()->Changed.connect (boost::bind (&DOMFrame::config_changed, this)); config_changed (); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_new, this), ID_file_new); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_open, this), ID_file_open); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_save, this), ID_file_save); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_history, this, _1), ID_file_history, ID_file_history + HISTORY_SIZE); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_exit, this), wxID_EXIT); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::edit_preferences, this), wxID_PREFERENCES); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::content_scale_to_fit_width, this), ID_content_scale_to_fit_width); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::content_scale_to_fit_height, this), ID_content_scale_to_fit_height); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::jobs_make_dcp, this), ID_jobs_make_dcp); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::jobs_make_kdms, this), ID_jobs_make_kdms); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::jobs_make_dcp_batch, this), ID_jobs_make_dcp_batch); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::jobs_make_self_dkdm, this), ID_jobs_make_self_dkdm); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::jobs_send_dcp_to_tms, this), ID_jobs_send_dcp_to_tms); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::jobs_show_dcp, this), ID_jobs_show_dcp); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_video_waveform, this), ID_tools_video_waveform); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_hints, this), ID_tools_hints); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_encoding_servers, this), ID_tools_encoding_servers); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_check_for_updates, this), ID_tools_check_for_updates); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_restore_default_preferences, this), ID_tools_restore_default_preferences); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::help_about, this), wxID_ABOUT); - Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::help_report_a_problem, this), ID_help_report_a_problem); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_new, this), ID_file_new); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_open, this), ID_file_open); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_save, this), ID_file_save); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_save_as_template, this), ID_file_save_as_template); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_history, this, _1), ID_file_history, ID_file_history + HISTORY_SIZE); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_exit, this), wxID_EXIT); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_preferences, this), wxID_PREFERENCES); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::content_scale_to_fit_width, this), ID_content_scale_to_fit_width); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::content_scale_to_fit_height, this), ID_content_scale_to_fit_height); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dcp, this), ID_jobs_make_dcp); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_kdms, this), ID_jobs_make_kdms); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dcp_batch, this), ID_jobs_make_dcp_batch); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_self_dkdm, this), ID_jobs_make_self_dkdm); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_send_dcp_to_tms, this), ID_jobs_send_dcp_to_tms); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_show_dcp, this), ID_jobs_show_dcp); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_video_waveform, this), ID_tools_video_waveform); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_hints, this), ID_tools_hints); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_encoding_servers, this), ID_tools_encoding_servers); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_manage_templates, this), ID_tools_manage_templates); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_check_for_updates, this), ID_tools_check_for_updates); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_restore_default_preferences, this), ID_tools_restore_default_preferences); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_about, this), wxID_ABOUT); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_report_a_problem, this), ID_help_report_a_problem); Bind (wxEVT_CLOSE_WINDOW, boost::bind (&DOMFrame::close, this, _1)); @@ -238,7 +245,7 @@ public: _film_viewer = new FilmViewer (overall_panel); _film_editor = new FilmEditor (overall_panel, _film_viewer); - JobManagerView* job_manager_view = new JobManagerView (overall_panel); + JobManagerView* job_manager_view = new JobManagerView (overall_panel, false); wxBoxSizer* right_sizer = new wxBoxSizer (wxVERTICAL); right_sizer->Add (_film_viewer, 2, wxEXPAND | wxALL, 6); @@ -278,9 +285,12 @@ public: } } - void new_film (boost::filesystem::path path) + void new_film (boost::filesystem::path path, optional template_name) { shared_ptr film (new Film (path)); + if (template_name) { + film->use_template (template_name.get()); + } film->write_metadata (); film->set_name (path.filename().generic_string()); set_film (film); @@ -317,8 +327,12 @@ public: _film = film; _film_viewer->set_film (_film); _film_editor->set_film (_film); + delete _video_waveform_dialog; + _video_waveform_dialog = 0; set_menu_sensitivity (); - Config::instance()->add_to_history (_film->directory ()); + if (_film->directory()) { + Config::instance()->add_to_history (_film->directory().get()); + } } shared_ptr film () const { @@ -344,27 +358,27 @@ private: if (r == wxID_OK) { - if (boost::filesystem::is_directory (d->get_path()) && !boost::filesystem::is_empty(d->get_path())) { + if (boost::filesystem::is_directory (d->path()) && !boost::filesystem::is_empty(d->path())) { if (!confirm_dialog ( this, std_to_wx ( String::compose (wx_to_std (_("The directory %1 already exists and is not empty. " "Are you sure you want to use it?")), - d->get_path().string().c_str()) + d->path().string().c_str()) ) )) { return; } - } else if (boost::filesystem::is_regular_file (d->get_path())) { + } else if (boost::filesystem::is_regular_file (d->path())) { error_dialog ( this, - String::compose (wx_to_std (_("%1 already exists as a file, so you cannot use it for a new film.")), d->get_path().c_str()) + String::compose (wx_to_std (_("%1 already exists as a file, so you cannot use it for a new film.")), d->path().c_str()) ); return; } if (maybe_save_then_delete_film ()) { - new_film (d->get_path ()); + new_film (d->path(), d->template_name()); } } @@ -402,6 +416,16 @@ private: _film->write_metadata (); } + void file_save_as_template () + { + SaveTemplateDialog* d = new SaveTemplateDialog (this); + int const r = d->ShowModal (); + if (r == wxID_OK) { + Config::instance()->save_template (_film, d->name ()); + } + d->Destroy (); + } + void file_history (wxCommandEvent& event) { vector history = Config::instance()->history (); @@ -494,7 +518,7 @@ private: } _kdm_dialog = new KDMDialog (this, _film); - _kdm_dialog->Show (this); + _kdm_dialog->Show (); } void jobs_make_dcp_batch () @@ -526,7 +550,8 @@ private: boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve (query); Socket socket (5); socket.connect (*endpoint_iterator); - string s = _film->directory().string (); + DCPOMATIC_ASSERT (_film->directory ()); + string s = _film->directory()->string (); socket.write (s.length() + 1); socket.write ((uint8_t *) s.c_str(), s.length() + 1); /* OK\0 */ @@ -614,6 +639,7 @@ private: void jobs_show_dcp () { + DCPOMATIC_ASSERT (_film->directory ()); #ifdef DCPOMATIC_WINDOWS wstringstream args; args << "/select," << _film->dir (_film->dcp_name(false)); @@ -623,14 +649,14 @@ private: #ifdef DCPOMATIC_LINUX int r = system ("which nautilus"); if (WEXITSTATUS (r) == 0) { - r = system (string ("nautilus " + _film->directory().string()).c_str ()); + r = system (string ("nautilus " + _film->directory()->string()).c_str ()); if (WEXITSTATUS (r)) { error_dialog (this, _("Could not show DCP (could not run nautilus)")); } } else { int r = system ("which konqueror"); if (WEXITSTATUS (r) == 0) { - r = system (string ("konqueror " + _film->directory().string()).c_str ()); + r = system (string ("konqueror " + _film->directory()->string()).c_str ()); if (WEXITSTATUS (r)) { error_dialog (this, _("Could not show DCP (could not run konqueror)")); } @@ -649,7 +675,7 @@ private: void tools_video_waveform () { if (!_video_waveform_dialog) { - _video_waveform_dialog = new VideoWaveformDialog (this, _film_viewer); + _video_waveform_dialog = new VideoWaveformDialog (this, _film, _film_viewer); } _video_waveform_dialog->Show (); @@ -673,6 +699,15 @@ private: _servers_list_dialog->Show (); } + void tools_manage_templates () + { + if (!_templates_dialog) { + _templates_dialog = new TemplatesDialog (this); + } + + _templates_dialog->Show (); + } + void tools_check_for_updates () { UpdateChecker::instance()->run (); @@ -824,6 +859,8 @@ private: add_item (_file_menu, _("&Open...\tCtrl-O"), ID_file_open, ALWAYS); _file_menu->AppendSeparator (); add_item (_file_menu, _("&Save\tCtrl-S"), ID_file_save, NEEDS_FILM); + _file_menu->AppendSeparator (); + add_item (_file_menu, _("Save as &template..."), ID_file_save_as_template, NEEDS_FILM); _history_position = _file_menu->GetMenuItems().GetCount(); @@ -860,6 +897,7 @@ private: add_item (tools, _("Video waveform..."), ID_tools_video_waveform, NEEDS_FILM); add_item (tools, _("Hints..."), ID_tools_hints, 0); add_item (tools, _("Encoding servers..."), ID_tools_encoding_servers, 0); + add_item (tools, _("Manage templates..."), ID_tools_manage_templates, 0); add_item (tools, _("Check for updates"), ID_tools_check_for_updates, 0); tools->AppendSeparator (); add_item (tools, _("Restore default preferences"), ID_tools_restore_default_preferences, ALWAYS); @@ -950,6 +988,7 @@ private: ServersListDialog* _servers_list_dialog; wxPreferencesEditor* _config_dialog; KDMDialog* _kdm_dialog; + TemplatesDialog* _templates_dialog; wxMenu* _file_menu; shared_ptr _film; int _history_items; @@ -1053,7 +1092,7 @@ private: } if (!_film_to_create.empty ()) { - _frame->new_film (_film_to_create); + _frame->new_film (_film_to_create, optional ()); if (!_content_to_add.empty ()) { _frame->film()->examine_and_add_content (content_factory (_frame->film(), _content_to_add)); }