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:
@@ -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();
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user