diff --git a/include/wx/generic/progdlgg.h b/include/wx/generic/progdlgg.h index 5a90d1f1f4..ce05dd40f8 100644 --- a/include/wx/generic/progdlgg.h +++ b/include/wx/generic/progdlgg.h @@ -81,7 +81,10 @@ private: void UpdateMessage(const wxString &newmsg); // common part of Update() and Pulse(), returns true if not cancelled - bool DoAfterUpdate(bool *skip); + bool DoBeforeUpdate(bool *skip); + + // common part of Update() and Pulse() + void DoAfterUpdate(); // shortcuts for enabling buttons void EnableClose(); diff --git a/src/generic/progdlgg.cpp b/src/generic/progdlgg.cpp index ef7b89b24e..77ec484ac1 100644 --- a/src/generic/progdlgg.cpp +++ b/src/generic/progdlgg.cpp @@ -313,6 +313,9 @@ wxProgressDialog::CreateLabel(const wxString& text, wxSizer *sizer) bool wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) { + if ( !DoBeforeUpdate(skip) ) + return false; + wxASSERT_MSG( value == -1 || m_gauge, wxT("cannot update non existent dialog") ); #ifdef __WXMSW__ @@ -428,7 +431,7 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) } else // not at maximum yet { - return DoAfterUpdate(skip); + DoAfterUpdate(); } // update the display in case yielding above didn't do it @@ -439,6 +442,9 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip) { + if ( !DoBeforeUpdate(skip) ) + return false; + wxASSERT_MSG( m_gauge, wxT("cannot update non existent dialog") ); // show a bit of progress @@ -455,13 +461,15 @@ bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip) SetTimeLabel((unsigned long)-1, m_remaining); } - return DoAfterUpdate(skip); + DoAfterUpdate(); + + return m_state != Canceled; } -bool wxProgressDialog::DoAfterUpdate(bool *skip) +bool wxProgressDialog::DoBeforeUpdate(bool *skip) { wxCHECK_MSG(wxEventLoopBase::GetActive(), false, - "wxProgressDialog::DoAfterUpdate needs a running event loop"); + "wxProgressDialog::DoBeforeUpdate needs a running event loop"); // we have to yield because not only we want to update the display but // also to process the clicks on the cancel and skip buttons @@ -481,6 +489,17 @@ bool wxProgressDialog::DoAfterUpdate(bool *skip) return m_state != Canceled; } +void wxProgressDialog::DoAfterUpdate() +{ + wxCHECK_RET(wxEventLoopBase::GetActive(), + "wxProgressDialog::DoAfterUpdate needs a running event loop"); + + // allow the window to repaint: + // NOTE: since we yield only for UI events with this call, there + // should be no side-effects + wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI); +} + void wxProgressDialog::Resume() { m_state = Continue;