From 53c7f717da44c6ff681bde8946875e4f39764b25 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 14 Sep 2018 20:35:36 +0100 Subject: [PATCH] Allow configurable start mode for player. --- src/lib/config.cc | 21 ++++++++++++++++ src/lib/config.h | 15 ++++++++++++ src/tools/dcpomatic_player.cc | 38 +++++++++++++--------------- src/wx/player_config_dialog.cc | 45 ++++++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 21 deletions(-) diff --git a/src/lib/config.cc b/src/lib/config.cc index 0baaf487c..30271283b 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -163,6 +163,7 @@ Config::set_defaults () _gdc_username = optional(); _gdc_password = optional(); _interface_complexity = INTERFACE_SIMPLE; + _player_mode = PLAYER_MODE_WINDOW; _allowed_dcp_frame_rates.clear (); _allowed_dcp_frame_rates.push_back (24); @@ -481,6 +482,14 @@ try if (ic && *ic == "full") { _interface_complexity = INTERFACE_FULL; } + optional pm = f.optional_string_child("PlayerMode"); + if (pm && *pm == "window") { + _player_mode = PLAYER_MODE_WINDOW; + } else if (pm && *pm == "full") { + _player_mode = PLAYER_MODE_FULL; + } else if (pm && *pm == "dual") { + _player_mode = PLAYER_MODE_DUAL; + } /* Replace any cinemas from config.xml with those from the configured file */ if (boost::filesystem::exists (_cinemas_file)) { @@ -855,6 +864,18 @@ Config::write_config () const break; } + switch (_player_mode) { + case PLAYER_MODE_WINDOW: + root->add_child("PlayerMode")->add_child_text("window"); + break; + case PLAYER_MODE_FULL: + root->add_child("PlayerMode")->add_child_text("full"); + break; + case PLAYER_MODE_DUAL: + root->add_child("PlayerMode")->add_child_text("dual"); + break; + } + try { doc.write_to_file_formatted(config_file().string()); } catch (xmlpp::exception& e) { diff --git a/src/lib/config.h b/src/lib/config.h index c5ce59fbf..d2829af08 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -459,6 +459,16 @@ public: return _interface_complexity; } + enum PlayerMode { + PLAYER_MODE_WINDOW, + PLAYER_MODE_FULL, + PLAYER_MODE_DUAL + }; + + PlayerMode player_mode () const { + return _player_mode; + } + /* SET (mostly) */ void set_master_encoding_threads (int n) { @@ -857,6 +867,10 @@ public: maybe_set (_interface_complexity, i, INTERFACE_COMPLEXITY); } + void set_player_mode (PlayerMode m) { + maybe_set (_player_mode, m); + } + void changed (Property p = OTHER); boost::signals2::signal Changed; /** Emitted if read() failed on an existing Config file. There is nothing @@ -1039,6 +1053,7 @@ private: boost::optional _gdc_username; boost::optional _gdc_password; Interface _interface_complexity; + PlayerMode _player_mode; static int const _current_version; diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index 7991a35e2..10b75b03d 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -105,18 +105,12 @@ enum { class DOMFrame : public wxFrame { public: - enum Screen { - SCREEN_WINDOW, - SCREEN_FULL, - SCREEN_DUAL - }; - DOMFrame () : wxFrame (0, -1, _("DCP-o-matic Player")) , _update_news_requested (false) , _info (0) + , _mode (Config::instance()->player_mode()) , _config_dialog (0) - , _screen (SCREEN_WINDOW) , _cinema_dialog (0) , _file_menu (0) , _history_items (0) @@ -199,6 +193,8 @@ public: _cinema_dialog = new CinemaPlayerDialog (this, _viewer); UpdateChecker::instance()->StateChanged.connect (boost::bind (&DOMFrame::update_checker_state_changed, this)); + + setup_screen (); } void set_decode_reduction (optional reduction) @@ -289,8 +285,8 @@ private: wxMenu* view = new wxMenu; optional c = Config::instance()->decode_reduction(); _view_cpl = view->Append(ID_view_cpl, _("CPL"), _cpl_menu); - view->AppendCheckItem(ID_view_full_screen, _("Full screen\tF11"))->Check(_screen == SCREEN_FULL); - view->AppendCheckItem(ID_view_dual_screen, _("Dual screen\tShift+F11"))->Check(_screen == SCREEN_DUAL); + view->AppendCheckItem(ID_view_full_screen, _("Full screen\tF11"))->Check(_mode == Config::PLAYER_MODE_FULL); + view->AppendCheckItem(ID_view_dual_screen, _("Dual screen\tShift+F11"))->Check(_mode == Config::PLAYER_MODE_DUAL); view->Append(ID_view_closed_captions, _("Closed captions...")); view->AppendSeparator(); view->AppendRadioItem(ID_view_scale_appropriate, _("Set decode resolution to match display"))->Check(!static_cast(c)); @@ -457,31 +453,31 @@ private: void view_full_screen () { - if (_screen == SCREEN_FULL) { - _screen = SCREEN_WINDOW; + if (_mode == Config::PLAYER_MODE_FULL) { + _mode = Config::PLAYER_MODE_WINDOW; } else { - _screen = SCREEN_FULL; + _mode = Config::PLAYER_MODE_FULL; } setup_screen (); } void view_dual_screen () { - if (_screen == SCREEN_DUAL) { - _screen = SCREEN_WINDOW; + if (_mode == Config::PLAYER_MODE_DUAL) { + _mode = Config::PLAYER_MODE_WINDOW; } else { - _screen = SCREEN_DUAL; + _mode = Config::PLAYER_MODE_DUAL; } setup_screen (); } void setup_screen () { - _controls->Show (_screen == SCREEN_WINDOW); - _info->Show (_screen == SCREEN_WINDOW); - _overall_panel->SetBackgroundColour (_screen == SCREEN_WINDOW ? wxNullColour : wxColour(0, 0, 0)); - ShowFullScreen (_screen != SCREEN_WINDOW); - if (_screen == SCREEN_DUAL) { + _controls->Show (_mode == Config::PLAYER_MODE_WINDOW); + _info->Show (_mode == Config::PLAYER_MODE_WINDOW); + _overall_panel->SetBackgroundColour (_mode == Config::PLAYER_MODE_WINDOW ? wxNullColour : wxColour(0, 0, 0)); + ShowFullScreen (_mode != Config::PLAYER_MODE_WINDOW); + if (_mode == Config::PLAYER_MODE_DUAL) { _cinema_dialog->Show (); if (wxDisplay::GetCount() > 1) { this->Move (0, 0); @@ -697,8 +693,8 @@ private: bool _update_news_requested; PlayerInformation* _info; + Config::PlayerMode _mode; wxPreferencesEditor* _config_dialog; - Screen _screen; CinemaPlayerDialog* _cinema_dialog; wxPanel* _overall_panel; wxMenu* _file_menu; diff --git a/src/wx/player_config_dialog.cc b/src/wx/player_config_dialog.cc index a7d4ab71c..258db9a57 100644 --- a/src/wx/player_config_dialog.cc +++ b/src/wx/player_config_dialog.cc @@ -85,7 +85,52 @@ private: add_language_controls (table, r); add_play_sound_controls (table, r); add_update_controls (table, r); + + add_label_to_sizer (table, _panel, _("Start player as"), true, wxGBPosition(r, 0)); + _player_mode = new wxChoice (_panel, wxID_ANY); + _player_mode->Append (_("window")); + _player_mode->Append (_("full screen")); + _player_mode->Append (_("full screen with controls on second monitor")); + table->Add (_player_mode, wxGBPosition(r, 1)); + ++r; + + _player_mode->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::player_mode_changed, this)); + } + + void config_changed () + { + GeneralPage::config_changed (); + + switch (Config::instance()->player_mode()) { + case Config::PLAYER_MODE_WINDOW: + checked_set (_player_mode, 0); + break; + case Config::PLAYER_MODE_FULL: + checked_set (_player_mode, 1); + break; + case Config::PLAYER_MODE_DUAL: + checked_set (_player_mode, 2); + break; + } } + +private: + void player_mode_changed () + { + switch (_player_mode->GetSelection()) { + case 0: + Config::instance()->set_player_mode(Config::PLAYER_MODE_WINDOW); + break; + case 1: + Config::instance()->set_player_mode(Config::PLAYER_MODE_FULL); + break; + case 2: + Config::instance()->set_player_mode(Config::PLAYER_MODE_DUAL); + break; + } + } + + wxChoice* _player_mode; }; wxPreferencesEditor* -- 2.30.2