From ba8350385b30409cb69faa07a74dd3bb8b355e00 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 16 May 2018 23:07:21 +0100 Subject: [PATCH] Add cancel button to player progress (#1294). --- ChangeLog | 6 +++++- src/tools/dcpomatic_player.cc | 30 ++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index dd554346a..15c2bbf0f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,12 @@ +2018-05-16 Carl Hetherington + + * Add cancel button to DCP verification progress dialogue (#1294). + 2018-05-15 Carl Hetherington * Fix crash on enabling telecine filter. - * Fix incorrect subtitle positining in a VF when there are more than + * Fix incorrect subtitle positioning in a VF when there are more than two consecutive reels with no subtitles. * Fix missing burnt-in / previewed subtitles containing ampersands. diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index d1f37784b..5c8c7d1d5 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -194,8 +194,8 @@ public: } _film->examine_and_add_content (dcp, true); - progress (_("Loading DCP")); - if (!report_errors_from_last_job()) { + bool const ok = progress (_("Loading DCP")); + if (!ok || !report_errors_from_last_job()) { return; } @@ -343,8 +343,8 @@ private: DCPOMATIC_ASSERT (dcp); dcp->add_ov (wx_to_std(c->GetPath())); JobManager::instance()->add(shared_ptr(new ExamineContentJob (_film, dcp))); - progress (_("Loading DCP")); - if (!report_errors_from_last_job()) { + bool const ok = progress (_("Loading DCP")); + if (!ok || !report_errors_from_last_job()) { return; } setup_from_dcp (dcp); @@ -432,7 +432,10 @@ private: JobManager* jm = JobManager::instance (); jm->add (shared_ptr (new VerifyDCPJob (dcp->directories()))); - progress (_("Verifying DCP")); + bool const ok = progress (_("Verifying DCP")); + if (!ok) { + return; + } DCPOMATIC_ASSERT (!jm->get().empty()); shared_ptr last = dynamic_pointer_cast (jm->get().back()); @@ -568,18 +571,29 @@ private: private: - void progress (wxString task) + /** @return false if the task was cancelled */ + bool progress (wxString task) { JobManager* jm = JobManager::instance (); - wxProgressDialog* progress = new wxProgressDialog (_("DCP-o-matic Player"), task); + wxProgressDialog* progress = new wxProgressDialog (_("DCP-o-matic Player"), task, 100, 0, wxPD_CAN_ABORT); + + bool ok = true; while (jm->work_to_do() || signal_manager->ui_idle()) { dcpomatic_sleep (1); - progress->Pulse (); + if (!progress->Pulse()) { + /* user pressed cancel */ + BOOST_FOREACH (shared_ptr i, jm->get()) { + i->cancel(); + } + ok = false; + break; + } } progress->Destroy (); + return ok; } bool report_errors_from_last_job () -- 2.30.2