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
This commit is contained in:
Robert Roebling
2006-02-25 13:13:05 +00:00
parent 8045736e4d
commit ad63bf413b
5 changed files with 143 additions and 7 deletions

View File

@@ -204,6 +204,7 @@ public:
virtual bool AppendTextColumn( const wxString &label, size_t model_column ); virtual bool AppendTextColumn( const wxString &label, size_t model_column );
virtual bool AppendToggleColumn( 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 bool AppendColumn( wxDataViewColumn *col );
virtual size_t GetNumberOfColumns(); virtual size_t GetNumberOfColumns();
virtual bool DeleteColumn( size_t pos ); virtual bool DeleteColumn( size_t pos );

View File

@@ -83,8 +83,10 @@ class wxDataViewCustomCell: public wxDataViewCell
{ {
public: public:
wxDataViewCustomCell( const wxString &varianttype = wxT("string"), wxDataViewCustomCell( const wxString &varianttype = wxT("string"),
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ); wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT,
bool no_init = false );
~wxDataViewCustomCell(); ~wxDataViewCustomCell();
bool Init();
virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0; virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0;
virtual wxSize GetSize() = 0; virtual wxSize GetSize() = 0;
@@ -99,6 +101,31 @@ protected:
DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCustomCell) 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 // wxDataViewColumn
// --------------------------------------------------------- // ---------------------------------------------------------

View File

@@ -42,16 +42,21 @@ public:
{ m_bools.Add( 0 ); m_bools.Add( 1 ); } { m_bools.Add( 0 ); m_bools.Add( 1 ); }
for (i = 0; i < 500; i++) for (i = 0; i < 500; i++)
{ m_colours.Add( wxT("red") ); m_colours.Add( wxT("green") ); } { 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() virtual size_t GetNumberOfRows()
{ return 1000; } { return 1000; }
virtual size_t GetNumberOfCols() virtual size_t GetNumberOfCols()
{ return 5; } { return 6; }
// as reported by wxVariant // as reported by wxVariant
virtual wxString GetColType( size_t col ) virtual wxString GetColType( size_t col )
{ {
if (col == 5)
return wxT("long");
if (col == 3) if (col == 3)
return wxT("bool"); return wxT("bool");
@@ -60,14 +65,18 @@ public:
virtual wxVariant GetValue( size_t col, size_t row ) virtual wxVariant GetValue( size_t col, size_t row )
{ {
if (col == 3) if (col == 5)
{ {
return (bool) m_bools[row]; return (long) m_progress[row];
} else } else
if (col == 4) if (col == 4)
{ {
return m_colours[row]; return m_colours[row];
} } else
if (col == 3)
{
return (bool) m_bools[row];
} else
if (col == 2) if (col == 2)
{ {
return m_list[row]; return m_list[row];
@@ -95,6 +104,7 @@ public:
wxArrayString m_list; wxArrayString m_list;
wxArrayInt m_bools; wxArrayInt m_bools;
wxArrayString m_colours; 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 ); column = new wxDataViewColumn( wxT("custom"), custom_cell, 4 );
dataview_left->AppendColumn( column ); dataview_left->AppendColumn( column );
dataview_left->AppendProgressColumn( wxT("progress"), 5 );
// Right wxDataViewCtrl using the same model // Right wxDataViewCtrl using the same model
dataview_right = new wxDataViewCtrl( this, -1 ); dataview_right = new wxDataViewCtrl( this, -1 );
dataview_right->AssociateModel( model ); dataview_right->AssociateModel( model );

View File

@@ -203,6 +203,11 @@ bool wxDataViewCtrlBase::AppendToggleColumn( const wxString &label, size_t model
return AppendColumn( new wxDataViewColumn( label, new wxDataViewToggleCell(), model_column ) ); 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 ) bool wxDataViewCtrlBase::AppendColumn( wxDataViewColumn *col )
{ {
m_cols.Append( (wxObject*) col ); m_cols.Append( (wxObject*) col );

View File

@@ -931,15 +931,25 @@ public:
IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomCell, wxDataViewCell) IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomCell, wxDataViewCell)
wxDataViewCustomCell::wxDataViewCustomCell( const wxString &varianttype, wxDataViewCustomCell::wxDataViewCustomCell( const wxString &varianttype,
wxDataViewCellMode mode ) : wxDataViewCellMode mode, bool no_init ) :
wxDataViewCell( varianttype, mode ) wxDataViewCell( varianttype, mode )
{ {
m_dc = NULL; m_dc = NULL;
if (no_init)
m_renderer = NULL;
else
Init();
}
bool wxDataViewCustomCell::Init()
{
GtkWxCellRenderer *renderer = (GtkWxCellRenderer *) gtk_wx_cell_renderer_new(); GtkWxCellRenderer *renderer = (GtkWxCellRenderer *) gtk_wx_cell_renderer_new();
renderer->cell = this; renderer->cell = this;
m_renderer = (void*) renderer; m_renderer = (void*) renderer;
return true;
} }
wxDataViewCustomCell::~wxDataViewCustomCell() wxDataViewCustomCell::~wxDataViewCustomCell()
@@ -956,6 +966,87 @@ wxDC *wxDataViewCustomCell::GetDC()
return m_dc; 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 // wxDataViewColumn
// --------------------------------------------------------- // ---------------------------------------------------------