From: Robert Roebling Date: Sat, 25 Feb 2006 13:13:05 +0000 (+0000) Subject: Added wxDataViewProgressCell with native code X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/ad63bf413b716c673804ab7ef957d90731f8f839?hp=8045736e4d85cfa0fc9115787ab34cfc8332a8bb Added wxDataViewProgressCell with native code for GTK 2.6 and fallbacks otherwise. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37729 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dataview.h b/include/wx/dataview.h index f28eb943e9..47c7b9ad10 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -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 ); diff --git a/include/wx/gtk/dataview.h b/include/wx/gtk/dataview.h index 1e398fe662..1dd168ddb7 100644 --- a/include/wx/gtk/dataview.h +++ b/include/wx/gtk/dataview.h @@ -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 // --------------------------------------------------------- diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 3fb311897b..f199c5870a 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -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 ); diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index a323d1c873..94536600cd 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -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 ); diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 8edf067ec9..6f7ba40761 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -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 // ---------------------------------------------------------