X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5f7bcb48fd9a642036a3bf5c70e2b0c9576df1b1..c81fc3344d20fd3335ccea52557834d2c859944d:/src/generic/progdlgg.cpp diff --git a/src/generic/progdlgg.cpp b/src/generic/progdlgg.cpp index 0103124fac..5dbc359334 100644 --- a/src/generic/progdlgg.cpp +++ b/src/generic/progdlgg.cpp @@ -46,11 +46,25 @@ #include "wx/generic/progdlgg.h" +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +/* Macro for avoiding #ifdefs when value have to be different depending on size of + device we display on - take it from something like wxDesktopPolicy in the future + */ + +#if defined(__SMARTPHONE__) + #define wxLARGESMALL(large,small) small +#else + #define wxLARGESMALL(large,small) large +#endif + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- -#define LAYOUT_MARGIN 8 +#define LAYOUT_MARGIN wxLARGESMALL(8,2) // ---------------------------------------------------------------------------- // private functions @@ -84,7 +98,8 @@ wxProgressDialog::wxProgressDialog(wxString const &title, int maximum, wxWindow *parent, int style) - : wxDialog(parent, wxID_ANY, title) + : wxDialog(parent, wxID_ANY, title), + m_delay(3) { // we may disappear at any moment, let the others know about it SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT); @@ -104,6 +119,10 @@ wxProgressDialog::wxProgressDialog(wxString const &title, } #endif // wxMSW +#if defined(__SMARTPHONE__) + SetLeftMenu(); +#endif + m_state = hasAbortButton ? Continue : Uncancelable; m_maximum = maximum; @@ -122,7 +141,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title, dc.GetTextExtent(message, &widthText, NULL, NULL, NULL, NULL); wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); - + m_msg = new wxStaticText(this, wxID_ANY, message); sizer->Add(m_msg, 0, wxLEFT | wxTOP, 2*LAYOUT_MARGIN); @@ -150,6 +169,8 @@ wxProgressDialog::wxProgressDialog(wxString const &title, // create the estimated/remaining/total time zones if requested m_elapsed = m_estimated = m_remaining = (wxStaticText*)NULL; + m_display_estimated = m_last_timeupdate = m_break = 0; + m_ctdelay = 0; // if we are going to have at least one label, remmeber it in this var wxStaticText *label = NULL; @@ -190,6 +211,10 @@ wxProgressDialog::wxProgressDialog(wxString const &title, if ( hasAbortButton ) { +#if defined(__SMARTPHONE__) + SetLeftMenu(wxID_CANCEL, _("Cancel")); + } +#else m_btnAbort = new wxButton(this, wxID_CANCEL); // Windows dialogs usually have buttons in the lower right corner @@ -201,6 +226,7 @@ wxProgressDialog::wxProgressDialog(wxString const &title, sizeDlg.y += 2*LAYOUT_MARGIN + wxButton::GetDefaultSize().y; } else // no "Cancel" button +#endif // __SMARTPHONE__/!__SMARTPHONE__ { m_btnAbort = (wxButton *)NULL; } @@ -245,22 +271,28 @@ wxProgressDialog::wxProgressDialog(wxString const &title, wxStaticText *wxProgressDialog::CreateLabel(const wxString& text, wxSizer *sizer) { - wxBoxSizer *locsizer = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer *locsizer = new wxBoxSizer(wxLARGESMALL(wxHORIZONTAL,wxVERTICAL)); - wxStaticText *dummy = new wxStaticText(this, -1, text); + wxStaticText *dummy = new wxStaticText(this, wxID_ANY, text); wxStaticText *label = new wxStaticText(this, wxID_ANY, _("unknown")); - // VZ: I like the labels be centered - if the others don't mind, you may - // remove "#ifdef __WXMSW__" and use it for all ports -#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) - locsizer->Add(dummy, 1, wxALIGN_RIGHT); + // select placement most native or nice on target GUI +#if defined(__SMARTPHONE__) + // label and time to the left in two rows + 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__) + // 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); sizer->Add(locsizer, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, LAYOUT_MARGIN); -#else // !MSW +#else + // label and time to the right in one row sizer->Add(locsizer, 0, wxALIGN_RIGHT | wxRIGHT | wxTOP, LAYOUT_MARGIN); locsizer->Add(dummy); locsizer->Add(label, 0, wxLEFT, LAYOUT_MARGIN); -#endif // MSW/!MSW +#endif return label; } @@ -297,21 +329,71 @@ wxProgressDialog::Update(int value, const wxString& newmsg) if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) ) { unsigned long elapsed = wxGetCurrentTime() - m_timeStart; - unsigned long estimated = (unsigned long)(( (double) elapsed * m_maximum ) / ((double)value)) ; - unsigned long remaining = estimated - elapsed; + if ( m_last_timeupdate < elapsed + || value == m_maximum + ) + { + m_last_timeupdate = elapsed; + unsigned long estimated = m_break + + (unsigned long)(( (double) (elapsed-m_break) * m_maximum ) / ((double)value)) ; + if ( estimated > m_display_estimated + && m_ctdelay >= 0 + ) + { + ++m_ctdelay; + } + else if ( estimated < m_display_estimated + && m_ctdelay <= 0 + ) + { + --m_ctdelay; + } + else + { + m_ctdelay = 0; + } + if ( m_ctdelay >= m_delay // enough confirmations for a higher value + || m_ctdelay <= (m_delay*-1) // enough confirmations for a lower value + || value == m_maximum // to stay consistent + || elapsed > m_display_estimated // to stay consistent + || ( elapsed > 0 && elapsed < 4 ) // additional updates in the beginning + ) + { + m_display_estimated = estimated; + m_ctdelay = 0; + } + } + + long display_remaining = m_display_estimated - elapsed; + if ( display_remaining < 0 ) + { + display_remaining = 0; + } SetTimeLabel(elapsed, m_elapsed); - SetTimeLabel(estimated, m_estimated); - SetTimeLabel(remaining, m_remaining); + SetTimeLabel(m_display_estimated, m_estimated); + SetTimeLabel(display_remaining, m_remaining); } if ( value == m_maximum ) { + if ( m_state == Finished ) + { + // ignore multiple calls to Update(m_maximum): it may sometimes be + // troublesome to ensure that Update() is not called twice with the + // same value (e.g. because of the rounding errors) and if we don't + // return now we're going to generate asserts below + return true; + } + // so that we return true below and that out [Cancel] handler knew what // to do m_state = Finished; if( !(GetWindowStyle() & wxPD_AUTO_HIDE) ) { +#if defined(__SMARTPHONE__) + SetLeftMenu(wxID_CANCEL, _("Close")); +#endif if ( m_btnAbort ) { // tell the user what he should do... @@ -360,10 +442,16 @@ wxProgressDialog::Update(int value, const wxString& newmsg) void wxProgressDialog::Resume() { m_state = Continue; + m_ctdelay = m_delay; // force an update of the elapsed/estimated/remaining time + m_break += wxGetCurrentTime()-m_timeStop; // it may have been disabled by OnCancel(), so enable it back to let the // user interrupt us again if needed - m_btnAbort->Enable(); + if(m_btnAbort) + m_btnAbort->Enable(); +#if defined(__SMARTPHONE__) + SetLeftMenu(wxID_CANCEL, _("Cancel")); +#endif } bool wxProgressDialog::Show( bool show ) @@ -397,7 +485,15 @@ void wxProgressDialog::OnCancel(wxCommandEvent& event) // update the button state immediately so that the user knows that the // request has been noticed - m_btnAbort->Disable(); + if(m_btnAbort) + m_btnAbort->Disable(); + +#if defined(__SMARTPHONE__) + SetLeftMenu(); +#endif + + // save the time when the dialog was stopped + m_timeStop = wxGetCurrentTime(); } } @@ -417,6 +513,12 @@ void wxProgressDialog::OnClose(wxCloseEvent& event) { // next Update() will notice it m_state = Canceled; + if(m_btnAbort) + m_btnAbort->Disable(); +#if defined(__SMARTPHONE__) + SetLeftMenu(); +#endif + m_timeStop = wxGetCurrentTime(); } }