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:
@@ -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 );
|
||||
|
@@ -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
|
||||
// ---------------------------------------------------------
|
||||
|
@@ -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];
|
||||
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 );
|
||||
|
@@ -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 );
|
||||
|
@@ -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
|
||||
// ---------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user