X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/60ad766eb5af2900899a0991898847cb1cfb0e89..f1f5f16f780bb41aa2ea24ccbf728f14c86cc475:/src/generic/progdlgg.cpp diff --git a/src/generic/progdlgg.cpp b/src/generic/progdlgg.cpp index 46d94c98b9..7541a816bb 100644 --- a/src/generic/progdlgg.cpp +++ b/src/generic/progdlgg.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: progdlgg.h +// Name: src/generic/progdlgg.cpp // Purpose: wxProgressDialog class // Author: Karsten Ballüder // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "progdlgg.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -41,10 +37,10 @@ #include "wx/intl.h" #include "wx/dcclient.h" #include "wx/timer.h" + #include "wx/settings.h" #endif -#include "wx/generic/progdlgg.h" -#include "wx/settings.h" +#include "wx/progdlg.h" // --------------------------------------------------------------------------- // macros @@ -145,7 +141,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title, wxClientDC dc(this); dc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); - long widthText; + long widthText = 0; dc.GetTextExtent(message, &widthText, NULL, NULL, NULL, NULL); wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); @@ -312,7 +308,7 @@ wxStaticText *wxProgressDialog::CreateLabel(const wxString& text, locsizer->Add(dummy, 1, wxALIGN_LEFT); locsizer->Add(label, 1, wxALIGN_LEFT); sizer->Add(locsizer, 0, wxALIGN_LEFT | wxTOP | wxLEFT, LAYOUT_MARGIN); -#elif defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) +#elif defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) || defined(__WXGTK20__) // label and time centered in one row locsizer->Add(dummy, 1, wxLARGESMALL(wxALIGN_RIGHT,wxALIGN_LEFT)); locsizer->Add(label, 1, wxALIGN_LEFT | wxLEFT, LAYOUT_MARGIN); @@ -349,12 +345,7 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) m_gauge->SetValue(value == m_maximum ? value : value + 1); } - if ( !newmsg.empty() && newmsg != m_msg->GetLabel() ) - { - m_msg->SetLabel(newmsg); - - wxYieldIfNeeded() ; - } + UpdateMessage(newmsg); if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) ) { @@ -447,18 +438,9 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) Hide(); } } - else + else // not at maximum yet { - // 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() ; - - if ( (m_skip) && (skip != NULL) && (*skip == false) ) - { - *skip = true; - m_skip = false; - EnableSkip(); - } + return DoAfterUpdate(skip); } // update the display in case yielding above didn't do it @@ -467,6 +449,45 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) return m_state != Canceled; } +bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip) +{ + wxASSERT_MSG( m_gauge, wxT("cannot update non existent dialog") ); + + // show a bit of progress + m_gauge->Pulse(); + + UpdateMessage(newmsg); + + if (m_elapsed || m_remaining || m_estimated) + { + unsigned long elapsed = wxGetCurrentTime() - m_timeStart; + + SetTimeLabel(elapsed, m_elapsed); + SetTimeLabel((unsigned long)-1, m_estimated); + SetTimeLabel((unsigned long)-1, m_remaining); + } + + return DoAfterUpdate(skip); +} + +bool wxProgressDialog::DoAfterUpdate(bool *skip) +{ + // 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(); + + Update(); + + if ( m_skip && skip && !*skip ) + { + *skip = true; + m_skip = false; + EnableSkip(); + } + + return m_state != Canceled; +} + void wxProgressDialog::Resume() { m_state = Continue; @@ -579,10 +600,18 @@ static void SetTimeLabel(unsigned long val, wxStaticText *label) if ( label ) { wxString s; + + 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); + } + else + { + s = _("Unknown"); + } if ( s != label->GetLabel() ) label->SetLabel(s); @@ -637,4 +666,14 @@ void wxProgressDialog::EnableClose() } } +void wxProgressDialog::UpdateMessage(const wxString &newmsg) +{ + if ( !newmsg.empty() && newmsg != m_msg->GetLabel() ) + { + m_msg->SetLabel(newmsg); + + wxYieldIfNeeded() ; + } +} + #endif // wxUSE_PROGRESSDLG