X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/695f550bfaa08c237dec723bdd1eddf0eacbc741..5fab0c8d86f7bd7015db8d0ece8ce02ba1b602d8:/src/generic/progdlgg.cpp diff --git a/src/generic/progdlgg.cpp b/src/generic/progdlgg.cpp index 6f4fec1fe8..224f40a593 100644 --- a/src/generic/progdlgg.cpp +++ b/src/generic/progdlgg.cpp @@ -38,9 +38,11 @@ #include "wx/dcclient.h" #include "wx/timer.h" #include "wx/settings.h" + #include "wx/app.h" #endif #include "wx/progdlg.h" +#include "wx/evtloop.h" // --------------------------------------------------------------------------- // macros @@ -148,7 +150,6 @@ wxProgressDialog::wxProgressDialog(const wxString& title, m_msg = new wxStaticText(this, wxID_ANY, message); sizerTop->Add(m_msg, 0, wxLEFT | wxTOP, 2*LAYOUT_MARGIN); - wxSize sizeLabel = m_msg->GetSize(); if ( maximum > 0 ) { int gauge_style = wxGA_HORIZONTAL; @@ -182,9 +183,6 @@ wxProgressDialog::wxProgressDialog(const wxString& title, m_break = 0; m_ctdelay = 0; - // if we are going to have at least one label, remember it in this var - wxStaticText *label = NULL; - // also count how many labels we really have size_t nTimeLabels = 0; @@ -194,7 +192,6 @@ wxProgressDialog::wxProgressDialog(const wxString& title, { nTimeLabels++; - label = m_elapsed = CreateLabel(_("Elapsed time:"), sizerLabels); } @@ -202,7 +199,6 @@ wxProgressDialog::wxProgressDialog(const wxString& title, { nTimeLabels++; - label = m_estimated = CreateLabel(_("Estimated time:"), sizerLabels); } @@ -210,7 +206,6 @@ wxProgressDialog::wxProgressDialog(const wxString& title, { nTimeLabels++; - label = m_remaining = CreateLabel(_("Remaining time:"), sizerLabels); } sizerTop->Add(sizerLabels, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, LAYOUT_MARGIN); @@ -394,7 +389,7 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) // so that we return true below and that out [Cancel] handler knew what // to do m_state = Finished; - if( !(GetWindowStyle() & wxPD_AUTO_HIDE) ) + if( !HasFlag(wxPD_AUTO_HIDE) ) { EnableClose(); DisableSkip(); @@ -408,7 +403,13 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) m_msg->SetLabel(_("Done.")); } - wxYieldIfNeeded() ; + wxCHECK_MSG(wxEventLoopBase::GetActive(), false, + "wxProgressDialog::Update 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)ShowModal(); } @@ -456,9 +457,14 @@ bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip) bool wxProgressDialog::DoAfterUpdate(bool *skip) { + wxCHECK_MSG(wxEventLoopBase::GetActive(), false, + "wxProgressDialog::DoAfterUpdate 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 - wxYieldIfNeeded(); + // NOTE: using YieldFor() this call shouldn't give re-entrancy problems + // for event handlers not interested to UI/user-input events. + wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI|wxEVT_CATEGORY_USER_INPUT); Update(); @@ -494,6 +500,25 @@ bool wxProgressDialog::Show( bool show ) return wxDialog::Show(show); } +int wxProgressDialog::GetValue() const +{ + if (m_gauge) + return m_gauge->GetValue(); + return wxNOT_FOUND; +} + +int wxProgressDialog::GetRange() const +{ + if (m_gauge) + return m_gauge->GetRange(); + return wxNOT_FOUND; +} + +wxString wxProgressDialog::GetMessage() const +{ + return m_msg->GetLabel(); +} + // ---------------------------------------------------------------------------- // event handlers // ---------------------------------------------------------------------------- @@ -563,10 +588,10 @@ wxProgressDialog::~wxProgressDialog() void wxProgressDialog::ReenableOtherWindows() { - if ( GetWindowStyle() & wxPD_APP_MODAL ) + if ( HasFlag(wxPD_APP_MODAL) ) { delete m_winDisabler; - m_winDisabler = (wxWindowDisabler *)NULL; + m_winDisabler = NULL; } else { @@ -587,10 +612,10 @@ static void SetTimeLabel(unsigned long val, wxStaticText *label) if (val != (unsigned long)-1) { - unsigned long hours = val / 3600; - unsigned long minutes = (val % 3600) / 60; - unsigned long seconds = val % 60; - s.Printf(wxT("%lu:%02lu:%02lu"), hours, minutes, seconds); + unsigned long hours = val / 3600; + unsigned long minutes = (val % 3600) / 60; + unsigned long seconds = val % 60; + s.Printf(wxT("%lu:%02lu:%02lu"), hours, minutes, seconds); } else { @@ -652,11 +677,19 @@ void wxProgressDialog::EnableClose() void wxProgressDialog::UpdateMessage(const wxString &newmsg) { + wxCHECK_RET(wxEventLoopBase::GetActive(), + "wxProgressDialog::UpdateMessage needs a running event loop"); + if ( !newmsg.empty() && newmsg != m_msg->GetLabel() ) { m_msg->SetLabel(newmsg); - wxYieldIfNeeded() ; + Fit(); // adapt to the new label size + + // 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); } }