Fix for user input processing in wxProgressDialog.

Yield for input event processing before updating the dialog instead of doing
it after this as the latter apparently doesn't always work.

Closes #10645.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64385 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2010-05-22 16:14:11 +00:00
parent bfd62c8c2a
commit 86417abf07
2 changed files with 27 additions and 5 deletions

View File

@ -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();

View File

@ -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;