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();
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__
}
else // not at maximum yet
{
- return DoAfterUpdate(skip);
+ DoAfterUpdate();
}
// update the display in case yielding above didn't do it
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
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
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;