From 3c42365762079289499bdc25144bb90b2e3509c6 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 23 Mar 2018 00:28:40 +0000 Subject: [PATCH] Add space shortcut to start/stop playback (#1201). --- ChangeLog | 4 ++++ src/tools/dcpomatic.cc | 20 ++++++++++++++++---- src/tools/dcpomatic_player.cc | 28 ++++++++++++++++++++++++---- src/wx/film_viewer.h | 8 ++++++-- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 73f384901..9c59092e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2018-03-23 Carl Hetherington + + * Add space shortcut to start/stop playback (#1201). + 2018-03-22 Carl Hetherington * Allow CPL selection in player (#1239). diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 2285cccff..982e38e67 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -218,7 +218,8 @@ enum { ID_help_report_a_problem, /* IDs for shortcuts (with no associated menu item) */ ID_add_file, - ID_remove + ID_remove, + ID_start_stop }; class DOMFrame : public wxFrame @@ -328,18 +329,20 @@ public: overall_panel->SetSizer (main_sizer); #ifdef __WXOSX__ - int accelerators = 3; + int accelerators = 4; #else - int accelerators = 2; + int accelerators = 3; #endif wxAcceleratorEntry* accel = new wxAcceleratorEntry[accelerators]; accel[0].Set (wxACCEL_CTRL, static_cast('A'), ID_add_file); accel[1].Set (wxACCEL_NORMAL, WXK_DELETE, ID_remove); + accel[2].Set (wxACCEL_NORMAL, WXK_SPACE, ID_start_stop); #ifdef __WXOSX__ - accel[2].Set (wxACCEL_CTRL, static_cast('W'), wxID_EXIT); + accel[3].Set (wxACCEL_CTRL, static_cast('W'), wxID_EXIT); #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), ID_start_stop); wxAcceleratorTable accel_table (accelerators, accel); SetAcceleratorTable (accel_table); delete[] accel; @@ -1201,6 +1204,15 @@ private: _update_news_requested = false; } + void start_stop_pressed () + { + if (_film_viewer->playing()) { + _film_viewer->stop(); + } else { + _film_viewer->start(); + } + } + FilmEditor* _film_editor; FilmViewer* _film_viewer; VideoWaveformDialog* _video_waveform_dialog; diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index a765bd1d1..39826df1b 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -83,6 +83,8 @@ enum { ID_help_report_a_problem, ID_tools_verify, ID_tools_check_for_updates, + /* IDs for shortcuts (with no associated menu item) */ + ID_start_stop }; class DOMFrame : public wxFrame @@ -147,12 +149,21 @@ public: overall_panel->SetSizer (main_sizer); #ifdef __WXOSX__ - wxAcceleratorEntry* accel = new wxAcceleratorEntry[1]; - accel[0].Set(wxACCEL_CTRL, static_cast('W'), ID_file_close); - wxAcceleratorTable accel_table (1, accel); + int accelerators = 2; +#else + int accelerators = 1; +#endif + + wxAcceleratorEntry* accel = new wxAcceleratorEntry[accelerators]; + accel[0].Set(wxACCEL_NORMAL, WXK_SPACE, ID_start_stop); +#ifdef __WXOSX__ + accel[1].Set(wxACCEL_CTRL, static_cast('W'), ID_file_close); +#endif + wxAcceleratorTable accel_table (accelerators, accel); SetAcceleratorTable (accel_table); delete[] accel; -#endif + + Bind (wxEVT_MENU, boost::bind (&DOMFrame::start_stop_pressed, this), ID_start_stop); UpdateChecker::instance()->StateChanged.connect (boost::bind (&DOMFrame::update_checker_state_changed, this)); } @@ -553,6 +564,15 @@ private: _view_cpl->Enable (static_cast(_film)); } + void start_stop_pressed () + { + if (_viewer->playing()) { + _viewer->stop(); + } else { + _viewer->start(); + } + } + bool _update_news_requested; PlayerInformation* _info; wxPreferencesEditor* _config_dialog; diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h index a41cb310e..190396601 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -66,6 +66,12 @@ public: return _dropped; } + void start (); + bool stop (); + bool playing () const { + return _playing; + } + int audio_callback (void* out, unsigned int frames); boost::signals2::signal)> ImageChanged; @@ -100,8 +106,6 @@ private: void recreate_butler (); void config_changed (Config::Property); DCPTime time () const; - void start (); - bool stop (); Frame average_latency () const; DCPTime one_video_frame () const; -- 2.30.2