BOOST_FOREACH.
[dcpomatic.git] / src / wx / wx_util.cc
index db63400315e899cb1488705dffa3dda15adad12d..3386b2700c522c7047c4bb0e0c738473cf1b6303 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 #include "wx_util.h"
 #include "file_picker_ctrl.h"
+#include "static_text.h"
+#include "password_entry.h"
 #include "lib/config.h"
+#include "lib/job_manager.h"
 #include "lib/util.h"
 #include "lib/cross.h"
+#include "lib/job.h"
+#include "lib/warnings.h"
 #include <dcp/locale_convert.h>
+DCPOMATIC_DISABLE_WARNINGS
 #include <wx/spinctrl.h>
 #include <wx/splash.h>
+#include <wx/progdlg.h>
 #include <wx/filepicker.h>
+DCPOMATIC_ENABLE_WARNINGS
 #include <boost/thread.hpp>
 
-using namespace std;
-using namespace boost;
+using std::string;
+using std::vector;
+using std::pair;
+using std::shared_ptr;
+using boost::optional;
 using dcp::locale_convert;
+using namespace dcpomatic;
 
 wxStaticText *
 #ifdef __WXOSX__
@@ -49,7 +61,7 @@ create_label (wxWindow* p, wxString t, bool)
                t += wxT (":");
        }
 #endif
-       return new wxStaticText (p, wxID_ANY, t);
+       return new StaticText (p, t);
 }
 
 /** Add a wxStaticText to a wxSizer, aligning it at vertical centre.
@@ -150,6 +162,7 @@ message_dialog (wxWindow* parent, wxString m)
        d->Destroy ();
 }
 
+/** @return true if the user answered "yes" */
 bool
 confirm_dialog (wxWindow* parent, wxString m)
 {
@@ -285,6 +298,14 @@ checked_set (wxTextCtrl* widget, string value)
        }
 }
 
+void
+checked_set (PasswordEntry* entry, string value)
+{
+       if (entry->get() != value) {
+               entry->set(value);
+       }
+}
+
 void
 checked_set (wxTextCtrl* widget, wxString value)
 {
@@ -354,6 +375,9 @@ dcpomatic_setup_i18n ()
                   of wxWidgets.
                */
                locale->AddCatalog (wxT ("dcpomatic2-wxstd"));
+
+               /* Fedora 29 (at least) installs wxstd3.mo instead of wxstd.mo */
+               locale->AddCatalog (wxT ("wxstd3"));
 #endif
 
                locale->AddCatalog (wxT ("libdcpomatic2-wx"));
@@ -448,13 +472,10 @@ maybe_show_splash ()
 {
        wxSplashScreen* splash = 0;
        try {
-               if (!Config::have_existing ("config.xml")) {
-                       wxBitmap bitmap;
-                       boost::filesystem::path p = shared_path () / "splash.png";
-                       if (bitmap.LoadFile (std_to_wx (p.string ()), wxBITMAP_TYPE_PNG)) {
-                               splash = new wxSplashScreen (bitmap, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT, 0, 0, -1);
-                               wxYield ();
-                       }
+               wxBitmap bitmap;
+               if (bitmap.LoadFile(bitmap_path("splash"), wxBITMAP_TYPE_PNG)) {
+                       splash = new wxSplashScreen (bitmap, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT, 0, 0, -1);
+                       wxYield ();
                }
        } catch (boost::filesystem::filesystem_error& e) {
                /* Maybe we couldn't find the splash image; never mind */
@@ -463,17 +484,6 @@ maybe_show_splash ()
        return splash;
 }
 
-optional<boost::filesystem::path>
-path_from_file_dialog (wxFileDialog* dialog, string extension)
-{
-       boost::filesystem::path p(wx_to_std(dialog->GetPath()));
-       p.replace_extension(extension);
-       if (boost::filesystem::is_regular_file(p) && !confirm_dialog(dialog, wxString::Format(_("A file named %s already exists.  Do you want to replace it?"), std_to_wx(p.filename().string())))) {
-               return optional<boost::filesystem::path>();
-       }
-       return p;
-}
-
 double
 calculate_mark_interval (double mark_interval)
 {
@@ -496,3 +506,100 @@ calculate_mark_interval (double mark_interval)
 
        return mark_interval;
 }
+
+
+/** @return false if the task was cancelled */
+bool
+display_progress (wxString title, wxString task)
+{
+       JobManager* jm = JobManager::instance ();
+
+       wxProgressDialog progress (title, task, 100, 0, wxPD_CAN_ABORT);
+
+       bool ok = true;
+
+       while (jm->work_to_do()) {
+               dcpomatic_sleep_seconds (1);
+               if (!progress.Pulse()) {
+                       /* user pressed cancel */
+                       for (auto i: jm->get()) {
+                               i->cancel();
+                       }
+                       ok = false;
+                       break;
+               }
+       }
+
+       return ok;
+}
+
+
+int
+get_offsets (vector<Offset>& offsets)
+{
+       offsets.push_back (Offset(_("UTC-11"),  -11,  0));
+       offsets.push_back (Offset(_("UTC-10"),  -10,  0));
+       offsets.push_back (Offset(_("UTC-9"),    -9,  0));
+       offsets.push_back (Offset(_("UTC-8"),    -8,  0));
+       offsets.push_back (Offset(_("UTC-7"),    -7,  0));
+       offsets.push_back (Offset(_("UTC-6"),    -6,  0));
+       offsets.push_back (Offset(_("UTC-5"),    -5,  0));
+       offsets.push_back (Offset(_("UTC-4:30"), -4, 30));
+       offsets.push_back (Offset(_("UTC-4"),    -4,  0));
+       offsets.push_back (Offset(_("UTC-3:30"), -3, 30));
+       offsets.push_back (Offset(_("UTC-3"),    -3,  0));
+       offsets.push_back (Offset(_("UTC-2"),    -2,  0));
+       offsets.push_back (Offset(_("UTC-1"),    -1,  0));
+       int utc = offsets.size();
+       offsets.push_back (Offset(_("UTC")  ,     0,  0));
+       offsets.push_back (Offset(_("UTC+1"),     1,  0));
+       offsets.push_back (Offset(_("UTC+2"),     2,  0));
+       offsets.push_back (Offset(_("UTC+3"),     3,  0));
+       offsets.push_back (Offset(_("UTC+4"),     4,  0));
+       offsets.push_back (Offset(_("UTC+5"),     5,  0));
+       offsets.push_back (Offset(_("UTC+5:30"),  5, 30));
+       offsets.push_back (Offset(_("UTC+6"),     6,  0));
+       offsets.push_back (Offset(_("UTC+7"),     7,  0));
+       offsets.push_back (Offset(_("UTC+8"),     8,  0));
+       offsets.push_back (Offset(_("UTC+9"),     9,  0));
+       offsets.push_back (Offset(_("UTC+9:30"),  9, 30));
+       offsets.push_back (Offset(_("UTC+10"),   10,  0));
+       offsets.push_back (Offset(_("UTC+11"),   11,  0));
+       offsets.push_back (Offset(_("UTC+12"),   12,  0));
+
+       return utc;
+}
+
+
+wxString
+bitmap_path (string name)
+{
+       boost::filesystem::path base;
+
+#ifdef DCPOMATIC_DEBUG
+       /* Hack to allow Linux and OS X to find icons when running from the source tree */
+       char* path = getenv ("DCPOMATIC_GRAPHICS");
+       if (path) {
+               base = path;
+       } else {
+               base = resources_path();
+       }
+#else
+       base = resources_path();
+#endif
+
+       boost::filesystem::path p = base / String::compose("%1.png", name);
+       return std_to_wx (p.string());
+}
+
+
+wxSize
+small_button_size (wxWindow* parent, wxString text)
+{
+       wxClientDC dc (parent);
+       wxSize size = dc.GetTextExtent (text);
+       size.SetHeight (-1);
+       size.IncBy (24, 0);
+       return size;
+}
+