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