X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fconfig_dialog.cc;h=957fd32dbd8e4754f6bc8eb32a9cac1b932e0573;hb=b83e61259c0244d5618c5ed9dcc8602205580886;hp=7f96e2c351217620e86a3aa0fbb5d332ff28e3aa;hpb=e0b2ef3dbac6fc4900cad6fea4395c212578602b;p=dcpomatic.git diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc index 7f96e2c35..957fd32db 100644 --- a/src/wx/config_dialog.cc +++ b/src/wx/config_dialog.cc @@ -36,6 +36,9 @@ using boost::bind; using boost::optional; using boost::shared_ptr; using boost::function; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif static bool @@ -53,6 +56,14 @@ Page::Page (wxSize panel_size, int border) _config_connection = Config::instance()->Changed.connect (bind (&Page::config_changed_wrapper, this)); } + +wxWindow* +Page::CreateWindow (wxWindow* parent) +{ + return create_window (parent); +} + + wxWindow* Page::create_window (wxWindow* parent) { @@ -84,37 +95,20 @@ Page::window_destroyed () } -StockPage::StockPage (Kind kind, wxSize panel_size, int border) - : wxStockPreferencesPage (kind) - , Page (panel_size, border) -{ - -} - -wxWindow* -StockPage::CreateWindow (wxWindow* parent) -{ - return create_window (parent); -} - -StandardPage::StandardPage (wxSize panel_size, int border) +GeneralPage::GeneralPage (wxSize panel_size, int border) : Page (panel_size, border) { } -wxWindow* -StandardPage::CreateWindow (wxWindow* parent) -{ - return create_window (parent); -} -GeneralPage::GeneralPage (wxSize panel_size, int border) - : StockPage (Kind_General, panel_size, border) +wxString +GeneralPage::GetName () const { - + return _("General"); } + void GeneralPage::add_language_controls (wxGridBagSizer* table, int& r) { @@ -262,19 +256,10 @@ CertificateChainEditor::CertificateChainEditor ( , _get (get) , _nag_alter (nag_alter) { - wxFont subheading_font (*wxNORMAL_FONT); - subheading_font.SetWeight (wxFONTWEIGHT_BOLD); - _sizer = new wxBoxSizer (wxVERTICAL); - { - wxStaticText* m = new StaticText (this, title); - m->SetFont (subheading_font); - _sizer->Add (m, 0, wxALL, border); - } - wxBoxSizer* certificates_sizer = new wxBoxSizer (wxHORIZONTAL); - _sizer->Add (certificates_sizer, 0, wxLEFT | wxRIGHT, border); + _sizer->Add (certificates_sizer, 0, wxALL, border); _certificates = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (440, 150), wxLC_REPORT | wxLC_SINGLE_SEL); @@ -304,11 +289,13 @@ CertificateChainEditor::CertificateChainEditor ( { wxSizer* s = new wxBoxSizer (wxVERTICAL); _add_certificate = new Button (this, _("Add...")); - s->Add (_add_certificate, 0, wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); + s->Add (_add_certificate, 1, wxTOP | wxBOTTOM | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP); _remove_certificate = new Button (this, _("Remove")); - s->Add (_remove_certificate, 0, wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); - _export_certificate = new Button (this, _("Export")); - s->Add (_export_certificate, 0, wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); + s->Add (_remove_certificate, 1, wxTOP | wxBOTTOM | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP); + _export_certificate = new Button (this, _("Export certificate...")); + s->Add (_export_certificate, 1, wxTOP | wxBOTTOM | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP); + _export_chain = new Button (this, _("Export chain...")); + s->Add (_export_chain, 1, wxTOP | wxBOTTOM | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP); certificates_sizer->Add (s, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP); } @@ -331,8 +318,6 @@ CertificateChainEditor::CertificateChainEditor ( _button_sizer = new wxBoxSizer (wxHORIZONTAL); _remake_certificates = new Button (this, _("Re-make certificates and key...")); _button_sizer->Add (_remake_certificates, 1, wxRIGHT, border); - _export_chain = new Button (this, _("Export chain...")); - _button_sizer->Add (_export_chain, 1, wxRIGHT, border); table->Add (_button_sizer, wxGBPosition (r, 0), wxGBSpan (1, 4)); ++r; @@ -690,14 +675,18 @@ KeysPage::setup () sizer->Add (m, 0, wxALL, _border); } + wxSizer* buttons = new wxBoxSizer (wxVERTICAL); + wxButton* export_decryption_certificate = new Button (_panel, _("Export KDM decryption certificate...")); - sizer->Add (export_decryption_certificate, 0, wxLEFT, _border); + buttons->Add (export_decryption_certificate, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); wxButton* export_settings = new Button (_panel, _("Export all KDM decryption settings...")); - sizer->Add (export_settings, 0, wxLEFT, _border); + buttons->Add (export_settings, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); wxButton* import_settings = new Button (_panel, _("Import all KDM decryption settings...")); - sizer->Add (import_settings, 0, wxLEFT, _border); + buttons->Add (import_settings, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); wxButton* decryption_advanced = new Button (_panel, _("Advanced...")); - sizer->Add (decryption_advanced, 0, wxALL, _border); + buttons->Add (decryption_advanced, 0); + + sizer->Add (buttons, 0, wxLEFT, _border); export_decryption_certificate->Bind (wxEVT_BUTTON, bind (&KeysPage::export_decryption_certificate, this)); export_settings->Bind (wxEVT_BUTTON, bind (&KeysPage::export_decryption_chain_and_key, this)); @@ -711,7 +700,7 @@ KeysPage::setup () } wxButton* signing_advanced = new Button (_panel, _("Advanced...")); - sizer->Add (signing_advanced, 0, wxLEFT, _border); + sizer->Add (signing_advanced, 0, wxLEFT | wxBOTTOM, _border); signing_advanced->Bind (wxEVT_BUTTON, bind (&KeysPage::signing_advanced, this)); } @@ -892,9 +881,13 @@ SoundPage::setup () RtAudio audio (DCPOMATIC_RTAUDIO_API); for (unsigned int i = 0; i < audio.getDeviceCount(); ++i) { - RtAudio::DeviceInfo dev = audio.getDeviceInfo (i); - if (dev.probed && dev.outputChannels > 0) { - _sound_output->Append (std_to_wx (dev.name)); + try { + RtAudio::DeviceInfo dev = audio.getDeviceInfo (i); + if (dev.probed && dev.outputChannels > 0) { + _sound_output->Append (std_to_wx (dev.name)); + } + } catch (RtAudioError&) { + /* Something went wrong so let's just ignore that device */ } } @@ -927,7 +920,13 @@ SoundPage::sound_output_changed () { RtAudio audio (DCPOMATIC_RTAUDIO_API); optional const so = get_sound_output(); - if (!so || *so == audio.getDeviceInfo(audio.getDefaultOutputDevice()).name) { + string default_device; + try { + default_device = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name; + } catch (RtAudioError&) { + /* Never mind */ + } + if (!so || *so == default_device) { Config::instance()->unset_sound_output (); } else { Config::instance()->set_sound_output (*so); @@ -951,7 +950,7 @@ SoundPage::config_changed () RtAudio audio (DCPOMATIC_RTAUDIO_API); try { configured_so = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name; - } catch (RtAudioError& e) { + } catch (RtAudioError&) { /* Probably no audio devices at all */ } } @@ -984,9 +983,13 @@ SoundPage::config_changed () int channels = 0; if (configured_so) { for (unsigned int i = 0; i < audio.getDeviceCount(); ++i) { - RtAudio::DeviceInfo info = audio.getDeviceInfo(i); - if (info.name == *configured_so && info.outputChannels > 0) { - channels = info.outputChannels; + try { + RtAudio::DeviceInfo info = audio.getDeviceInfo(i); + if (info.name == *configured_so && info.outputChannels > 0) { + channels = info.outputChannels; + } + } catch (RtAudioError&) { + /* Never mind */ } } } @@ -997,15 +1000,15 @@ SoundPage::config_changed () _map->set (Config::instance()->audio_mapping(channels)); - vector input; + vector input; for (int i = 0; i < MAX_DCP_AUDIO_CHANNELS; ++i) { - input.push_back (short_audio_channel_name(i)); + input.push_back (NamedChannel(short_audio_channel_name(i), i)); } _map->set_input_channels (input); - vector output; + vector output; for (int i = 0; i < channels; ++i) { - output.push_back (dcp::raw_convert(i)); + output.push_back (NamedChannel(dcp::raw_convert(i), i)); } _map->set_output_channels (output); @@ -1029,3 +1032,118 @@ SoundPage::get_sound_output () return wx_to_std (_sound_output->GetString (sel)); } + + +LocationsPage::LocationsPage (wxSize panel_size, int border) + : Page (panel_size, border) +{ + +} + +wxString +LocationsPage::GetName () const +{ + return _("Locations"); +} + +#ifdef DCPOMATIC_OSX +wxBitmap +LocationsPage::GetLargeIcon () const +{ + return wxBitmap ("locations", wxBITMAP_TYPE_PNG_RESOURCE); +} +#endif + +void +LocationsPage::setup () +{ + int r = 0; + + wxGridBagSizer* table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); + _panel->GetSizer()->Add (table, 1, wxALL | wxEXPAND, _border); + + add_label_to_sizer (table, _panel, _("Content directory"), true, wxGBPosition (r, 0)); + _content_directory = new wxDirPickerCtrl (_panel, wxID_ANY, wxEmptyString, wxDirSelectorPromptStr, wxDefaultPosition, wxSize (300, -1)); + table->Add (_content_directory, wxGBPosition (r, 1)); + ++r; + + add_label_to_sizer (table, _panel, _("Playlist directory"), true, wxGBPosition (r, 0)); + _playlist_directory = new wxDirPickerCtrl (_panel, wxID_ANY, wxEmptyString, wxDirSelectorPromptStr, wxDefaultPosition, wxSize (300, -1)); + table->Add (_playlist_directory, wxGBPosition (r, 1)); + ++r; + + add_label_to_sizer (table, _panel, _("KDM directory"), true, wxGBPosition (r, 0)); + _kdm_directory = new wxDirPickerCtrl (_panel, wxID_ANY, wxEmptyString, wxDirSelectorPromptStr, wxDefaultPosition, wxSize (300, -1)); + table->Add (_kdm_directory, wxGBPosition (r, 1)); + ++r; + +#ifdef DCPOMATIC_VARIANT_SWAROOP + add_label_to_sizer (table, _panel, _("Background image"), true, wxGBPosition (r, 0)); + _background_image = new FilePickerCtrl (_panel, _("Select image file"), "*.png;*.jpg;*.jpeg;*.tif;*.tiff", true, false); + table->Add (_background_image, wxGBPosition (r, 1)); + ++r; +#endif + + _content_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&LocationsPage::content_directory_changed, this)); + _playlist_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&LocationsPage::playlist_directory_changed, this)); + _kdm_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&LocationsPage::kdm_directory_changed, this)); +#ifdef DCPOMATIC_VARIANT_SWAROOP + _background_image->Bind (wxEVT_FILEPICKER_CHANGED, bind(&LocationsPage::background_image_changed, this)); +#endif +} + +void +LocationsPage::config_changed () +{ + Config* config = Config::instance (); + + if (config->player_content_directory()) { + checked_set (_content_directory, *config->player_content_directory()); + } + if (config->player_playlist_directory()) { + checked_set (_playlist_directory, *config->player_playlist_directory()); + } + if (config->player_kdm_directory()) { + checked_set (_kdm_directory, *config->player_kdm_directory()); + } +#ifdef DCPOMATIC_VARIANT_SWAROOP + if (config->player_background_image()) { + checked_set (_background_image, *config->player_background_image()); + } +#endif +} + +void +LocationsPage::content_directory_changed () +{ + Config::instance()->set_player_content_directory(wx_to_std(_content_directory->GetPath())); +} + +void +LocationsPage::playlist_directory_changed () +{ + Config::instance()->set_player_playlist_directory(wx_to_std(_playlist_directory->GetPath())); +} + +void +LocationsPage::kdm_directory_changed () +{ + Config::instance()->set_player_kdm_directory(wx_to_std(_kdm_directory->GetPath())); +} + +#ifdef DCPOMATIC_VARIANT_SWAROOP +void +LocationsPage::background_image_changed () +{ + boost::filesystem::path const f = wx_to_std(_background_image->GetPath()); + if (!boost::filesystem::is_regular_file(f) || !wxImage::CanRead(std_to_wx(f.string()))) { + error_dialog (0, _("Could not load image file.")); + if (Config::instance()->player_background_image()) { + checked_set (_background_image, *Config::instance()->player_background_image()); + } + return; + } + + Config::instance()->set_player_background_image(f); +} +#endif