X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_disk.cc;h=28799013f700f5e643abf455b83c2e191f4dd933;hb=0abe9455791ac7c7c4d1e214d3be166ea5897493;hp=872850fba454ab64e02c593c68094bfd22eefc17;hpb=3c29aa6531a4046a8db72dcac81189eb8893233c;p=dcpomatic.git diff --git a/src/tools/dcpomatic_disk.cc b/src/tools/dcpomatic_disk.cc index 872850fba..28799013f 100644 --- a/src/tools/dcpomatic_disk.cc +++ b/src/tools/dcpomatic_disk.cc @@ -21,6 +21,7 @@ #include "wx/disk_warning_dialog.h" #include "wx/drive_wipe_warning_dialog.h" +#include "wx/editable_list.h" #include "wx/job_manager_view.h" #include "wx/message_dialog.h" #include "wx/try_unmount_dialog.h" @@ -28,6 +29,7 @@ #include "wx/wx_signal_manager.h" #include "wx/wx_util.h" #include "lib/config.h" +#include "lib/constants.h" #include "lib/copy_to_drive_job.h" #include "lib/cross.h" #include "lib/dcpomatic_log.h" @@ -37,7 +39,7 @@ #include "lib/signal_manager.h" #include "lib/util.h" #include "lib/version.h" -#include "lib/warnings.h" +#include #include #include LIBDCP_DISABLE_WARNINGS @@ -57,6 +59,7 @@ using std::exception; using std::make_shared; using std::shared_ptr; using std::string; +using std::vector; using boost::optional; #if BOOST_VERSION >= 106100 using namespace boost::placeholders; @@ -70,6 +73,33 @@ enum { #endif +class DirDialogWrapper : public wxDirDialog +{ +public: + DirDialogWrapper (wxWindow* parent) + : wxDirDialog (parent, _("Choose a DCP folder"), wxT(""), wxDD_DIR_MUST_EXIST) + { + + } + + boost::optional get () const + { + auto const dcp = boost::filesystem::path(wx_to_std(GetPath())); + if (!boost::filesystem::exists(dcp / "ASSETMAP") && !boost::filesystem::exists(dcp / "ASSETMAP.xml")) { + error_dialog (nullptr, _("No ASSETMAP or ASSETMAP.xml found in this folder. Please choose a DCP folder.")); + return {}; + } + + return dcp; + } + + void set (boost::filesystem::path) + { + /* Not used */ + } +}; + + class DOMFrame : public wxFrame { public: @@ -99,12 +129,19 @@ public: int r = 0; add_label_to_sizer (grid, overall_panel, _("DCP"), true, wxGBPosition(r, 0)); - 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...")); - dcp_name_sizer->Add (_dcp_open, 0); - grid->Add (dcp_name_sizer, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND); + auto dcp_sizer = new wxBoxSizer (wxHORIZONTAL); + auto dcps = new EditableList( + overall_panel, + { EditableListColumn(_("DCP"), 300, true) }, + boost::bind(&DOMFrame::dcp_paths, this), + boost::bind(&DOMFrame::set_dcp_paths, this, _1), + [](boost::filesystem::path p, int) { return p.filename().string(); }, + EditableListTitle::INVISIBLE, + EditableListButton::NEW | EditableListButton::REMOVE + ); + + dcp_sizer->Add(dcps, 1, wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP); + grid->Add(dcp_sizer, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND); ++r; add_label_to_sizer (grid, overall_panel, _("Drive"), true, wxGBPosition(r, 0)); @@ -126,7 +163,6 @@ public: grid->AddGrowableCol (1); - _dcp_open->Bind (wxEVT_BUTTON, boost::bind(&DOMFrame::open, this)); _copy->Bind (wxEVT_BUTTON, boost::bind(&DOMFrame::copy, this)); _drive->Bind (wxEVT_CHOICE, boost::bind(&DOMFrame::setup_sensitivity, this)); _drive_refresh->Bind (wxEVT_BUTTON, boost::bind(&DOMFrame::drive_refresh, this)); @@ -180,18 +216,18 @@ public: dcpomatic_sleep_seconds (1); } - void set_dcp (boost::filesystem::path dcp) + void set_dcp_paths (vector dcps) { - if (!boost::filesystem::exists(dcp / "ASSETMAP") && !boost::filesystem::exists(dcp / "ASSETMAP.xml")) { - error_dialog (nullptr, _("No ASSETMAP or ASSETMAP.xml found in this folder. Please choose a DCP folder.")); - return; - } - - _dcp_path = dcp; - _dcp_name->SetLabel (std_to_wx(dcp.filename().string())); + _dcp_paths = dcps; + setup_sensitivity(); } private: + vector dcp_paths() const + { + return _dcp_paths; + } + void sized (wxSizeEvent& ev) { _sizer->Layout (); @@ -213,16 +249,14 @@ private: return true; } - auto d = new wxMessageDialog ( - 0, + auto d = make_wx( + nullptr, _("There are unfinished jobs; are you sure you want to quit?"), _("Unfinished jobs"), wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION ); - bool const r = d->ShowModal() == wxID_YES; - d->Destroy (); - return r; + return d->ShowModal() == wxID_YES; } @@ -236,22 +270,6 @@ private: ev.Skip (); } - - void open () - { - 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 (); - - if (r != wxID_OK) { - return; - } - - set_dcp (path); - setup_sensitivity (); - } - void copy () { /* Check that the selected drive still exists and update its properties if so */ @@ -262,15 +280,15 @@ private: } DCPOMATIC_ASSERT (_drive->GetSelection() != wxNOT_FOUND); - DCPOMATIC_ASSERT (static_cast(_dcp_path)); + DCPOMATIC_ASSERT (!_dcp_paths.empty()); auto ping = [this](int attempt) { if (_nanomsg.send(DISK_WRITER_PING "\n", 1000)) { - auto reply = _nanomsg.receive (1000); - if (reply && *reply == DISK_WRITER_PONG) { + auto reply = DiskWriterBackEndResponse::read_from_nanomsg(_nanomsg, 1000); + if (reply && reply->type() == DiskWriterBackEndResponse::Type::PONG) { return true; } else if (reply) { - LOG_DISK("Unexpected response %1 to ping received (attempt %2)", *reply, attempt); + LOG_DISK("Unexpected response %1 to ping received (attempt %2)", static_cast(reply->type()), attempt); } else { LOG_DISK("No reply received from ping (attempt %1)", attempt); } @@ -291,22 +309,20 @@ private: if (!have_writer) { #if defined(DCPOMATIC_WINDOWS) - auto m = new MessageDialog ( + auto m = make_wx( 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.") ); m->ShowModal (); - m->Destroy (); return; #elif defined(DCPOMATIC_OSX) - auto m = new MessageDialog ( + auto m = make_wx( this, _("DCP-o-matic Disk Writer"), _("Did you install the DCP-o-matic Disk Writer.pkg from the .dmg? Please check and try again.") ); m->ShowModal (); - m->Destroy (); return; #else LOG_DISK_NC ("Failed to ping writer"); @@ -316,9 +332,8 @@ private: auto const& drive = _drives[_drive->GetSelection()]; if (drive.mounted()) { - auto d = new TryUnmountDialog(this, drive.description()); + auto d = make_wx(this, drive.description()); int const r = d->ShowModal (); - d->Destroy (); if (r != wxID_OK) { return; } @@ -333,30 +348,33 @@ private: throw CommunicationFailedError (); } /* The reply may have to wait for the user to authenticate, so let's wait a while */ - auto reply = _nanomsg.receive (30000); - if (!reply || *reply != DISK_WRITER_OK) { - auto * m = new MessageDialog ( + auto const reply = DiskWriterBackEndResponse::read_from_nanomsg(_nanomsg, 30000); + if (!reply || reply->type() != DiskWriterBackEndResponse::Type::OK) { + auto m = make_wx( 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())) + wxString::Format( + _("The drive %s could not be unmounted.\nClose any application that is using it, then try again. (%s)"), + std_to_wx(drive.description()), + reply->error_message() + ) ); m->ShowModal (); - m->Destroy (); return; } } - auto * d = new DriveWipeWarningDialog (this, _drive->GetString(_drive->GetSelection())); - int const r = d->ShowModal (); - bool ok = r == wxID_OK && d->confirmed(); - d->Destroy (); - - if (!ok) { + auto d = make_wx(this, _drive->GetString(_drive->GetSelection())); + if (d->ShowModal() != wxID_OK) { + return; + } + if (!d->confirmed()) { + message_dialog(this, _("You did not correctly confirm that you read the warning that was just shown. Please try again.")); return; } - JobManager::instance()->add(make_shared(*_dcp_path, _drives[_drive->GetSelection()], _nanomsg)); + JobManager::instance()->add(make_shared(_dcp_paths, _drives[_drive->GetSelection()], _nanomsg)); setup_sensitivity (); } @@ -385,16 +403,14 @@ private: void setup_sensitivity () { - _copy->Enable (static_cast(_dcp_path) && _drive->GetSelection() != wxNOT_FOUND && !JobManager::instance()->work_to_do()); + _copy->Enable (!_dcp_paths.empty() && _drive->GetSelection() != wxNOT_FOUND && !JobManager::instance()->work_to_do()); } - wxStaticText* _dcp_name; - wxButton* _dcp_open; wxChoice* _drive; wxButton* _drive_refresh; wxButton* _copy; JobManagerView* _jobs; - boost::optional _dcp_path; + std::vector _dcp_paths; std::vector _drives; #ifndef DCPOMATIC_OSX boost::process::child* _writer; @@ -460,12 +476,14 @@ public: Config::drop (); if (!_skip_alpha_check) { - auto warning = new DiskWarningDialog (); - warning->ShowModal (); + auto warning = make_wx(); + if (warning->ShowModal() != wxID_OK) { + return false; + } if (!warning->confirmed()) { + message_dialog(nullptr, _("You did not correctly confirm that you read the warning that was just shown. DCP-o-matic Disk Writer will close now. Please try again.")); return false; } - warning->Destroy (); } _frame = new DOMFrame (_("DCP-o-matic Disk Writer")); @@ -474,7 +492,7 @@ public: _frame->Show (); if (_dcp_to_write) { - _frame->set_dcp (*_dcp_to_write); + _frame->set_dcp_paths({*_dcp_to_write}); } signal_manager = new wxSignalManager (this);