]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix for user input processing in wxProgressDialog.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 22 May 2010 16:14:11 +0000 (16:14 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 22 May 2010 16:14:11 +0000 (16:14 +0000)
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

include/wx/generic/progdlgg.h
src/generic/progdlgg.cpp

index 5a90d1f1f45eb4431b336617705579611d937f52..ce05dd40f8ee4b1f27c70e3462f230f7f99cdc07 100644 (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();
index ef7b89b24e5638af8739386a79e096422fee417a..77ec484ac179480f17f336b7ed20af4b44bce1b6 100644 (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;