X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic.cc;h=9262be1b5f71a5123df1311f62ab3ccacc5b0e73;hb=27b83475435dda4e84a90cf59a52f150905c4ab1;hp=33e90aef35260306b29562ea2e625e7ed9c58fed;hpb=7ec4cb260c6f1bade4bbe515f91ebe8b3572472c;p=dcpomatic.git diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 33e90aef3..9262be1b5 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -44,6 +44,7 @@ #include "wx/nag_dialog.h" #include "wx/export_dialog.h" #include "wx/paste_dialog.h" +#include "wx/focus_manager.h" #include "lib/film.h" #include "lib/config.h" #include "lib/util.h" @@ -70,7 +71,7 @@ #include "lib/transcode_job.h" #include "lib/dkdm_wrapper.h" #include "lib/audio_content.h" -#include "lib/subtitle_content.h" +#include "lib/caption_content.h" #include #include #include @@ -109,6 +110,7 @@ using std::exception; using boost::shared_ptr; using boost::dynamic_pointer_cast; using boost::optional; +using boost::function; using dcp::raw_convert; class FilmChangedClosingDialog : public boost::noncopyable @@ -209,6 +211,7 @@ enum { ID_jobs_export, ID_jobs_send_dcp_to_tms, ID_jobs_show_dcp, + ID_jobs_open_dcp_in_player, ID_tools_video_waveform, ID_tools_hints, ID_tools_encoding_servers, @@ -293,6 +296,7 @@ public: Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_export, this), ID_jobs_export); 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::jobs_open_dcp_in_player, this), ID_jobs_open_dcp_in_player); 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); @@ -331,6 +335,15 @@ public: overall_panel->SetSizer (main_sizer); + UpdateChecker::instance()->StateChanged.connect (boost::bind (&DOMFrame::update_checker_state_changed, this)); + + FocusManager::instance()->SetFocus.connect (boost::bind (&DOMFrame::remove_accelerators, this)); + FocusManager::instance()->KillFocus.connect (boost::bind (&DOMFrame::add_accelerators, this)); + add_accelerators (); + } + + void add_accelerators () + { #ifdef __WXOSX__ int accelerators = 7; #else @@ -348,15 +361,18 @@ public: #endif Bind (wxEVT_MENU, boost::bind (&ContentPanel::add_file_clicked, _film_editor->content_panel()), ID_add_file); Bind (wxEVT_MENU, boost::bind (&DOMFrame::remove_clicked, this, _1), ID_remove); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::start_stop_pressed, this, _1), ID_start_stop); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::start_stop_pressed, this), ID_start_stop); Bind (wxEVT_MENU, boost::bind (&DOMFrame::timeline_pressed, this), ID_timeline); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::back_frame, this, _1), ID_back_frame); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::forward_frame, this, _1), ID_forward_frame); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::back_frame, this), ID_back_frame); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::forward_frame, this), ID_forward_frame); wxAcceleratorTable accel_table (accelerators, accel); SetAcceleratorTable (accel_table); delete[] accel; + } - UpdateChecker::instance()->StateChanged.connect (boost::bind (&DOMFrame::update_checker_state_changed, this)); + void remove_accelerators () + { + SetAcceleratorTable (wxAcceleratorTable ()); } void remove_clicked (wxCommandEvent& ev) @@ -547,7 +563,7 @@ private: { DCPOMATIC_ASSERT (_clipboard); - PasteDialog* d = new PasteDialog (this, static_cast(_clipboard->video), static_cast(_clipboard->audio), static_cast(_clipboard->subtitle)); + PasteDialog* d = new PasteDialog (this, static_cast(_clipboard->video), static_cast(_clipboard->audio), static_cast(_clipboard->caption)); if (d->ShowModal() == wxID_OK) { BOOST_FOREACH (shared_ptr i, _film_editor->content_panel()->selected()) { if (d->video() && i->video) { @@ -558,9 +574,9 @@ private: DCPOMATIC_ASSERT (_clipboard->audio); i->audio->take_settings_from (_clipboard->audio); } - if (d->subtitle() && i->subtitle) { - DCPOMATIC_ASSERT (_clipboard->subtitle); - i->subtitle->take_settings_from (_clipboard->subtitle); + if (d->caption() && i->caption) { + DCPOMATIC_ASSERT (_clipboard->caption); + i->caption->take_settings_from (_clipboard->caption); } } } @@ -667,55 +683,73 @@ private: _kdm_dialog->Show (); } - void jobs_make_dcp_batch () + /** @return false if we succeeded, true if not */ + bool send_to_other_tool (int port, function start, string message) { - if (!_film) { - return; - } - - if (!get_hints(_film).empty() && Config::instance()->show_hints_before_make_dcp()) { - HintsDialog* hints = new HintsDialog (this, _film, false); - int const r = hints->ShowModal(); - hints->Destroy (); - if (r == wxID_CANCEL) { - return; - } - } - - _film->write_metadata (); - /* i = 0; try to connect via socket - i = 1; try again, and then try to start the batch converter + i = 1; try again, and then try to start the tool i = 2 onwards; try again. */ for (int i = 0; i < 8; ++i) { try { boost::asio::io_service io_service; boost::asio::ip::tcp::resolver resolver (io_service); - boost::asio::ip::tcp::resolver::query query ("127.0.0.1", raw_convert (BATCH_JOB_PORT)); + boost::asio::ip::tcp::resolver::query query ("127.0.0.1", raw_convert (port)); boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve (query); Socket socket (5); socket.connect (*endpoint_iterator); DCPOMATIC_ASSERT (_film->directory ()); - string s = _film->directory()->string (); - socket.write (s.length() + 1); - socket.write ((uint8_t *) s.c_str(), s.length() + 1); + socket.write (message.length() + 1); + socket.write ((uint8_t *) message.c_str(), message.length() + 1); /* OK\0 */ uint8_t ok[3]; socket.read (ok, 3); - return; + return false; } catch (exception& e) { } if (i == 1) { - start_batch_converter (wx_to_std (wxStandardPaths::Get().GetExecutablePath())); + start (wx_to_std (wxStandardPaths::Get().GetExecutablePath())); } dcpomatic_sleep (1); } - error_dialog (this, _("Could not find batch converter.")); + return true; + } + + void jobs_make_dcp_batch () + { + if (!_film) { + return; + } + + if (!get_hints(_film).empty() && Config::instance()->show_hints_before_make_dcp()) { + HintsDialog* hints = new HintsDialog (this, _film, false); + int const r = hints->ShowModal(); + hints->Destroy (); + if (r == wxID_CANCEL) { + return; + } + } + + _film->write_metadata (); + + if (send_to_other_tool (BATCH_JOB_PORT, bind (&start_batch_converter, _1), _film->directory()->string())) { + error_dialog (this, _("Could not find batch converter.")); + } + } + + void jobs_open_dcp_in_player () + { + if (!_film) { + return; + } + + if (send_to_other_tool (PLAYER_PLAY_PORT, bind (&start_player, _1), _film->dir(_film->dcp_name(false)).string())) { + error_dialog (this, _("Could not find player.")); + } } void jobs_make_self_dkdm () @@ -1099,6 +1133,7 @@ private: jobs_menu->AppendSeparator (); add_item (jobs_menu, _("&Send DCP to TMS"), ID_jobs_send_dcp_to_tms, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); add_item (jobs_menu, _("S&how DCP"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); + add_item (jobs_menu, _("Open DCP in &player"), ID_jobs_open_dcp_in_player, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); wxMenu* tools = new wxMenu; add_item (tools, _("Video waveform..."), ID_tools_video_waveform, NEEDS_FILM); @@ -1213,26 +1248,8 @@ private: _update_news_requested = false; } - /** Skip the given event if we're focussed in a TextCtrl, so that hotkeys don't - * steal from text controls. - */ - bool maybe_pass (wxCommandEvent& ev) - { - wxWindow* f = wxWindow::FindFocus(); - if (!f || !dynamic_cast(f)) { - return false; - } - - ev.Skip(); - return true; - } - - void start_stop_pressed (wxCommandEvent& ev) + void start_stop_pressed () { - if (maybe_pass(ev)) { - return; - } - if (_film_viewer->playing()) { _film_viewer->stop(); } else { @@ -1245,21 +1262,13 @@ private: _film_editor->content_panel()->timeline_clicked (); } - void back_frame (wxCommandEvent& ev) + void back_frame () { - if (maybe_pass(ev)) { - return; - } - _film_viewer->back_frame (); } - void forward_frame (wxCommandEvent& ev) + void forward_frame () { - if (maybe_pass(ev)) { - return; - } - _film_viewer->forward_frame (); }