From 110d7d4e111c2db31489296587d855328c5d8b34 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 24 Oct 2012 23:58:26 +0100 Subject: [PATCH] Fix shared_ptr for Film. --- src/lib/film.cc | 4 ++-- src/lib/format.cc | 12 ++++++++---- src/lib/format.h | 14 +++++++------- src/lib/job_manager.cc | 15 ++++++++++++++- src/lib/job_manager.h | 5 +++++ src/tools/dvdomatic.cc | 22 ++++++++++++---------- src/wx/dci_name_dialog.cc | 4 +++- src/wx/dci_name_dialog.h | 5 +++-- src/wx/dcp_range_dialog.cc | 4 +++- src/wx/dcp_range_dialog.h | 4 ++-- src/wx/film_editor.cc | 24 ++++++++++++++++++++---- src/wx/film_editor.h | 8 +++++--- src/wx/film_viewer.cc | 11 +++++------ src/wx/film_viewer.h | 6 +++--- src/wx/job_wrapper.cc | 4 ++-- src/wx/job_wrapper.h | 2 +- src/wx/properties_dialog.cc | 12 ++++++++---- src/wx/properties_dialog.h | 4 ++-- test/test.cc | 4 ++-- 19 files changed, 107 insertions(+), 57 deletions(-) diff --git a/src/lib/film.cc b/src/lib/film.cc index 0104f5a16..72da570f0 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -266,8 +266,8 @@ Film::make_dcp (bool transcode) } } - o->padding = format()->dcp_padding (this); - o->ratio = format()->ratio_as_float (this); + o->padding = format()->dcp_padding (shared_from_this ()); + o->ratio = format()->ratio_as_float (shared_from_this ()); o->decode_subtitles = with_subtitles (); shared_ptr r; diff --git a/src/lib/format.cc b/src/lib/format.cc index 2eb4990da..eb42593fe 100644 --- a/src/lib/format.cc +++ b/src/lib/format.cc @@ -30,7 +30,11 @@ #include "format.h" #include "film.h" -using namespace std; +using std::string; +using std::setprecision; +using std::stringstream; +using std::vector; +using boost::shared_ptr; vector Format::_formats; @@ -143,7 +147,7 @@ FixedFormat::FixedFormat (int r, Size dcp, string id, string n, string d) } int -Format::dcp_padding (Film const * f) const +Format::dcp_padding (shared_ptr f) const { int p = rint ((_dcp_size.width - (_dcp_size.height * ratio_as_integer(f) / 100.0)) / 2.0); @@ -162,13 +166,13 @@ VariableFormat::VariableFormat (Size dcp, string id, string n, string d) } int -VariableFormat::ratio_as_integer (Film const * f) const +VariableFormat::ratio_as_integer (shared_ptr f) const { return rint (ratio_as_float (f) * 100); } float -VariableFormat::ratio_as_float (Film const * f) const +VariableFormat::ratio_as_float (shared_ptr f) const { return float (f->size().width) / f->size().height; } diff --git a/src/lib/format.h b/src/lib/format.h index 35dd4fb85..2118237a4 100644 --- a/src/lib/format.h +++ b/src/lib/format.h @@ -41,12 +41,12 @@ public: /** @return the aspect ratio multiplied by 100 * (e.g. 239 for Cinemascope 2.39:1) */ - virtual int ratio_as_integer (Film const * f) const = 0; + virtual int ratio_as_integer (boost::shared_ptr f) const = 0; /** @return the ratio as a floating point number */ - virtual float ratio_as_float (Film const * f) const = 0; + virtual float ratio_as_float (boost::shared_ptr f) const = 0; - int dcp_padding (Film const * f) const; + int dcp_padding (boost::shared_ptr f) const; /** @return size in pixels of the images that we should * put in a DCP for this ratio. This size will not correspond @@ -106,11 +106,11 @@ class FixedFormat : public Format public: FixedFormat (int, Size, std::string, std::string, std::string); - int ratio_as_integer (Film const *) const { + int ratio_as_integer (boost::shared_ptr) const { return _ratio; } - float ratio_as_float (Film const *) const { + float ratio_as_float (boost::shared_ptr) const { return _ratio / 100.0; } @@ -127,8 +127,8 @@ class VariableFormat : public Format public: VariableFormat (Size, std::string, std::string, std::string); - int ratio_as_integer (Film const * f) const; - float ratio_as_float (Film const * f) const; + int ratio_as_integer (boost::shared_ptr f) const; + float ratio_as_float (boost::shared_ptr f) const; std::string name () const; }; diff --git a/src/lib/job_manager.cc b/src/lib/job_manager.cc index 5cc340357..1fae17965 100644 --- a/src/lib/job_manager.cc +++ b/src/lib/job_manager.cc @@ -26,6 +26,7 @@ #include "job_manager.h" #include "job.h" #include "cross.h" +#include "ui_signaller.h" using std::string; using std::list; @@ -34,6 +35,7 @@ using boost::shared_ptr; JobManager* JobManager::_instance = 0; JobManager::JobManager () + : _last_active_jobs (false) { boost::thread (boost::bind (&JobManager::scheduler, this)); } @@ -88,11 +90,13 @@ JobManager::errors () const return false; } - void JobManager::scheduler () { while (1) { + + bool active_jobs = false; + { boost::mutex::scoped_lock lm (_mutex); for (list >::iterator i = _jobs.begin(); i != _jobs.end(); ++i) { @@ -110,9 +114,18 @@ JobManager::scheduler () break; } } + + if (!(*i)->finished ()) { + active_jobs = true; + } } } + if (active_jobs != _last_active_jobs) { + _last_active_jobs = active_jobs; + ui_signaller->emit (boost::bind (boost::ref (ActiveJobsChanged), active_jobs)); + } + dvdomatic_sleep (1); } } diff --git a/src/lib/job_manager.h b/src/lib/job_manager.h index 4b70738f0..cc1c1d28f 100644 --- a/src/lib/job_manager.h +++ b/src/lib/job_manager.h @@ -23,6 +23,7 @@ #include #include +#include class Job; @@ -39,6 +40,8 @@ public: bool work_to_do () const; bool errors () const; + boost::signals2::signal ActiveJobsChanged; + static JobManager* instance (); private: @@ -48,5 +51,7 @@ private: mutable boost::mutex _mutex; std::list > _jobs; + bool _last_active_jobs; + static JobManager* _instance; }; diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index add0f6144..b5c81da07 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -42,13 +42,16 @@ #include "lib/version.h" #include "lib/ui_signaller.h" -using namespace std; -using namespace boost; +using std::string; +using std::stringstream; +using std::map; +using std::make_pair; +using boost::shared_ptr; static FilmEditor* film_editor = 0; static FilmViewer* film_viewer = 0; -static Film* film = 0; +static shared_ptr film; static void set_menu_sensitivity (); @@ -95,8 +98,7 @@ maybe_save_then_delete_film () } } - delete film; - film = 0; + film.reset (); } enum Sensitivity { @@ -264,11 +266,11 @@ public: if (r == wxID_OK) { maybe_save_then_delete_film (); - film = new Film (d->get_path (), false); + film.reset (new Film (d->get_path (), false)); #if BOOST_FILESYSTEM_VERSION == 3 - film->set_name (filesystem::path (d->get_path()).filename().generic_string()); + film->set_name (boost::filesystem::path (d->get_path()).filename().generic_string()); #else - film->set_name (filesystem::path (d->get_path()).filename()); + film->set_name (boost::filesystem::path (d->get_path()).filename()); #endif set_film (); } @@ -284,7 +286,7 @@ public: if (r == wxID_OK) { maybe_save_then_delete_film (); - film = new Film (wx_to_std (c->GetPath ())); + film.reset (new Film (wx_to_std (c->GetPath ()))); set_film (); } } @@ -376,7 +378,7 @@ class App : public wxApp dvdomatic_setup (); if (argc == 2 && boost::filesystem::is_directory (wx_to_std (argv[1]))) { - film = new Film (wx_to_std (argv[1])); + film.reset (new Film (wx_to_std (argv[1]))); } Frame* f = new Frame (_("DVD-o-matic")); diff --git a/src/wx/dci_name_dialog.cc b/src/wx/dci_name_dialog.cc index ee8864ff9..bb6c25807 100644 --- a/src/wx/dci_name_dialog.cc +++ b/src/wx/dci_name_dialog.cc @@ -22,7 +22,9 @@ #include "wx_util.h" #include "film.h" -DCINameDialog::DCINameDialog (wxWindow* parent, Film* film) +using boost::shared_ptr; + +DCINameDialog::DCINameDialog (wxWindow* parent, shared_ptr film) : wxDialog (parent, wxID_ANY, _("DCI name"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) , _film (film) { diff --git a/src/wx/dci_name_dialog.h b/src/wx/dci_name_dialog.h index d06420a6e..1fd5436b8 100644 --- a/src/wx/dci_name_dialog.h +++ b/src/wx/dci_name_dialog.h @@ -19,13 +19,14 @@ #include #include +#include class Film; class DCINameDialog : public wxDialog { public: - DCINameDialog (wxWindow *, Film *); + DCINameDialog (wxWindow *, boost::shared_ptr); private: void audio_language_changed (wxCommandEvent &); @@ -44,5 +45,5 @@ private: wxTextCtrl* _facility; wxTextCtrl* _package_type; - Film* _film; + boost::shared_ptr _film; }; diff --git a/src/wx/dcp_range_dialog.cc b/src/wx/dcp_range_dialog.cc index 6363275ca..509db121e 100644 --- a/src/wx/dcp_range_dialog.cc +++ b/src/wx/dcp_range_dialog.cc @@ -21,7 +21,9 @@ #include "dcp_range_dialog.h" #include "wx_util.h" -DCPRangeDialog::DCPRangeDialog (wxWindow* p, Film* f) +using boost::shared_ptr; + +DCPRangeDialog::DCPRangeDialog (wxWindow* p, shared_ptr f) : wxDialog (p, wxID_ANY, wxString (_("DCP Range"))) , _film (f) { diff --git a/src/wx/dcp_range_dialog.h b/src/wx/dcp_range_dialog.h index ea15154ba..2c5c3cec2 100644 --- a/src/wx/dcp_range_dialog.h +++ b/src/wx/dcp_range_dialog.h @@ -27,7 +27,7 @@ class Film; class DCPRangeDialog : public wxDialog { public: - DCPRangeDialog (wxWindow *, Film *); + DCPRangeDialog (wxWindow *, boost::shared_ptr); boost::signals2::signal Changed; @@ -40,7 +40,7 @@ private: void set_sensitivity (); void emit_changed (); - Film* _film; + boost::shared_ptr _film; wxRadioButton* _whole; wxRadioButton* _first; wxSpinCtrl* _n_frames; diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index b90731cf3..34223ce05 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -45,11 +45,17 @@ #include "dci_name_dialog.h" #include "scaler.h" -using namespace std; -using namespace boost; +using std::string; +using std::stringstream; +using std::pair; +using std::fixed; +using std::setprecision; +using std::list; +using std::vector; +using boost::shared_ptr; /** @param f Film to edit */ -FilmEditor::FilmEditor (Film* f, wxWindow* parent) +FilmEditor::FilmEditor (shared_ptr f, wxWindow* parent) : wxPanel (parent) , _ignore_changes (Film::NONE) , _film (f) @@ -231,6 +237,10 @@ FilmEditor::FilmEditor (Film* f, wxWindow* parent) _scaler->Append (std_to_wx ((*i)->name())); } + JobManager::instance()->ActiveJobsChanged.connect ( + bind (&FilmEditor::active_jobs_changed, this, _1) + ); + /* And set their values from the Film */ set_film (f); @@ -587,7 +597,7 @@ FilmEditor::dcp_content_type_changed (wxCommandEvent &) /** Sets the Film that we are editing */ void -FilmEditor::set_film (Film* f) +FilmEditor::set_film (shared_ptr f) { _film = f; @@ -930,3 +940,9 @@ FilmEditor::setup_audio_details () _audio->SetLabel (std_to_wx (s.str ())); } } + +void +FilmEditor::active_jobs_changed (bool a) +{ + set_things_sensitive (!a); +} diff --git a/src/wx/film_editor.h b/src/wx/film_editor.h index f6e180979..2d3659615 100644 --- a/src/wx/film_editor.h +++ b/src/wx/film_editor.h @@ -37,9 +37,9 @@ class Film; class FilmEditor : public wxPanel { public: - FilmEditor (Film *, wxWindow *); + FilmEditor (boost::shared_ptr, wxWindow *); - void set_film (Film *); + void set_film (boost::shared_ptr); void setup_visibility (); boost::signals2::signal FileChanged; @@ -85,10 +85,12 @@ private: wxControl* video_control (wxControl *); wxControl* still_control (wxControl *); + void active_jobs_changed (bool); + Film::Property _ignore_changes; /** The film we are editing */ - Film* _film; + boost::shared_ptr _film; /** The Film's name */ wxTextCtrl* _name; wxStaticText* _dcp_name; diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 2496679aa..79de49406 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -40,7 +40,7 @@ using boost::shared_ptr; class ThumbPanel : public wxPanel { public: - ThumbPanel (wxPanel* parent, Film* film) + ThumbPanel (wxPanel* parent, shared_ptr film) : wxPanel (parent) , _film (film) , _frame_rebuild_needed (false) @@ -100,7 +100,7 @@ public: Refresh (); } - void set_film (Film* f) + void set_film (shared_ptr f) { _film = f; if (!_film) { @@ -189,7 +189,7 @@ private: } } - Film* _film; + shared_ptr _film; shared_ptr _image; wxImage _transformed_image; /** currently-displayed thumbnail index */ @@ -224,9 +224,8 @@ EVT_PAINT (ThumbPanel::paint_event) EVT_SIZE (ThumbPanel::size_event) END_EVENT_TABLE () -FilmViewer::FilmViewer (Film* f, wxWindow* p) +FilmViewer::FilmViewer (shared_ptr f, wxWindow* p) : wxPanel (p) - , _film (0) { _sizer = new wxBoxSizer (wxVERTICAL); SetSizer (_sizer); @@ -293,7 +292,7 @@ FilmViewer::film_changed (Film::Property p) } void -FilmViewer::set_film (Film* f) +FilmViewer::set_film (shared_ptr f) { if (_film == f) { return; diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h index ecd6bc308..95bdf099d 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -32,9 +32,9 @@ class ThumbPanel; class FilmViewer : public wxPanel { public: - FilmViewer (Film *, wxWindow *); + FilmViewer (boost::shared_ptr, wxWindow *); - void set_film (Film *); + void set_film (boost::shared_ptr); void setup_visibility (); private: @@ -42,7 +42,7 @@ private: void set_thumbnail (int); void film_changed (Film::Property); - Film* _film; + boost::shared_ptr _film; wxBoxSizer* _sizer; ThumbPanel* _thumb_panel; wxSlider* _slider; diff --git a/src/wx/job_wrapper.cc b/src/wx/job_wrapper.cc index cc7507547..f2056cf49 100644 --- a/src/wx/job_wrapper.cc +++ b/src/wx/job_wrapper.cc @@ -23,10 +23,10 @@ #include "job_wrapper.h" #include "wx_util.h" -using namespace std; +using boost::shared_ptr; void -JobWrapper::make_dcp (wxWindow* parent, Film* film, bool transcode) +JobWrapper::make_dcp (wxWindow* parent, shared_ptr film, bool transcode) { if (!film) { return; diff --git a/src/wx/job_wrapper.h b/src/wx/job_wrapper.h index 4722cfdd4..7120e9f10 100644 --- a/src/wx/job_wrapper.h +++ b/src/wx/job_wrapper.h @@ -24,6 +24,6 @@ class Film; namespace JobWrapper { -void make_dcp (wxWindow *, Film *, bool); +void make_dcp (wxWindow *, boost::shared_ptr, bool); } diff --git a/src/wx/properties_dialog.cc b/src/wx/properties_dialog.cc index b8a47e0e3..0ffbd06cb 100644 --- a/src/wx/properties_dialog.cc +++ b/src/wx/properties_dialog.cc @@ -25,10 +25,14 @@ #include "properties_dialog.h" #include "wx_util.h" -using namespace std; -using namespace boost; +using std::string; +using std::stringstream; +using std::fixed; +using std::setprecision; +using boost::shared_ptr; +using boost::lexical_cast; -PropertiesDialog::PropertiesDialog (wxWindow* parent, Film* film) +PropertiesDialog::PropertiesDialog (wxWindow* parent, shared_ptr film) : wxDialog (parent, wxID_ANY, _("Film Properties"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) , _film (film) { @@ -83,7 +87,7 @@ PropertiesDialog::frames_already_encoded () const stringstream u; try { u << _film->encoded_frames (); - } catch (thread_interrupted &) { + } catch (boost::thread_interrupted &) { return ""; } diff --git a/src/wx/properties_dialog.h b/src/wx/properties_dialog.h index f72c83419..308c0f7b3 100644 --- a/src/wx/properties_dialog.h +++ b/src/wx/properties_dialog.h @@ -25,12 +25,12 @@ class ThreadedStaticText; class PropertiesDialog : public wxDialog { public: - PropertiesDialog (wxWindow *, Film *); + PropertiesDialog (wxWindow *, boost::shared_ptr); private: std::string frames_already_encoded () const; - Film* _film; + boost::shared_ptr _film; wxStaticText* _frames; wxStaticText* _disk_for_frames; wxStaticText* _total_disk; diff --git a/test/test.cc b/test/test.cc index 2eaea1624..ddb6cbb55 100644 --- a/test/test.cc +++ b/test/test.cc @@ -123,11 +123,11 @@ BOOST_AUTO_TEST_CASE (format_test) Format const * f = Format::from_nickname ("Flat"); BOOST_CHECK (f); - BOOST_CHECK_EQUAL (f->ratio_as_integer(0), 185); + BOOST_CHECK_EQUAL (f->ratio_as_integer(shared_ptr ()), 185); f = Format::from_nickname ("Scope"); BOOST_CHECK (f); - BOOST_CHECK_EQUAL (f->ratio_as_integer(0), 239); + BOOST_CHECK_EQUAL (f->ratio_as_integer(shared_ptr ()), 239); } BOOST_AUTO_TEST_CASE (util_test) -- 2.30.2