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); void UpdateMessage(const wxString &newmsg);
// common part of Update() and Pulse(), returns true if not cancelled // 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 // shortcuts for enabling buttons
void EnableClose(); void EnableClose();

View File

@@ -313,6 +313,9 @@ wxProgressDialog::CreateLabel(const wxString& text, wxSizer *sizer)
bool bool
wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) 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") ); wxASSERT_MSG( value == -1 || m_gauge, wxT("cannot update non existent dialog") );
#ifdef __WXMSW__ #ifdef __WXMSW__
@@ -428,7 +431,7 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip)
} }
else // not at maximum yet else // not at maximum yet
{ {
return DoAfterUpdate(skip); DoAfterUpdate();
} }
// update the display in case yielding above didn't do it // 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) bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip)
{ {
if ( !DoBeforeUpdate(skip) )
return false;
wxASSERT_MSG( m_gauge, wxT("cannot update non existent dialog") ); wxASSERT_MSG( m_gauge, wxT("cannot update non existent dialog") );
// show a bit of progress // show a bit of progress
@@ -455,13 +461,15 @@ bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip)
SetTimeLabel((unsigned long)-1, m_remaining); 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, 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 // 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 // also to process the clicks on the cancel and skip buttons
@@ -481,6 +489,17 @@ bool wxProgressDialog::DoAfterUpdate(bool *skip)
return m_state != Canceled; 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() void wxProgressDialog::Resume()
{ {
m_state = Continue; m_state = Continue;