X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/94f5392355df17ef8cd4884637a1ce71a07dd685..cbc9145c04bd3ea0a228906c8363fa8f47e3acf9:/src/generic/progdlgg.cpp diff --git a/src/generic/progdlgg.cpp b/src/generic/progdlgg.cpp index 0e64813028..cffe7fce24 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 @@ -115,7 +111,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title, m_hasSkipButton = (style & wxPD_CAN_SKIP) != 0; bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); - + #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) // we have to remove the "Close" button from the title bar then as it is // confusing to have it - it doesn't work anyhow @@ -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) ) { @@ -427,7 +418,7 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) EnableCloseButton(); #endif // __WXMSW__ - if ( !newmsg.empty() ) + if ( newmsg.empty() ) { // also provide the finishing message if the application didn't m_msg->SetLabel(_("Done.")); @@ -467,6 +458,39 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) return m_state != Canceled; } +bool +wxProgressDialog::UpdatePulse(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); + } + + // 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 m_state != Canceled; +} + void wxProgressDialog::Resume() { m_state = Continue; @@ -579,10 +603,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 +669,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