]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied wxGauge:Pulse() patch.
authorRobert Roebling <robert@roebling.de>
Sat, 9 Sep 2006 13:36:54 +0000 (13:36 +0000)
committerRobert Roebling <robert@roebling.de>
Sat, 9 Sep 2006 13:36:54 +0000 (13:36 +0000)
  [ 1551409 ] Support for indeterminate mode gauges

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41089 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

13 files changed:
include/wx/defs.h
include/wx/gauge.h
include/wx/generic/progdlgg.h
include/wx/gtk/gauge.h
include/wx/mac/carbon/gauge.h
include/wx/mac/classic/gauge.h
include/wx/progdlg.h
src/common/gaugecmn.cpp
src/generic/progdlgg.cpp
src/gtk/gauge.cpp
src/mac/carbon/gauge.cpp
src/mac/classic/gauge.cpp
src/msw/gauge95.cpp

index ce6b9e9575d72492583b3b02f5769fcfa93fbdf0..18d47edfb52dffb331c04a9669f1e95d0f20457b 100644 (file)
@@ -1656,18 +1656,6 @@ enum wxBorder
 #define wxLI_HORIZONTAL         wxHORIZONTAL
 #define wxLI_VERTICAL           wxVERTICAL
 
-/*
- * wxProgressDialog flags
- */
-#define wxPD_CAN_ABORT          0x0001
-#define wxPD_APP_MODAL          0x0002
-#define wxPD_AUTO_HIDE          0x0004
-#define wxPD_ELAPSED_TIME       0x0008
-#define wxPD_ESTIMATED_TIME     0x0010
-#define wxPD_SMOOTH             0x0020
-#define wxPD_REMAINING_TIME     0x0040
-#define wxPD_CAN_SKIP           0x0080
-
 
 /*
  * extended dialog specifiers. these values are stored in a different
index cb1cffb25be3b6e16f89d8b7a8d66eab5edb31eb..61dd3fa1f6884389684014c88c3fe85f68be55c3 100644 (file)
     #define wxGA_PROGRESSBAR     0
 #endif // WXWIN_COMPATIBILITY_2_6
 
+// GTK and Mac always have native implementation of the indeterminate mode
+// wxMSW has native implementation only if comctl32.dll >= 6.00
+#if !defined(__WXGTK20__) && !defined(__WXMAC__) && !defined(__WXCOCOA__)
+    #define wxGAUGE_EMULATE_INDETERMINATE_MODE 1
+#else
+    #define wxGAUGE_EMULATE_INDETERMINATE_MODE 0
+#endif
 
 extern WXDLLEXPORT_DATA(const wxChar) wxGaugeNameStr[];
 
@@ -55,18 +62,21 @@ public:
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxGaugeNameStr);
 
+    // determinate mode API
+
     // set/get the control range
     virtual void SetRange(int range);
     virtual int GetRange() const;
 
-    // position
     virtual void SetValue(int pos);
     virtual int GetValue() const;
 
+    // indeterminate mode API
+    virtual void Pulse();
+
     // simple accessors
     bool IsVertical() const { return HasFlag(wxGA_VERTICAL); }
 
-
     // appearance params (not implemented for most ports)
     virtual void SetShadowWidth(int w);
     virtual int GetShadowWidth() const;
@@ -84,6 +94,10 @@ protected:
     // the current position
     int m_gaugePos;
 
+#if wxGAUGE_EMULATE_INDETERMINATE_MODE
+    int m_nDirection;       // can be wxRIGHT or wxLEFT
+#endif
+
     DECLARE_NO_COPY_CLASS(wxGaugeBase)
 };
 
index 81fda8c37ebefc12d956951e8bfaf1cf22a2c587..44467b1836a60eb2a338102c770c6f5ee0bd1202 100644 (file)
@@ -13,6 +13,7 @@
 #define __PROGDLGH_G__
 
 #include "wx/defs.h"
+#include "wx/progdlg.h"
 
 #if wxUSE_PROGRESSDLG
 
@@ -52,6 +53,11 @@ public:
        @returns true if ABORT button has not been pressed
    */
    virtual bool Update(int value, const wxString& newmsg = wxEmptyString, bool *skip = NULL);
+
+    /* Switches the dialog to use a gauge in indeterminate mode and calls
+       wxGauge::Pulse() to show to the user a bit of progress */
+    virtual bool UpdatePulse(const wxString& newmsg = wxEmptyString, bool *skip = NULL);
+
     // Must provide overload to avoid hiding it (and warnings about it)
     virtual void Update() { wxDialog::Update(); }
 
@@ -82,6 +88,9 @@ private:
    // as the next windows in the sizer, returns the created control
    wxStaticText *CreateLabel(const wxString& text, wxSizer *sizer);
 
+    // updates the label message
+   void UpdateMessage(const wxString &newmsg);
+
    // shortcuts for enabling buttons
    void EnableClose();
    void EnableSkip(bool enable=true);
index 8b78986b6520ca6eb7eaac47e3e6f2a9a48f362a..5a53a9aadf74153e961dde0a7b711549c400b2d3 100644 (file)
@@ -43,13 +43,19 @@ public:
 
     void SetShadowWidth( int WXUNUSED(w) ) { }
     void SetBezelFace( int WXUNUSED(w) ) { }
-    void SetRange( int r );
-    void SetValue( int pos );
     int GetShadowWidth() const { return 0; };
     int GetBezelFace() const { return 0; };
+
+    // determinate mode API
+    void SetRange( int r );
+    void SetValue( int pos );
+
     int GetRange() const;
     int GetValue() const;
 
+    // indeterminate mode API
+    virtual void Pulse();
+
     bool IsVertical() const { return HasFlag(wxGA_VERTICAL); }
     
     static wxVisualAttributes
index 97109b14598118b5c6a362f91877f726a65c2123..b75005c4b782c21b5c5ce424860565b50e5c417f 100644 (file)
@@ -45,6 +45,9 @@ class WXDLLEXPORT wxGauge: public wxGaugeBase
     virtual void SetRange(int range);
     virtual void SetValue(int pos);
     virtual int  GetValue() const ;
+
+    void Pulse();
+
  protected:
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxGauge)
 };
index 926226de326a9a02ee3557162ade8471a8ef3a75..4d262e12adbcecb668631daa7d0ee838290c8122 100644 (file)
@@ -52,6 +52,8 @@ class WXDLLEXPORT wxGauge: public wxGaugeBase
   int GetRange() const ;
   int GetValue() const ;
 
+  void Pulse();
+
   virtual void Command(wxCommandEvent& WXUNUSED(event)) {} ;
 
  protected:
index e38c9cef8f801789e61ea93c287ba16acbea629f..dbce6e72750609a2edd8da7a8266bec146e6618f 100644 (file)
 
 #include "wx/defs.h"
 
+/*
+ * wxProgressDialog flags
+ */
+#define wxPD_CAN_ABORT          0x0001
+#define wxPD_APP_MODAL          0x0002
+#define wxPD_AUTO_HIDE          0x0004
+#define wxPD_ELAPSED_TIME       0x0008
+#define wxPD_ESTIMATED_TIME     0x0010
+#define wxPD_SMOOTH             0x0020
+#define wxPD_REMAINING_TIME     0x0040
+#define wxPD_CAN_SKIP           0x0080
+
+
 #ifdef __WXPALMOS__
     #include "wx/palmos/progdlg.h"
 #else
index 49d5b5914450339e6042b22ac9961d57b9900254..a41d08ef3ee5ff99db7f79234d43237f7e1a0577 100644 (file)
@@ -66,12 +66,15 @@ bool wxGaugeBase::Create(wxWindow *parent,
 
     SetRange(range);
     SetValue(0);
+#if wxGAUGE_EMULATE_INDETERMINATE_MODE
+    m_nDirection = wxRIGHT;
+#endif
 
     return true;
 }
 
 // ----------------------------------------------------------------------------
-// wxGauge range/position
+// wxGauge determinate mode range/position
 // ----------------------------------------------------------------------------
 
 void wxGaugeBase::SetRange(int range)
@@ -94,6 +97,39 @@ int wxGaugeBase::GetValue() const
     return m_gaugePos;
 }
 
+// ----------------------------------------------------------------------------
+// wxGauge indeterminate mode
+// ----------------------------------------------------------------------------
+
+void wxGaugeBase::Pulse()
+{
+#if wxGAUGE_EMULATE_INDETERMINATE_MODE
+    // simulate indeterminate mode
+    int curr = GetValue(), max = GetRange();
+
+    if (m_nDirection == wxRIGHT)
+    {
+        if (curr < max)
+            SetValue(curr + 1);
+        else
+        {
+            SetValue(max - 1);
+            m_nDirection = wxLEFT;
+        }
+    }
+    else
+    {
+        if (curr > 0)
+            SetValue(curr - 1);
+        else
+        {
+            SetValue(1);
+            m_nDirection = wxRIGHT;
+        }
+    }
+#endif
+}
+
 // ----------------------------------------------------------------------------
 // wxGauge appearance params
 // ----------------------------------------------------------------------------
index 91d6bec43c487d6dc612eb847579aff23ae65506..cffe7fce243ffad824b18fd39e80dfca2bd687a4 100644 (file)
@@ -40,7 +40,7 @@
     #include "wx/settings.h"
 #endif
 
-#include "wx/generic/progdlgg.h"
+#include "wx/progdlg.h"
 
 // ---------------------------------------------------------------------------
 // macros
@@ -308,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);
@@ -345,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) )
     {
@@ -463,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;
@@ -575,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);
@@ -633,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
index 25beb33bbe0b6ad440d334e1eca7a09208e73120..e0b4b49010072b7797d7001f9e3a83d0b36bab21 100644 (file)
@@ -49,6 +49,9 @@ bool wxGauge::Create( wxWindow *parent,
                                           GTK_PROGRESS_BOTTOM_TO_TOP );
     }
 
+    // when using the gauge in indeterminate mode, we need this:
+    gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR (m_widget), 0.05);
+
     m_parent->DoAddChild( this );
 
     PostCreation(size);
@@ -105,6 +108,11 @@ int wxGauge::GetValue() const
     return m_gaugePos;
 }
 
+void wxGauge::Pulse()
+{
+    gtk_progress_bar_pulse(GTK_PROGRESS_BAR (m_widget));
+}
+
 wxVisualAttributes wxGauge::GetDefaultAttributes() const
 {
     // Visible gauge colours use a different colour state
index 9fa85e774696c64a396abb7fb042626736b6debb..531cf003f3b92f0b1bdaf5eddddcd259e4cff730 100644 (file)
@@ -95,5 +95,13 @@ int wxGauge::GetValue() const
     return m_gaugePos ;
 }
 
+void wxGauge::Pulse()
+{
+    if ( m_peer && m_peer->Ok() )
+    {
+        // need to use the animate() method of NSProgressIndicator Class here
+    }
+}
+
 #endif // wxUSE_GAUGE
 
index f821220971bc21b99512d1c60e4fed0d46044cd7..5dbb9f1a2388a0d0c7bc0f65b9ba11c86f2b91c6 100644 (file)
@@ -72,6 +72,11 @@ void wxGauge::SetValue(int pos)
        ::SetControl32BitValue( (ControlHandle) m_macControl , m_gaugePos ) ;
 }
 
+void wxGauge::Pulse()
+{
+    // need to use the animate() method of NSProgressIndicator Class here
+}
+
 int wxGauge::GetShadowWidth() const
 {
     return 0;
index 4d79cb7867588b04da94e2cfac681db7e48a0043..f453f378057dbdb0dc6a1c2573050b0068085a22 100644 (file)
     #define PBM_SETBKCOLOR          0x2001
 #endif
 
+#ifndef PBS_MARQUEE
+    #define PBS_MARQUEE             0x08
+#endif
+
+#ifndef PBM_SETMARQUEE
+    #define PBM_SETMARQUEE          (WM_USER+10)
+#endif
+
 // ----------------------------------------------------------------------------
 // wxWin macros
 // ----------------------------------------------------------------------------
@@ -142,6 +150,9 @@ bool wxGauge95::Create(wxWindow *parent,
 
     SetRange(range);
 
+    // in case we need to emulate indeterminate mode...
+    m_nDirection = wxRIGHT;
+
     return true;
 }
 
@@ -178,6 +189,9 @@ wxSize wxGauge95::DoGetBestSize() const
 
 void wxGauge95::SetRange(int r)
 {
+    // switch to determinate mode if required
+    SetDeterminateMode();
+
     m_rangeMax = r;
 
 #ifdef PBM_SETRANGE32
@@ -190,6 +204,9 @@ void wxGauge95::SetRange(int r)
 
 void wxGauge95::SetValue(int pos)
 {
+    // switch to determinate mode if required
+    SetDeterminateMode();
+
     m_gaugePos = pos;
 
     ::SendMessage(GetHwnd(), PBM_SETPOS, pos, 0);
@@ -215,4 +232,43 @@ bool wxGauge95::SetBackgroundColour(const wxColour& col)
     return true;
 }
 
+void wxGauge95::SetIndeterminateMode()
+{
+    // add the PBS_MARQUEE style to the progress bar
+    LONG style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
+    if ((style & PBS_MARQUEE) == 0)
+        ::SetWindowLong(GetHwnd(), GWL_STYLE, style|PBS_MARQUEE);
+
+    // now the control can only run in indeterminate mode
+}
+
+void wxGauge95::SetDeterminateMode()
+{
+    // remove the PBS_MARQUEE style to the progress bar
+    LONG style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
+    if ((style & PBS_MARQUEE) != 0)
+        ::SetWindowLong(GetHwnd(), GWL_STYLE, style & ~PBS_MARQUEE);
+
+    // now the control can only run in determinate mode
+}
+
+void wxGauge95::Pulse()
+{
+    if (wxApp::GetComCtl32Version() >= 600)
+    {
+        // switch to indeterminate mode if required
+        SetIndeterminateMode();
+
+        // NOTE: when in indeterminate mode, the PBM_SETPOS message will just make
+        //       the bar's blocks move a bit and the WPARAM value is just ignored
+        //       so that we can safely use zero
+        SendMessage(GetHwnd(), (UINT) PBM_SETPOS, (WPARAM)0, (LPARAM)0);
+    }
+    else
+    {
+        // emulate indeterminate mode
+        wxGaugeBase::Pulse();
+    }
+}
+
 #endif // wxUSE_GAUGE