diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-07-20 23:57:23 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-07-20 23:57:23 +0100 |
| commit | 69812a7d02f5714a80a0a131b96f5f76a8f3c3a3 (patch) | |
| tree | 1a7eeac86387b96fdeaf4d5df598e717c8e2101a /src | |
| parent | 0082d0c784a83746d883182ce49ea298f7a1390e (diff) | |
Remove polling from JobManagerView and use signals instead (fixes #137).
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/job.cc | 4 | ||||
| -rw-r--r-- | src/lib/job.h | 1 | ||||
| -rw-r--r-- | src/lib/job_manager.cc | 12 | ||||
| -rw-r--r-- | src/lib/job_manager.h | 1 | ||||
| -rw-r--r-- | src/wx/job_manager_view.cc | 186 | ||||
| -rw-r--r-- | src/wx/job_manager_view.h | 9 |
6 files changed, 111 insertions, 102 deletions
diff --git a/src/lib/job.cc b/src/lib/job.cc index 5d8a68ec0..18df40878 100644 --- a/src/lib/job.cc +++ b/src/lib/job.cc @@ -215,6 +215,10 @@ Job::set_progress (float p) if (paused ()) { dcpomatic_sleep (1); } + + if (ui_signaller) { + ui_signaller->emit (boost::bind (boost::ref (Progress))); + } } /** @return fractional overall progress, or -1 if not known */ diff --git a/src/lib/job.h b/src/lib/job.h index 716b0c5c6..343d40095 100644 --- a/src/lib/job.h +++ b/src/lib/job.h @@ -71,6 +71,7 @@ public: void descend (float); float overall_progress () const; + boost::signals2::signal<void()> Progress; /** Emitted from the UI thread when the job is finished */ boost::signals2::signal<void()> Finished; diff --git a/src/lib/job_manager.cc b/src/lib/job_manager.cc index 2d216dacb..95961c3fc 100644 --- a/src/lib/job_manager.cc +++ b/src/lib/job_manager.cc @@ -31,6 +31,7 @@ using std::string; using std::list; using boost::shared_ptr; +using boost::weak_ptr; JobManager* JobManager::_instance = 0; @@ -43,8 +44,15 @@ JobManager::JobManager () shared_ptr<Job> JobManager::add (shared_ptr<Job> j) { - boost::mutex::scoped_lock lm (_mutex); - _jobs.push_back (j); + { + boost::mutex::scoped_lock lm (_mutex); + _jobs.push_back (j); + } + + if (ui_signaller) { + ui_signaller->emit (boost::bind (boost::ref (JobAdded), weak_ptr<Job> (j))); + } + return j; } diff --git a/src/lib/job_manager.h b/src/lib/job_manager.h index 7d58dcfe6..0040568c6 100644 --- a/src/lib/job_manager.h +++ b/src/lib/job_manager.h @@ -39,6 +39,7 @@ public: bool work_to_do () const; bool errors () const; + boost::signals2::signal<void (boost::weak_ptr<Job>)> JobAdded; boost::signals2::signal<void (bool)> ActiveJobsChanged; static JobManager* instance (); diff --git a/src/wx/job_manager_view.cc b/src/wx/job_manager_view.cc index b5c66bd3e..dffe3a90a 100644 --- a/src/wx/job_manager_view.cc +++ b/src/wx/job_manager_view.cc @@ -32,6 +32,7 @@ using std::string; using std::list; using std::map; using boost::shared_ptr; +using boost::weak_ptr; /** Must be called in the GUI thread */ JobManagerView::JobManagerView (wxWindow* parent, Buttons buttons) @@ -54,115 +55,110 @@ JobManagerView::JobManagerView (wxWindow* parent, Buttons buttons) SetScrollRate (0, 32); - Connect (wxID_ANY, wxEVT_TIMER, wxTimerEventHandler (JobManagerView::periodic), 0, this); - _timer.reset (new wxTimer (this)); - _timer->Start (1000); - - update (); + JobManager::instance()->JobAdded.connect (bind (&JobManagerView::job_added, this, _1)); } void -JobManagerView::periodic (wxTimerEvent &) +JobManagerView::job_added (weak_ptr<Job> j) { - update (); + shared_ptr<Job> job = j.lock (); + if (!job) { + return; + } + + wxStaticText* m = new wxStaticText (_panel, wxID_ANY, std_to_wx (job->name ())); + _table->Insert (0, m, 0, wxALIGN_CENTER_VERTICAL | wxALL, 6); + + JobRecord r; + int n = 1; + r.scroll_nudged = false; + r.gauge = new wxGauge (_panel, wxID_ANY, 100); + _table->Insert (n, r.gauge, 1, wxEXPAND | wxLEFT | wxRIGHT); + ++n; + + r.message = new wxStaticText (_panel, wxID_ANY, std_to_wx ("")); + _table->Insert (n, r.message, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); + ++n; + + r.cancel = new wxButton (_panel, wxID_ANY, _("Cancel")); + r.cancel->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (JobManagerView::cancel_clicked), 0, this); + _table->Insert (n, r.cancel, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); + ++n; + + if (_buttons & PAUSE) { + r.pause = new wxButton (_panel, wxID_ANY, _("Pause")); + r.pause->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (JobManagerView::pause_clicked), 0, this); + _table->Insert (n, r.pause, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); + ++n; + } + + r.details = new wxButton (_panel, wxID_ANY, _("Details...")); + r.details->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (JobManagerView::details_clicked), 0, this); + r.details->Enable (false); + _table->Insert (n, r.details, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); + ++n; + + _job_records[job] = r; + + job->Progress.connect (bind (&JobManagerView::progress, this, j)); + job->Progress.connect (bind (&JobManagerView::finished, this, j)); + + _table->Layout (); + FitInside (); } -/** Update the view by examining the state of each job. - * Must be called in the GUI thread. - */ void -JobManagerView::update () +JobManagerView::progress (weak_ptr<Job> j) { - list<shared_ptr<Job> > jobs = JobManager::instance()->get (); + shared_ptr<Job> job = j.lock (); + if (!job) { + return; + } - int index = 0; + float const p = job->overall_progress (); + if (p >= 0) { + checked_set (_job_records[job].message, job->status ()); + _job_records[job].gauge->SetValue (p * 100); + } else { + checked_set (_job_records[job].message, wx_to_std (_("Running"))); + _job_records[job].gauge->Pulse (); + } - for (list<shared_ptr<Job> >::iterator i = jobs.begin(); i != jobs.end(); ++i) { + if (!_job_records[job].scroll_nudged && (job->running () || job->finished())) { + int x, y; + _job_records[job].gauge->GetPosition (&x, &y); + int px, py; + GetScrollPixelsPerUnit (&px, &py); + int vx, vy; + GetViewStart (&vx, &vy); + int sx, sy; + GetClientSize (&sx, &sy); - if (_job_records.find (*i) == _job_records.end ()) { - wxStaticText* m = new wxStaticText (_panel, wxID_ANY, std_to_wx ((*i)->name ())); - _table->Insert (index, m, 0, wxALIGN_CENTER_VERTICAL | wxALL, 6); - - JobRecord r; - int n = 1; - r.finalised = false; - r.scroll_nudged = false; - r.gauge = new wxGauge (_panel, wxID_ANY, 100); - _table->Insert (index + n, r.gauge, 1, wxEXPAND | wxLEFT | wxRIGHT); - ++n; - - r.message = new wxStaticText (_panel, wxID_ANY, std_to_wx ("")); - _table->Insert (index + n, r.message, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); - ++n; - - r.cancel = new wxButton (_panel, wxID_ANY, _("Cancel")); - r.cancel->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (JobManagerView::cancel_clicked), 0, this); - _table->Insert (index + n, r.cancel, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); - ++n; - - if (_buttons & PAUSE) { - r.pause = new wxButton (_panel, wxID_ANY, _("Pause")); - r.pause->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (JobManagerView::pause_clicked), 0, this); - _table->Insert (index + n, r.pause, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); - ++n; - } - - r.details = new wxButton (_panel, wxID_ANY, _("Details...")); - r.details->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (JobManagerView::details_clicked), 0, this); - r.details->Enable (false); - _table->Insert (index + n, r.details, 1, wxALIGN_CENTER_VERTICAL | wxALL, 6); - ++n; - - _job_records[*i] = r; - - } - - string const st = (*i)->status (); - - if (!(*i)->finished ()) { - float const p = (*i)->overall_progress (); - if (p >= 0) { - checked_set (_job_records[*i].message, st); - _job_records[*i].gauge->SetValue (p * 100); - } else { - checked_set (_job_records[*i].message, wx_to_std (_("Running"))); - _job_records[*i].gauge->Pulse (); - } - + if (y > (vy * py + sy / 2)) { + Scroll (-1, y / py); + _job_records[job].scroll_nudged = true; } + } - if (!_job_records[*i].scroll_nudged && ((*i)->running () || (*i)->finished())) { - int x, y; - _job_records[*i].gauge->GetPosition (&x, &y); - int px, py; - GetScrollPixelsPerUnit (&px, &py); - int vx, vy; - GetViewStart (&vx, &vy); - int sx, sy; - GetClientSize (&sx, &sy); - - if (y > (vy * py + sy / 2)) { - Scroll (-1, y / py); - _job_records[*i].scroll_nudged = true; - } - } - - if ((*i)->finished() && !_job_records[*i].finalised) { - checked_set (_job_records[*i].message, st); - if (!(*i)->finished_cancelled()) { - _job_records[*i].gauge->SetValue (100); - } - _job_records[*i].finalised = true; - _job_records[*i].cancel->Enable (false); - if (!(*i)->error_details().empty ()) { - _job_records[*i].details->Enable (true); - } - } + _table->Layout (); + FitInside (); +} - index += 5; - if (_buttons & PAUSE) { - ++index; - } +void +JobManagerView::finished (weak_ptr<Job> j) +{ + shared_ptr<Job> job = j.lock (); + if (!job) { + return; + } + + checked_set (_job_records[job].message, job->status ()); + if (!job->finished_cancelled ()) { + _job_records[job].gauge->SetValue (100); + } + _job_records[job].cancel->Enable (false); + if (!job->error_details().empty ()) { + _job_records[job].details->Enable (true); } _table->Layout (); diff --git a/src/wx/job_manager_view.h b/src/wx/job_manager_view.h index 3d1ad30c0..e3d885f94 100644 --- a/src/wx/job_manager_view.h +++ b/src/wx/job_manager_view.h @@ -39,15 +39,15 @@ public: JobManagerView (wxWindow *, Buttons); - void update (); - private: - void periodic (wxTimerEvent &); void cancel_clicked (wxCommandEvent &); void pause_clicked (wxCommandEvent &); void details_clicked (wxCommandEvent &); - boost::shared_ptr<wxTimer> _timer; + void job_added (boost::weak_ptr<Job>); + void progress (boost::weak_ptr<Job>); + void finished (boost::weak_ptr<Job>); + wxPanel* _panel; wxFlexGridSizer* _table; struct JobRecord { @@ -56,7 +56,6 @@ private: wxButton* cancel; wxButton* pause; wxButton* details; - bool finalised; bool scroll_nudged; }; |
