]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxDataViewProgressCell with native code
authorRobert Roebling <robert@roebling.de>
Sat, 25 Feb 2006 13:13:05 +0000 (13:13 +0000)
committerRobert Roebling <robert@roebling.de>
Sat, 25 Feb 2006 13:13:05 +0000 (13:13 +0000)
   for GTK 2.6 and fallbacks otherwise.

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

include/wx/dataview.h
include/wx/gtk/dataview.h
samples/dataview/dataview.cpp
src/common/datavcmn.cpp
src/gtk/dataview.cpp

index f28eb943e98587b16984f9539b98748fa51eadb0..47c7b9ad1062cd38b499626c9a49c5ddff1e8c51 100644 (file)
@@ -204,6 +204,7 @@ public:
     
     virtual bool AppendTextColumn( const wxString &label, size_t model_column );
     virtual bool AppendToggleColumn( const wxString &label, size_t model_column );
+    virtual bool AppendProgressColumn( const wxString &label, size_t model_column );
     virtual bool AppendColumn( wxDataViewColumn *col );    
     virtual size_t GetNumberOfColumns();
     virtual bool DeleteColumn( size_t pos );
index 1e398fe662d925181614906c4b62d0132a28152f..1dd168ddb71db62936b2c4d65692c885d94af807 100644 (file)
@@ -83,8 +83,10 @@ class wxDataViewCustomCell: public wxDataViewCell
 {
 public:
     wxDataViewCustomCell( const wxString &varianttype = wxT("string"), 
-                          wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT );
+                          wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
+                          bool no_init = false );
     ~wxDataViewCustomCell();
+    bool Init();
     
     virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0;
     virtual wxSize GetSize() = 0;
@@ -99,6 +101,31 @@ protected:
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomCell)
 };
     
+// --------------------------------------------------------- 
+// wxDataViewProgressCell
+// --------------------------------------------------------- 
+
+class wxDataViewProgressCell: public wxDataViewCustomCell
+{
+public:
+    wxDataViewProgressCell( const wxString &label = wxEmptyString, 
+                            const wxString &varianttype = wxT("long"), 
+                            wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT );
+    ~wxDataViewProgressCell();
+    
+    bool SetValue( const wxVariant &value );
+    
+    virtual bool Render( wxRect cell, wxDC *dc, int state );
+    virtual wxSize GetSize();
+    
+private:
+    wxString    m_label;
+    int         m_value;
+    
+protected:
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewProgressCell)
+};
+    
 // --------------------------------------------------------- 
 // wxDataViewColumn
 // --------------------------------------------------------- 
index 3fb311897b8f631bacb7910ef2036473bc42fa29..f199c5870aed39f25f2bd2a73dc9b1fde5231915 100644 (file)
@@ -42,16 +42,21 @@ public:
             { m_bools.Add( 0 ); m_bools.Add( 1 ); }
         for (i = 0; i < 500; i++)
             { m_colours.Add( wxT("red") ); m_colours.Add( wxT("green") ); }
+        for (i = 0; i < 1000; i++)
+            { m_progress.Add( i/10 ); }
     }
     
     virtual size_t GetNumberOfRows() 
         { return 1000; }
     virtual size_t GetNumberOfCols()
-        { return 5; }
+        { return 6; }
         
     // as reported by wxVariant
     virtual wxString GetColType( size_t col )
         {
+            if (col == 5)
+                return wxT("long");
+                
             if (col == 3)
                 return wxT("bool");
                  
@@ -60,14 +65,18 @@ public:
         
     virtual wxVariant GetValue( size_t col, size_t row )
         {
-            if (col == 3)
+            if (col == 5)
             {
-                return (bool) m_bools[row];
-            } else 
+                return (long) m_progress[row];
+            } else
             if (col == 4)
             {
                 return m_colours[row];
-            }
+            } else
+            if (col == 3)
+            {
+                return (bool) m_bools[row];
+            } else 
             if (col == 2)
             {
                 return m_list[row];
@@ -95,6 +104,7 @@ public:
     wxArrayString m_list;
     wxArrayInt    m_bools;
     wxArrayString m_colours;
+    wxArrayInt    m_progress;
 };
 
 // -------------------------------------
@@ -232,6 +242,8 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
     column = new wxDataViewColumn( wxT("custom"), custom_cell, 4 );
     dataview_left->AppendColumn( column );
     
+    dataview_left->AppendProgressColumn( wxT("progress"), 5 );
+    
     // Right wxDataViewCtrl using the same model
     dataview_right = new wxDataViewCtrl( this, -1 );
     dataview_right->AssociateModel( model );
index a323d1c87303e3a741f86e86aac6ec7fe3b44ce0..94536600cd27c375525647a3bc491ed69eaad697 100644 (file)
@@ -203,6 +203,11 @@ bool wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, size_t model
     return AppendColumn( new wxDataViewColumn( label, new wxDataViewToggleCell(), model_column ) );
 }
 
+bool wxDataViewCtrlBase::AppendProgressColumn( const wxString &label, size_t model_column )
+{
+    return AppendColumn( new wxDataViewColumn( label, new wxDataViewProgressCell(), model_column ) );
+}
+
 bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col )
 {
     m_cols.Append( (wxObject*) col );
index 8edf067ec940e43897df0c89116f0b261c5741fa..6f7ba407611042f02392f4f0dd00c75f7f2e37d3 100644 (file)
@@ -931,15 +931,25 @@ public:
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomCell, wxDataViewCell)
 
 wxDataViewCustomCell::wxDataViewCustomCell( const wxString &varianttype, 
-                          wxDataViewCellMode mode ) :
+                          wxDataViewCellMode mode, bool no_init ) :
     wxDataViewCell( varianttype, mode )
 {
     m_dc = NULL;
     
+    if (no_init)
+        m_renderer = NULL;
+    else
+        Init();
+}
+
+bool wxDataViewCustomCell::Init()
+{
     GtkWxCellRenderer *renderer = (GtkWxCellRenderer *) gtk_wx_cell_renderer_new();
     renderer->cell = this;
     
     m_renderer = (void*) renderer;
+    
+    return true;
 }
 
 wxDataViewCustomCell::~wxDataViewCustomCell()
@@ -956,6 +966,87 @@ wxDC *wxDataViewCustomCell::GetDC()
     return m_dc;
 }
     
+// --------------------------------------------------------- 
+// wxDataViewProgressCell
+// --------------------------------------------------------- 
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewProgressCell, wxDataViewCustomCell)
+
+wxDataViewProgressCell::wxDataViewProgressCell( const wxString &label, 
+    const wxString &varianttype, wxDataViewCellMode mode ) :
+    wxDataViewCustomCell( varianttype, mode, true )  
+{
+    m_label = label;
+    m_value = 0;
+    
+#ifdef __WXGTK26__
+    if (!gtk_check_version(2,6,0))
+    {
+        m_renderer = (void*) gtk_cell_renderer_progress_new();
+        
+        GValue gvalue = { 0, };
+        g_value_init( &gvalue, G_TYPE_STRING );
+        g_value_set_boolean( &gvalue, wxGTK_CONV(m_label) );
+        g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue );
+        g_value_unset( &gvalue );
+    }
+    else
+#endif
+    {
+        // Use custom cell code
+        wxDataViewCustomCell::Init();
+    }
+}
+
+wxDataViewProgressCell::~wxDataViewProgressCell()
+{
+}
+
+bool wxDataViewProgressCell::SetValue( const wxVariant &value )
+{
+#ifdef __WXGTK26__
+    if (!gtk_check_version(2,6,0))
+    {
+        gint tmp = (int) value;
+        GValue gvalue = { 0, };
+        g_value_init( &gvalue, G_TYPE_INT );
+        g_value_set_boolean( &gvalue, tmp );
+        g_object_set_property( G_OBJECT(m_renderer), "value", &gvalue );
+        g_value_unset( &gvalue );
+    }
+    else
+#endif
+    {
+        m_value = (long) value;
+    
+        if (m_value < 0) m_value = 0;
+        if (m_value > 100) m_value = 100;
+    }
+    
+    return true;
+}
+    
+bool wxDataViewProgressCell::Render( wxRect cell, wxDC *dc, int state )
+{
+    double pct = (double)m_value / 100.0;
+    wxRect bar = cell;
+    bar.width = (int)(cell.width * pct);
+    dc->SetPen( *wxTRANSPARENT_PEN );
+    dc->SetBrush( *wxBLUE_BRUSH );
+    dc->DrawRectangle( bar );
+
+    dc->SetBrush( *wxTRANSPARENT_BRUSH );
+    dc->SetPen( *wxBLACK_PEN );
+    dc->DrawRectangle( cell );
+    
+    return true;
+}
+
+wxSize wxDataViewProgressCell::GetSize()
+{
+    return wxSize(40,12);
+}
+    
 // --------------------------------------------------------- 
 // wxDataViewColumn
 // ---------------------------------------------------------