Add a little gap between player buttons and the position slider.
[dcpomatic.git] / src / wx / config_dialog.cc
index bf7e295ee3c809ba14060c223d5a18d51654cbf2..b4adc855e4af103398fd11a8c5a27cbc33c6a8c6 100644 (file)
@@ -27,6 +27,7 @@
 #include "static_text.h"
 #include "lib/constants.h"
 #include <dcp/file.h>
+#include <dcp/filesystem.h>
 #include <dcp/raw_convert.h>
 
 
@@ -127,8 +128,10 @@ GeneralPage::add_language_controls (wxGridBagSizer* table, int& r)
        languages.push_back (make_pair("Deutsch", "de_DE"));
        languages.push_back (make_pair("English", "en_GB"));
        languages.push_back (make_pair("Español", "es_ES"));
+       languages.push_back (make_pair("فارسی", "fa_IR"));
        languages.push_back (make_pair("Français", "fr_FR"));
        languages.push_back (make_pair("Italiano", "it_IT"));
+       languages.push_back (make_pair("ქართული", "ka_KA"));
        languages.push_back (make_pair("Nederlands", "nl_NL"));
        languages.push_back (make_pair("Русский", "ru_RU"));
        languages.push_back (make_pair("Polski", "pl_PL"));
@@ -367,8 +370,7 @@ CertificateChainEditor::add_button (wxWindow* button)
 void
 CertificateChainEditor::add_certificate ()
 {
-       auto d = new wxFileDialog (this, _("Select Certificate File"));
-       ScopeGuard sg = [d]() { d->Destroy(); };
+       auto d = make_wx<wxFileDialog>(this, _("Select Certificate File"));
 
        if (d->ShowModal() == wxID_OK) {
                try {
@@ -450,11 +452,10 @@ CertificateChainEditor::export_certificate ()
                default_name = "intermediate.pem";
        }
 
-       auto d = new wxFileDialog(
+       auto d = make_wx<wxFileDialog>(
                this, _("Select Certificate File"), wxEmptyString, default_name, wxT ("PEM files (*.pem)|*.pem"),
                wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                );
-       ScopeGuard sg = [d]() { d->Destroy(); };
 
        auto j = all.begin ();
        for (int k = 0; k < i; ++k) {
@@ -481,11 +482,10 @@ CertificateChainEditor::export_certificate ()
 void
 CertificateChainEditor::export_chain ()
 {
-       auto d = new wxFileDialog (
+       auto d = make_wx<wxFileDialog>(
                this, _("Select Chain File"), wxEmptyString, wxT("certificate_chain.pem"), wxT("PEM files (*.pem)|*.pem"),
                wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                );
-       ScopeGuard sg = [d]() { d->Destroy(); };
 
        if (d->ShowModal() != wxID_OK) {
                return;
@@ -546,8 +546,7 @@ CertificateChainEditor::remake_certificates ()
                return;
        }
 
-       auto d = new MakeChainDialog (this, _get());
-       ScopeGuard sg = [d]() { d->Destroy(); };
+       auto d = make_wx<MakeChainDialog>(this, _get());
 
        if (d->ShowModal () == wxID_OK) {
                _set (d->get());
@@ -574,13 +573,12 @@ CertificateChainEditor::update_private_key ()
 void
 CertificateChainEditor::import_private_key ()
 {
-       auto d = new wxFileDialog (this, _("Select Key File"));
-       ScopeGuard sg = [d]() { d->Destroy(); };
+       auto d = make_wx<wxFileDialog>(this, _("Select Key File"));
 
        if (d->ShowModal() == wxID_OK) {
                try {
                        boost::filesystem::path p (wx_to_std (d->GetPath ()));
-                       if (boost::filesystem::file_size (p) > 8192) {
+                       if (dcp::filesystem::file_size(p) > 8192) {
                                error_dialog (
                                        this,
                                        wxString::Format (_("Could not read key file; file is too long (%s)"), std_to_wx (p.string ()))
@@ -608,11 +606,10 @@ CertificateChainEditor::export_private_key ()
                return;
        }
 
-       auto d = new wxFileDialog (
+       auto d = make_wx<wxFileDialog>(
                this, _("Select Key File"), wxEmptyString, wxT("private_key.pem"), wxT("PEM files (*.pem)|*.pem"),
                wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                );
-       ScopeGuard sg = [d]() { d->Destroy(); };
 
        if (d->ShowModal () == wxID_OK) {
                boost::filesystem::path path (wx_to_std(d->GetPath()));
@@ -727,11 +724,10 @@ KeysPage::signing_advanced ()
 void
 KeysPage::export_decryption_chain_and_key ()
 {
-       auto d = new wxFileDialog (
+       auto d = make_wx<wxFileDialog>(
                _panel, _("Select Export File"), wxEmptyString, wxEmptyString, wxT ("DOM files (*.dom)|*.dom"),
                wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                );
-       ScopeGuard sg = [d]() { d->Destroy(); };
 
        if (d->ShowModal() != wxID_OK) {
                return;
@@ -762,10 +758,9 @@ KeysPage::import_decryption_chain_and_key ()
                return;
        }
 
-       auto d = new wxFileDialog (
+       auto d = make_wx<wxFileDialog>(
                _panel, _("Select File To Import"), wxEmptyString, wxEmptyString, wxT ("DOM files (*.dom)|*.dom")
                );
-       ScopeGuard sg = [d]() { d->Destroy(); };
 
        if (d->ShowModal() != wxID_OK) {
                return;
@@ -825,11 +820,10 @@ KeysPage::export_decryption_certificate ()
        }
        default_name += wxT("_kdm_decryption_cert.pem");
 
-       auto d = new wxFileDialog (
+       auto d = make_wx<wxFileDialog>(
                _panel, _("Select Certificate File"), wxEmptyString, default_name, wxT("PEM files (*.pem)|*.pem"),
                wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                );
-       ScopeGuard sg = [d]() { d->Destroy(); };
 
        if (d->ShowModal() != wxID_OK) {
                return;
@@ -874,7 +868,6 @@ SoundPage::setup ()
 
        add_label_to_sizer (table, _panel, _("Mapping"), true, wxGBPosition(r, 0));
        _map = new AudioMappingView (_panel, _("DCP"), _("DCP"), _("Output"), _("output"));
-       _map->SetSize (-1, 400);
        table->Add (_map, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND);
        ++r;
 
@@ -888,6 +881,14 @@ SoundPage::setup ()
        _sound_output_details->SetFont (font);
 
        RtAudio audio (DCPOMATIC_RTAUDIO_API);
+#if (RTAUDIO_VERSION_MAJOR >= 6)
+       for (auto device_id: audio.getDeviceIds()) {
+               auto dev = audio.getDeviceInfo(device_id);
+               if (dev.outputChannels > 0) {
+                       _sound_output->Append(std_to_wx(dev.name));
+               }
+       }
+#else
        for (unsigned int i = 0; i < audio.getDeviceCount(); ++i) {
                try {
                        auto dev = audio.getDeviceInfo (i);
@@ -898,6 +899,7 @@ SoundPage::setup ()
                        /* Something went wrong so let's just ignore that device */
                }
        }
+#endif
 
        _sound->bind(&SoundPage::sound_changed, this);
        _sound_output->Bind (wxEVT_CHOICE,   bind(&SoundPage::sound_output_changed, this));
@@ -929,11 +931,15 @@ SoundPage::sound_output_changed ()
        RtAudio audio (DCPOMATIC_RTAUDIO_API);
        auto const so = get_sound_output();
        string default_device;
+#if (RTAUDIO_VERSION_MAJOR >= 6)
+       default_device = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
+#else
        try {
                default_device = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
        } catch (RtAudioError&) {
                /* Never mind */
        }
+#endif
        if (!so || *so == default_device) {
                Config::instance()->unset_sound_output ();
        } else {
@@ -956,11 +962,15 @@ SoundPage::config_changed ()
        } else {
                /* No configured output means we should use the default */
                RtAudio audio (DCPOMATIC_RTAUDIO_API);
+#if (RTAUDIO_VERSION_MAJOR >= 6)
+               configured_so = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
+#else
                try {
                        configured_so = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
                } catch (RtAudioError&) {
                        /* Probably no audio devices at all */
                }
+#endif
        }
 
        if (configured_so && current_so != configured_so) {
@@ -990,6 +1000,14 @@ SoundPage::config_changed ()
 
        int channels = 0;
        if (configured_so) {
+#if (RTAUDIO_VERSION_MAJOR >= 6)
+               for (auto device_id: audio.getDeviceIds()) {
+                       auto info = audio.getDeviceInfo(device_id);
+                       if (info.name == *configured_so && info.outputChannels > 0) {
+                               channels = info.outputChannels;
+                       }
+               }
+#else
                for (unsigned int i = 0; i < audio.getDeviceCount(); ++i) {
                        try {
                                auto info = audio.getDeviceInfo(i);
@@ -1000,6 +1018,7 @@ SoundPage::config_changed ()
                                /* Never mind */
                        }
                }
+#endif
        }
 
        _sound_output_details->SetLabel (