Makes custom cell activatable.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37735 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2006-02-26 01:51:28 +00:00
parent 1272e71b8a
commit 553f7d8f56
4 changed files with 110 additions and 45 deletions

View File

@@ -133,8 +133,6 @@ public:
virtual bool SetValue( const wxVariant &value ) { return true; } virtual bool SetValue( const wxVariant &value ) { return true; }
virtual bool GetValue( wxVariant &value ) { return true; } virtual bool GetValue( wxVariant &value ) { return true; }
virtual bool Validate( wxVariant &value ) { return true; } virtual bool Validate( wxVariant &value ) { return true; }
virtual bool BeginEdit() { return true; }
virtual bool EndEdit() { return true; }
wxString GetVariantType() { return m_variantType; } wxString GetVariantType() { return m_variantType; }

View File

@@ -90,6 +90,7 @@ public:
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;
virtual bool Activate( wxRect cell ) { return false; };
// Create DC on request // Create DC on request
virtual wxDC *GetDC(); virtual wxDC *GetDC();

View File

@@ -115,7 +115,7 @@ class MyCustomCell: public wxDataViewCustomCell
{ {
public: public:
MyCustomCell() : MyCustomCell() :
wxDataViewCustomCell( wxT("string"), wxDATAVIEW_CELL_INERT ) wxDataViewCustomCell( wxT("string"), wxDATAVIEW_CELL_ACTIVATABLE )
{ {
m_colour = wxT("black"); m_colour = wxT("black");
} }
@@ -140,6 +140,11 @@ public:
{ {
return wxSize(20,8); return wxSize(20,8);
} }
bool Activate( wxRect rect )
{
wxPrintf( wxT("activate\n") );
return false;
}
private: private:
wxString m_colour; wxString m_colour;
@@ -231,7 +236,7 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
dataview_left->AppendTextColumn( wxT("first"), 0 ); dataview_left->AppendTextColumn( wxT("first"), 0 );
dataview_left->AppendTextColumn( wxT("second"), 1 ); dataview_left->AppendTextColumn( wxT("second"), 1 );
wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 2 ); wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 2 );
dataview_left->AppendColumn( column ); dataview_left->AppendColumn( column );
@@ -247,7 +252,7 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
// 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 );
text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
column = new wxDataViewColumn( wxT("editable"), text_cell, 2 ); column = new wxDataViewColumn( wxT("editable"), text_cell, 2 );
dataview_right->AppendColumn( column ); dataview_right->AppendColumn( column );
@@ -256,7 +261,7 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
wxDataViewToggleCell *toggle_cell = new wxDataViewToggleCell( wxT("bool"), wxDATAVIEW_CELL_EDITABLE ); wxDataViewToggleCell *toggle_cell = new wxDataViewToggleCell( wxT("bool"), wxDATAVIEW_CELL_EDITABLE );
column = new wxDataViewColumn( wxT("bool"), toggle_cell, 3 ); column = new wxDataViewColumn( wxT("bool"), toggle_cell, 3 );
dataview_right->AppendColumn( column ); dataview_right->AppendColumn( column );
wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
sizer->Add( dataview_left, 1, wxGROW ); sizer->Add( dataview_left, 1, wxGROW );
sizer->Add(10,10); sizer->Add(10,10);

View File

@@ -452,28 +452,40 @@ struct _GtkWxCellRenderer
struct _GtkWxCellRendererClass struct _GtkWxCellRendererClass
{ {
GtkCellRendererClass cell_parent_class; GtkCellRendererClass cell_parent_class;
}; };
static GtkCellRenderer *gtk_wx_cell_renderer_new (void); static GtkCellRenderer *gtk_wx_cell_renderer_new (void);
static void gtk_wx_cell_renderer_init (GtkWxCellRenderer *cell); static void gtk_wx_cell_renderer_init (
static void gtk_wx_cell_renderer_class_init (GtkWxCellRendererClass *klass); GtkWxCellRenderer *cell );
static void gtk_wx_cell_renderer_finalize (GObject *object); static void gtk_wx_cell_renderer_class_init(
static void gtk_wx_cell_renderer_get_size (GtkCellRenderer *cell, GtkWxCellRendererClass *klass );
GtkWidget *widget, static void gtk_wx_cell_renderer_finalize (
GdkRectangle *rectangle, GObject *object );
gint *x_offset, static void gtk_wx_cell_renderer_get_size (
gint *y_offset, GtkCellRenderer *cell,
gint *width, GtkWidget *widget,
gint *height); GdkRectangle *rectangle,
static void gtk_wx_cell_renderer_render (GtkCellRenderer *cell, gint *x_offset,
GdkWindow *window, gint *y_offset,
GtkWidget *widget, gint *width,
GdkRectangle *background_area, gint *height );
GdkRectangle *cell_area, static void gtk_wx_cell_renderer_render (
GdkRectangle *expose_area, GtkCellRenderer *cell,
GtkCellRendererState flags); GdkWindow *window,
GtkWidget *widget,
GdkRectangle *background_area,
GdkRectangle *cell_area,
GdkRectangle *expose_area,
GtkCellRendererState flags );
static gboolean gtk_wx_cell_renderer_activate(
GtkCellRenderer *cell,
GdkEvent *event,
GtkWidget *widget,
const gchar *path,
GdkRectangle *background_area,
GdkRectangle *cell_area,
GtkCellRendererState flags );
static GObjectClass *cell_parent_class = NULL; static GObjectClass *cell_parent_class = NULL;
@@ -482,29 +494,28 @@ static GObjectClass *cell_parent_class = NULL;
GType GType
gtk_wx_cell_renderer_get_type (void) gtk_wx_cell_renderer_get_type (void)
{ {
static GType cell_wx_type = 0; static GType cell_wx_type = 0;
if (!cell_wx_type) if (!cell_wx_type)
{ {
static const GTypeInfo cell_wx_info = static const GTypeInfo cell_wx_info =
{ {
sizeof (GtkWxCellRendererClass), sizeof (GtkWxCellRendererClass),
NULL, /* base_init */ NULL, /* base_init */
NULL, /* base_finalize */ NULL, /* base_finalize */
(GClassInitFunc) gtk_wx_cell_renderer_class_init, (GClassInitFunc) gtk_wx_cell_renderer_class_init,
NULL, /* class_finalize */ NULL, /* class_finalize */
NULL, /* class_data */ NULL, /* class_data */
sizeof (GtkWxCellRenderer), sizeof (GtkWxCellRenderer),
0, /* n_preallocs */ 0, /* n_preallocs */
(GInstanceInitFunc) gtk_wx_cell_renderer_init, (GInstanceInitFunc) gtk_wx_cell_renderer_init,
}; };
cell_wx_type = cell_wx_type = g_type_register_static( GTK_TYPE_CELL_RENDERER,
g_type_register_static (GTK_TYPE_CELL_RENDERER, "GtkWxCellRenderer", "GtkWxCellRenderer", &cell_wx_info, (GTypeFlags)0 );
&cell_wx_info, (GTypeFlags)0);
} }
return cell_wx_type; return cell_wx_type;
} }
static void static void
@@ -525,6 +536,7 @@ gtk_wx_cell_renderer_class_init (GtkWxCellRendererClass *klass)
cell_class->get_size = gtk_wx_cell_renderer_get_size; cell_class->get_size = gtk_wx_cell_renderer_get_size;
cell_class->render = gtk_wx_cell_renderer_render; cell_class->render = gtk_wx_cell_renderer_render;
cell_class->activate = gtk_wx_cell_renderer_activate;
} }
static void static void
@@ -632,6 +644,36 @@ gtk_wx_cell_renderer_render (GtkCellRenderer *renderer,
} }
} }
static gboolean
gtk_wx_cell_renderer_activate(
GtkCellRenderer *renderer,
GdkEvent *event,
GtkWidget *widget,
const gchar *path,
GdkRectangle *background_area,
GdkRectangle *cell_area,
GtkCellRendererState flags )
{
GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer;
wxDataViewCustomCell *cell = wxrenderer->cell;
GdkRectangle rect;
gtk_wx_cell_renderer_get_size (renderer, widget, cell_area,
&rect.x,
&rect.y,
&rect.width,
&rect.height);
rect.x += cell_area->x;
rect.y += cell_area->y;
rect.width -= renderer->xpad * 2;
rect.height -= renderer->ypad * 2;
wxRect renderrect( rect.x, rect.y, rect.width, rect.height );
return cell->Activate( renderrect );
}
// --------------------------------------------------------- // ---------------------------------------------------------
// wxGtkDataViewListModelNotifier // wxGtkDataViewListModelNotifier
// --------------------------------------------------------- // ---------------------------------------------------------
@@ -863,13 +905,23 @@ wxDataViewToggleCell::wxDataViewToggleCell( const wxString &varianttype,
if (m_mode & wxDATAVIEW_CELL_EDITABLE) if (m_mode & wxDATAVIEW_CELL_EDITABLE)
{ {
g_signal_connect_after( m_renderer, "toggled", G_CALLBACK(wxGtkToggleRendererToggledCallback), this );
}
else
{
GValue gvalue = { 0, }; GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN ); g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, true ); g_value_set_boolean( &gvalue, false );
g_object_set_property( G_OBJECT(m_renderer), "activatable", &gvalue ); g_object_set_property( G_OBJECT(m_renderer), "activatable", &gvalue );
g_value_unset( &gvalue ); g_value_unset( &gvalue );
g_signal_connect_after( m_renderer, "toggled", G_CALLBACK(wxGtkToggleRendererToggledCallback), this ); GValue gvalue2 = { 0, };
g_value_init( &gvalue2, gtk_cell_renderer_mode_get_type() );
g_value_set_enum( &gvalue2, GTK_CELL_RENDERER_MODE_INERT );
g_object_set_property( G_OBJECT(m_renderer), "mode", &gvalue2 );
g_value_unset( &gvalue2 );
} }
} }
@@ -949,6 +1001,15 @@ bool wxDataViewCustomCell::Init()
m_renderer = (void*) renderer; m_renderer = (void*) renderer;
if (m_mode & wxDATAVIEW_CELL_ACTIVATABLE)
{
GValue gvalue = { 0, };
g_value_init( &gvalue, gtk_cell_renderer_mode_get_type() );
g_value_set_enum( &gvalue, GTK_CELL_RENDERER_MODE_ACTIVATABLE );
g_object_set_property( G_OBJECT(m_renderer), "mode", &gvalue );
g_value_unset( &gvalue );
}
return true; return true;
} }