pot/merge.
[dcpomatic.git] / src / tools / dcpomatic_disk.cc
index 92429aa53238c43a75a57bae33328750c895696a..88f5420ee0a045c8693ec5220a54df7a4a8a2669 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2019-2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2019-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -18,6 +18,7 @@
 
 */
 
+
 #include "wx/wx_signal_manager.h"
 #include "wx/wx_util.h"
 #include "wx/job_manager_view.h"
@@ -47,38 +48,56 @@ DCPOMATIC_ENABLE_WARNINGS
 #include <notify.h>
 #endif
 
-using std::string;
-using std::exception;
-using std::cout;
+
 using std::cerr;
-using boost::shared_ptr;
+using std::cout;
+using std::exception;
+using std::make_shared;
+using std::shared_ptr;
+using std::string;
 using boost::optional;
 #if BOOST_VERSION >= 106100
 using namespace boost::placeholders;
 #endif
 
 
+#ifdef DCPOMATIC_OSX
+enum {
+       ID_tools_uninstall = 1,
+};
+#endif
+
+
 class DOMFrame : public wxFrame
 {
 public:
        explicit DOMFrame (wxString const & title)
-               : wxFrame (0, -1, title)
+               : wxFrame (nullptr, wxID_ANY, title)
                , _nanomsg (true)
                , _sizer (new wxBoxSizer(wxVERTICAL))
        {
+#ifdef DCPOMATIC_OSX
+               auto bar = new wxMenuBar;
+               auto tools = new wxMenu;
+               tools->Append(ID_tools_uninstall, _("Uninstall..."));
+               bar->Append(tools, _("Tools"));
+               SetMenuBar (bar);
+               Bind (wxEVT_MENU, boost::bind(&DOMFrame::uninstall, this), ID_tools_uninstall);
+#endif
+
                /* Use a panel as the only child of the Frame so that we avoid
                   the dark-grey background on Windows.
                */
-               wxPanel* overall_panel = new wxPanel (this);
-               wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+               auto overall_panel = new wxPanel (this);
+               auto s = new wxBoxSizer (wxHORIZONTAL);
                s->Add (overall_panel, 1, wxEXPAND);
                SetSizer (s);
 
-               wxGridBagSizer* grid = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+               auto grid = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
 
                int r = 0;
                add_label_to_sizer (grid, overall_panel, _("DCP"), true, wxGBPosition(r, 0));
-               wxBoxSizer* dcp_name_sizer = new wxBoxSizer (wxHORIZONTAL);
+               auto dcp_name_sizer = new wxBoxSizer (wxHORIZONTAL);
                _dcp_name = new wxStaticText (overall_panel, wxID_ANY, wxEmptyString);
                dcp_name_sizer->Add (_dcp_name, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, DCPOMATIC_SIZER_X_GAP);
                _dcp_open = new wxButton (overall_panel, wxID_ANY, _("Open..."));
@@ -87,7 +106,7 @@ public:
                ++r;
 
                add_label_to_sizer (grid, overall_panel, _("Drive"), true, wxGBPosition(r, 0));
-               wxBoxSizer* drive_sizer = new wxBoxSizer (wxHORIZONTAL);
+               auto drive_sizer = new wxBoxSizer (wxHORIZONTAL);
                _drive = new wxChoice (overall_panel, wxID_ANY);
                drive_sizer->Add (_drive, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, DCPOMATIC_SIZER_X_GAP);
                _drive_refresh = new wxButton (overall_panel, wxID_ANY, _("Refresh"));
@@ -113,7 +132,7 @@ public:
                _sizer->Add (grid, 1, wxALL | wxEXPAND, DCPOMATIC_DIALOG_BORDER);
                overall_panel->SetSizer (_sizer);
                Fit ();
-               SetSize (768, GetSize().GetHeight() + 32);
+               SetSize (1024, GetSize().GetHeight() + 32);
 
                /* XXX: this is a hack, but I expect we'll need logs and I'm not sure if there's
                 * a better place to put them.
@@ -163,13 +182,21 @@ private:
        }
 
 
+#ifdef DCPOMATIC_OSX
+       void uninstall()
+       {
+               system(String::compose("osascript \"%1/uninstall_disk.applescript\"", resources_path().string()).c_str());
+       }
+#endif
+
+
        bool should_close ()
        {
                if (!JobManager::instance()->work_to_do()) {
                        return true;
                }
 
-               wxMessageDialog* d = new wxMessageDialog (
+               auto d = new wxMessageDialog (
                        0,
                        _("There are unfinished jobs; are you sure you want to quit?"),
                        _("Unfinished jobs"),
@@ -195,7 +222,7 @@ private:
 
        void open ()
        {
-               wxDirDialog* d = new wxDirDialog (this, _("Choose a DCP folder"), wxT(""), wxDD_DIR_MUST_EXIST);
+               auto d = new wxDirDialog (this, _("Choose a DCP folder"), wxT(""), wxDD_DIR_MUST_EXIST);
                int r = d->ShowModal ();
                boost::filesystem::path const path (wx_to_std(d->GetPath()));
                d->Destroy ();
@@ -218,7 +245,7 @@ private:
                if (!_nanomsg.send(DISK_WRITER_PING "\n", 2000)) {
                        have_writer = false;
                } else {
-                       optional<string> reply = _nanomsg.receive (2000);
+                       auto reply = _nanomsg.receive (2000);
                        if (!reply || *reply != DISK_WRITER_PONG) {
                                have_writer = false;
                        }
@@ -226,7 +253,7 @@ private:
 
                if (!have_writer) {
 #ifdef DCPOMATIC_WINDOWS
-                       MessageDialog* m = new MessageDialog (
+                       auto m = new MessageDialog (
                                this,
                                _("DCP-o-matic Disk Writer"),
                                _("Do you see a 'User Account Control' dialogue asking about dcpomatic2_disk_writer.exe?  If so, click 'Yes', then try again.")
@@ -239,9 +266,9 @@ private:
 #endif
                }
 
-               Drive const& drive = _drives[_drive->GetSelection()];
+               auto const& drive = _drives[_drive->GetSelection()];
                if (drive.mounted()) {
-                       TryUnmountDialog* d = new TryUnmountDialog(this, drive.description());
+                       auto d = new TryUnmountDialog(this, drive.description());
                        int const r = d->ShowModal ();
                        d->Destroy ();
                        if (r != wxID_OK) {
@@ -255,9 +282,9 @@ private:
                        if (!_nanomsg.send(drive.as_xml(), 2000)) {
                                throw CommunicationFailedError ();
                        }
-                       optional<string> reply = _nanomsg.receive (2000);
+                       auto reply = _nanomsg.receive (2000);
                        if (!reply || *reply != DISK_WRITER_OK) {
-                               MessageDialog* m = new MessageDialog (
+                               auto * m = new MessageDialog (
                                                this,
                                                _("DCP-o-matic Disk Writer"),
                                                wxString::Format(_("The drive %s could not be unmounted.\nClose any application that is using it, then try again."), std_to_wx(drive.description()))
@@ -269,7 +296,7 @@ private:
                }
 
 
-               DriveWipeWarningDialog* d = new DriveWipeWarningDialog (this, _drive->GetString(_drive->GetSelection()));
+               auto * d = new DriveWipeWarningDialog (this, _drive->GetString(_drive->GetSelection()));
                int const r = d->ShowModal ();
                bool ok = r == wxID_OK && d->confirmed();
                d->Destroy ();
@@ -278,7 +305,7 @@ private:
                        return;
                }
 
-               JobManager::instance()->add(shared_ptr<Job>(new CopyToDriveJob(*_dcp_path, _drives[_drive->GetSelection()], _nanomsg)));
+               JobManager::instance()->add(make_shared<CopyToDriveJob>(*_dcp_path, _drives[_drive->GetSelection()], _nanomsg));
                setup_sensitivity ();
        }
 
@@ -293,8 +320,8 @@ private:
                int re_select = wxNOT_FOUND;
                int j = 0;
                _drives = Drive::get ();
-               BOOST_FOREACH (Drive i, _drives) {
-                       wxString const s = std_to_wx(i.description());
+               for (auto i: _drives) {
+                       auto const s = std_to_wx(i.description());
                        if (s == current) {
                                re_select = j;
                        }
@@ -325,6 +352,7 @@ private:
        wxSizer* _sizer;
 };
 
+
 class App : public wxApp
 {
 public:
@@ -349,6 +377,7 @@ public:
 #endif
 
 #ifdef DCPOMATIC_OSX
+                       dcpomatic_sleep_seconds (1);
                        make_foreground_application ();
 #endif
 
@@ -372,7 +401,7 @@ public:
                        */
                        Config::drop ();
 
-                       DiskWarningDialog* warning = new DiskWarningDialog ();
+                       auto warning = new DiskWarningDialog ();
                        warning->ShowModal ();
                        if (!warning->confirmed()) {
                                return false;