Allow configurable start mode for player.
authorCarl Hetherington <cth@carlh.net>
Fri, 14 Sep 2018 19:35:36 +0000 (20:35 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 14 Sep 2018 19:35:36 +0000 (20:35 +0100)
src/lib/config.cc
src/lib/config.h
src/tools/dcpomatic_player.cc
src/wx/player_config_dialog.cc

index 0baaf48..3027128 100644 (file)
@@ -163,6 +163,7 @@ Config::set_defaults ()
        _gdc_username = optional<string>();
        _gdc_password = optional<string>();
        _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<string> 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) {
index c5ce59f..d2829af 100644 (file)
@@ -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<void (Property)> Changed;
        /** Emitted if read() failed on an existing Config file.  There is nothing
@@ -1039,6 +1053,7 @@ private:
        boost::optional<std::string> _gdc_username;
        boost::optional<std::string> _gdc_password;
        Interface _interface_complexity;
+       PlayerMode _player_mode;
 
        static int const _current_version;
 
index 7991a35..10b75b0 100644 (file)
@@ -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<int> reduction)
@@ -289,8 +285,8 @@ private:
                wxMenu* view = new wxMenu;
                optional<int> 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<bool>(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;
index a7d4ab7..258db9a 100644 (file)
@@ -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*