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:
parent
bfd62c8c2a
commit
86417abf07
@ -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();
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user