X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_view.cc;h=73cc9e68bcee4dde0d88698a4192ff97d4cdfc92;hb=45a932e0756a9e1f708606d9704425c8f5c5aeb5;hp=e1503e790f15d67161e11fb73c59881f8b8f4af3;hpb=620b7761a33d2e3641cd911bfe58e0fbb928c888;p=dcpomatic.git diff --git a/src/wx/content_view.cc b/src/wx/content_view.cc index e1503e790..73cc9e68b 100644 --- a/src/wx/content_view.cc +++ b/src/wx/content_view.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2018 Carl Hetherington + Copyright (C) 2018-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,30 +18,39 @@ */ + #include "content_view.h" #include "wx_util.h" -#include "lib/dcpomatic_assert.h" #include "lib/config.h" -#include "lib/dcp_content.h" #include "lib/content_factory.h" +#include "lib/cross.h" +#include "lib/dcp_content.h" +#include "lib/dcpomatic_assert.h" #include "lib/examine_content_job.h" #include "lib/job_manager.h" -#include "lib/cross.h" +#include "lib/util.h" #include +#include #include #include +LIBDCP_DISABLE_WARNINGS #include +LIBDCP_ENABLE_WARNINGS + -using std::string; using std::cout; -using boost::shared_ptr; -using boost::weak_ptr; +using std::dynamic_pointer_cast; +using std::list; +using std::make_shared; +using std::shared_ptr; +using std::string; +using std::weak_ptr; using boost::optional; -using boost::dynamic_pointer_cast; +using namespace dcpomatic; + -ContentView::ContentView (wxWindow* parent, weak_ptr film) +ContentView::ContentView (wxWindow* parent) : wxListCtrl (parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER) - , _film (film) { AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 80); /* type */ @@ -50,72 +59,86 @@ ContentView::ContentView (wxWindow* parent, weak_ptr film) AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 580); } + shared_ptr ContentView::selected () const { long int s = GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (s == -1) { - return shared_ptr(); + return {}; } DCPOMATIC_ASSERT (s < int(_content.size())); return _content[s]; } + void ContentView::update () { - shared_ptr film = _film.lock (); - if (!film) { - return; - } - using namespace boost::filesystem; DeleteAllItems (); _content.clear (); - optional dir = Config::instance()->player_content_directory(); - if (!dir) { - return; + auto dir = Config::instance()->player_content_directory(); + if (!dir || !boost::filesystem::is_directory(*dir)) { + dir = home_directory (); } wxProgressDialog progress (_("DCP-o-matic"), _("Reading content directory")); - JobManager* jm = JobManager::instance (); + auto jm = JobManager::instance (); - for (directory_iterator i = directory_iterator(*dir); i != directory_iterator(); ++i) { + list> jobs; + + for (auto i: directory_iterator(*dir)) { try { + progress.Pulse (); + shared_ptr content; - if (is_directory(*i) && (is_regular_file(*i / "ASSETMAP") || is_regular_file(*i / "ASSETMAP.xml"))) { - content.reset (new DCPContent(film, *i)); - } else if (i->path().extension() == ".mp4" || i->path().extension() == ".ecinema") { - content = content_factory(film, *i).front(); + if (is_directory(i) && contains_assetmap(i)) { + content = make_shared(i); + } else if (i.path().extension() == ".mp4") { + auto all_content = content_factory(i); + if (!all_content.empty()) { + content = all_content[0]; + } } if (content) { - jm->add (shared_ptr(new ExamineContentJob(film, content))); - while (jm->work_to_do()) { - if (!progress.Pulse()) { - /* user pressed cancel */ - BOOST_FOREACH (shared_ptr i, jm->get()) { - i->cancel(); - } - return; - } - dcpomatic_sleep (1); - } - if (report_errors_from_last_job (this)) { - add (content); - _content.push_back (content); - } + auto job = make_shared(shared_ptr(), content); + jm->add (job); + jobs.push_back (job); } } catch (boost::filesystem::filesystem_error& e) { /* Never mind */ - } catch (dcp::DCPReadError& e) { + } catch (dcp::ReadError& e) { /* Never mind */ } } + + while (jm->work_to_do()) { + if (!progress.Pulse()) { + /* user pressed cancel */ + for (auto i: jm->get()) { + i->cancel(); + } + return; + } + dcpomatic_sleep_seconds (1); + } + + /* Add content from successful jobs and report errors */ + for (auto i: jobs) { + if (i->finished_in_error()) { + error_dialog(this, std_to_wx(i->error_summary()) + ".\n", std_to_wx(i->error_details())); + } else { + add (i->content()); + _content.push_back (i->content()); + } + } } + void ContentView::add (shared_ptr content) { @@ -124,17 +147,16 @@ ContentView::add (shared_ptr content) wxListItem it; it.SetId(N); it.SetColumn(0); - DCPTime length = content->length_after_trim (); - int h, m, s, f; - length.split (24, h, m, s, f); - it.SetText(wxString::Format("%02d:%02d:%02d", h, m, s)); + auto length = content->approximate_length (); + auto const hmsf = length.split (24); + it.SetText(wxString::Format("%02d:%02d:%02d", hmsf.h, hmsf.m, hmsf.s)); InsertItem(it); - shared_ptr dcp = dynamic_pointer_cast(content); + auto dcp = dynamic_pointer_cast(content); if (dcp && dcp->content_kind()) { it.SetId(N); it.SetColumn(1); - it.SetText(std_to_wx(dcp::content_kind_to_string(*dcp->content_kind()))); + it.SetText(std_to_wx(dcp->content_kind()->name())); SetItem(it); } @@ -144,20 +166,15 @@ ContentView::add (shared_ptr content) SetItem(it); } + shared_ptr ContentView::get (string digest) const { - BOOST_FOREACH (shared_ptr i, _content) { + for (auto i: _content) { if (i->digest() == digest) { return i; } } - return shared_ptr(); -} - -void -ContentView::set_film (weak_ptr film) -{ - _film = film; + return {}; }