From: Robert Roebling Date: Sun, 26 Feb 2006 01:51:28 +0000 (+0000) Subject: Makes custom cell activatable. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/553f7d8f5608f18b99864cc36d46452d2e1ff05b Makes custom cell activatable. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37735 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dataview.h b/include/wx/dataview.h index 47c7b9ad10..15c5a8cf50 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -133,8 +133,6 @@ public: virtual bool SetValue( const wxVariant &value ) { return true; } virtual bool GetValue( 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; } diff --git a/include/wx/gtk/dataview.h b/include/wx/gtk/dataview.h index 5cf7e587e1..8ab53b9558 100644 --- a/include/wx/gtk/dataview.h +++ b/include/wx/gtk/dataview.h @@ -90,6 +90,7 @@ public: virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0; virtual wxSize GetSize() = 0; + virtual bool Activate( wxRect cell ) { return false; }; // Create DC on request virtual wxDC *GetDC(); diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index f199c5870a..a933415e3b 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -115,7 +115,7 @@ class MyCustomCell: public wxDataViewCustomCell { public: MyCustomCell() : - wxDataViewCustomCell( wxT("string"), wxDATAVIEW_CELL_INERT ) + wxDataViewCustomCell( wxT("string"), wxDATAVIEW_CELL_ACTIVATABLE ) { m_colour = wxT("black"); } @@ -140,6 +140,11 @@ public: { return wxSize(20,8); } + bool Activate( wxRect rect ) + { + wxPrintf( wxT("activate\n") ); + return false; + } private: 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("second"), 1 ); - + wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 2 ); 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 dataview_right = new wxDataViewCtrl( this, -1 ); dataview_right->AssociateModel( model ); - + text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); column = new wxDataViewColumn( wxT("editable"), text_cell, 2 ); 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 ); column = new wxDataViewColumn( wxT("bool"), toggle_cell, 3 ); dataview_right->AppendColumn( column ); - + wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); sizer->Add( dataview_left, 1, wxGROW ); sizer->Add(10,10); diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 98b677b1e3..8ac925600e 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -452,28 +452,40 @@ struct _GtkWxCellRenderer struct _GtkWxCellRendererClass { GtkCellRendererClass cell_parent_class; - }; static GtkCellRenderer *gtk_wx_cell_renderer_new (void); -static void gtk_wx_cell_renderer_init (GtkWxCellRenderer *cell); -static void gtk_wx_cell_renderer_class_init (GtkWxCellRendererClass *klass); -static void gtk_wx_cell_renderer_finalize (GObject *object); -static void gtk_wx_cell_renderer_get_size (GtkCellRenderer *cell, - GtkWidget *widget, - GdkRectangle *rectangle, - gint *x_offset, - gint *y_offset, - gint *width, - gint *height); -static void gtk_wx_cell_renderer_render (GtkCellRenderer *cell, - GdkWindow *window, - GtkWidget *widget, - GdkRectangle *background_area, - GdkRectangle *cell_area, - GdkRectangle *expose_area, - GtkCellRendererState flags); +static void gtk_wx_cell_renderer_init ( + GtkWxCellRenderer *cell ); +static void gtk_wx_cell_renderer_class_init( + GtkWxCellRendererClass *klass ); +static void gtk_wx_cell_renderer_finalize ( + GObject *object ); +static void gtk_wx_cell_renderer_get_size ( + GtkCellRenderer *cell, + GtkWidget *widget, + GdkRectangle *rectangle, + gint *x_offset, + gint *y_offset, + gint *width, + gint *height ); +static void gtk_wx_cell_renderer_render ( + GtkCellRenderer *cell, + 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; @@ -482,29 +494,28 @@ static GObjectClass *cell_parent_class = NULL; GType 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 = - { - sizeof (GtkWxCellRendererClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gtk_wx_cell_renderer_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkWxCellRenderer), - 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_wx_cell_renderer_init, - }; - - cell_wx_type = - g_type_register_static (GTK_TYPE_CELL_RENDERER, "GtkWxCellRenderer", - &cell_wx_info, (GTypeFlags)0); + static const GTypeInfo cell_wx_info = + { + sizeof (GtkWxCellRendererClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gtk_wx_cell_renderer_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GtkWxCellRenderer), + 0, /* n_preallocs */ + (GInstanceInitFunc) gtk_wx_cell_renderer_init, + }; + + cell_wx_type = g_type_register_static( GTK_TYPE_CELL_RENDERER, + "GtkWxCellRenderer", &cell_wx_info, (GTypeFlags)0 ); } - return cell_wx_type; + return cell_wx_type; } 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->render = gtk_wx_cell_renderer_render; + cell_class->activate = gtk_wx_cell_renderer_activate; } 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 // --------------------------------------------------------- @@ -863,13 +905,23 @@ wxDataViewToggleCell::wxDataViewToggleCell( const wxString &varianttype, if (m_mode & wxDATAVIEW_CELL_EDITABLE) { + g_signal_connect_after( m_renderer, "toggled", G_CALLBACK(wxGtkToggleRendererToggledCallback), this ); + } + else + { + GValue gvalue = { 0, }; 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_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; + 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; }