From: Robert Roebling Date: Thu, 23 Feb 2006 13:34:15 +0000 (+0000) Subject: wxDataViewCtrl now with editable text and multiple X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a7f61f762d284fb33d12d3b2e69f05675ab675c4 wxDataViewCtrl now with editable text and multiple views for the same data model (in the sample). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37682 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dataview.h b/include/wx/dataview.h index 42da39cab3..0b2ae8d09f 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -80,9 +80,12 @@ public: virtual size_t GetNumberOfRows() = 0; virtual size_t GetNumberOfCols() = 0; - // as reported by wxVariant + // return type as reported by wxVariant virtual wxString GetColType( size_t col ) = 0; + // get value into a wxVariant virtual wxVariant GetValue( size_t col, size_t row ) = 0; + // set value, call ValueChanged() afterwards! + virtual bool SetValue( wxVariant &variant, size_t col, size_t row ) = 0; // delegated notifiers bool RowAppended(); @@ -90,7 +93,7 @@ public: bool RowInserted( size_t before ); bool RowDeleted( size_t row ); bool RowChanged( size_t row ); - bool ValueChanged( size_t row, size_t col ); + bool ValueChanged( size_t col, size_t row ); bool Cleared(); void SetNotifier( wxDataViewListModelNotifier *notifier ); @@ -129,6 +132,7 @@ 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; } @@ -139,7 +143,7 @@ public: wxString GetVariantType() { return m_variantType; } -private: +protected: wxDataViewCellMode m_mode; wxString m_variantType; wxDataViewColumn *m_owner; diff --git a/include/wx/gtk/dataview.h b/include/wx/gtk/dataview.h index b7841cf6d7..e1e1fab2cc 100644 --- a/include/wx/gtk/dataview.h +++ b/include/wx/gtk/dataview.h @@ -52,6 +52,7 @@ public: wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT ); bool SetValue( const wxVariant &value ); + bool GetValue( wxVariant &value ); protected: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextCell) diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 6fb7bb6c0d..2ce239a6bb 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -33,7 +33,12 @@ class MyTextModel: public wxDataViewListModel { public: - MyTextModel() {} + MyTextModel() + { + size_t i; + for (i = 0; i < 1000; i++) + m_list.Add( wxT("Test") ); + } virtual size_t GetNumberOfRows() { return 1000; } @@ -42,11 +47,30 @@ public: // as reported by wxVariant virtual wxString GetColType( size_t col ) { return wxT("string"); } + virtual wxVariant GetValue( size_t col, size_t row ) - { wxString tmp; - tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col ); - return tmp; + { + if (col == 2) + { + return m_list[row]; + } + else + { + wxString tmp; + tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col ); + return tmp; + } } + virtual bool SetValue( wxVariant &value, size_t col, size_t row ) + { + if (col == 2) + { + m_list[row] = value.GetString(); + } + return true; + } + + wxArrayString m_list; }; // ------------------------------------- @@ -73,7 +97,8 @@ public: void OnAbout(wxCommandEvent& event); private: - wxDataViewCtrl* dataview; + wxDataViewCtrl* dataview_left; + wxDataViewCtrl* dataview_right; }; // ------------------------------------- @@ -126,15 +151,33 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): CreateStatusBar(); - dataview = new wxDataViewCtrl( this, -1 ); + // Left wxDataViewCtrl + dataview_left = new wxDataViewCtrl( this, -1 ); MyTextModel *model = new MyTextModel; - dataview->AssociateModel( model ); + dataview_left->AssociateModel( model ); + + dataview_left->AppendStringColumn( wxT("first"), 0 ); + dataview_left->AppendStringColumn( wxT("second"), 1 ); + wxDataViewTextCell *cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); + wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), cell, 2 ); + dataview_left->AppendColumn( column ); + + // Right wxDataViewCtrl using the same model + dataview_right = new wxDataViewCtrl( this, -1 ); + dataview_right->AssociateModel( model ); - dataview->AppendStringColumn( wxT("first"), 0 ); - dataview->AppendStringColumn( wxT("second"), 1 ); - dataview->AppendStringColumn( wxT("third"), 2 ); + cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE ); + column = new wxDataViewColumn( wxT("editable"), cell, 2 ); + dataview_right->AppendColumn( column ); + dataview_right->AppendStringColumn( wxT("first"), 0 ); + dataview_right->AppendStringColumn( wxT("second"), 1 ); + wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL ); + sizer->Add( dataview_left, 1, wxGROW ); + sizer->Add(10,10); + sizer->Add( dataview_right, 1, wxGROW ); + SetSizer( sizer ); } void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index cf065b765a..e3f74ccac1 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -83,10 +83,10 @@ bool wxDataViewListModel::RowChanged( size_t row ) return false; } -bool wxDataViewListModel::ValueChanged( size_t row, size_t col ) +bool wxDataViewListModel::ValueChanged( size_t col, size_t row ) { if (m_notifier) - return m_notifier->RowAppended(); + return m_notifier->ValueChanged( col, row ); return false; } diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index eda63e10dd..9a45b2bbdd 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -437,7 +437,7 @@ public: virtual bool RowInserted( size_t before ); virtual bool RowDeleted( size_t row ); virtual bool RowChanged( size_t row ); - virtual bool ValueChanged( size_t row, size_t col ); + virtual bool ValueChanged( size_t col, size_t row ); virtual bool Cleared(); GtkWxListStore *m_gtk_store; @@ -488,12 +488,19 @@ bool wxGtkDataViewListModelNotifier::RowDeleted( size_t row ) bool wxGtkDataViewListModelNotifier::RowChanged( size_t row ) { - return false; + GtkTreeIter iter; + iter.stamp = m_gtk_store->stamp; + iter.user_data = (gpointer) row; + GtkTreePath *path = gtk_tree_model_get_path (GTK_TREE_MODEL (m_gtk_store), &iter); + gtk_tree_model_row_changed (GTK_TREE_MODEL (m_gtk_store), path, &iter); + gtk_tree_path_free (path); + + return true; } -bool wxGtkDataViewListModelNotifier::ValueChanged( size_t row, size_t col ) +bool wxGtkDataViewListModelNotifier::ValueChanged( size_t col, size_t row ) { - return false; + return RowChanged( row ); } bool wxGtkDataViewListModelNotifier::Cleared() @@ -517,12 +524,50 @@ wxDataViewCell::wxDataViewCell( const wxString &varianttype, wxDataViewCellMode // wxDataViewTextCell // --------------------------------------------------------- +extern "C" { +static void wxGtkTextRendererEditedCallback( GtkCellRendererText *renderer, + gchar *arg1, gchar *arg2, gpointer user_data ); +} + +static void wxGtkTextRendererEditedCallback( GtkCellRendererText *renderer, + gchar *arg1, gchar *arg2, gpointer user_data ) +{ + wxDataViewTextCell *cell = (wxDataViewTextCell*) user_data; + + wxString tmp = wxGTK_CONV_BACK( arg2 ); + wxVariant value = tmp; + if (!cell->Validate( value )) + return; + + wxDataViewListModel *model = cell->GetOwner()->GetOwner()->GetModel(); + + GtkTreePath *path = gtk_tree_path_new_from_string( arg1 ); + size_t model_row = (size_t)gtk_tree_path_get_indices (path)[0]; + gtk_tree_path_free( path ); + + size_t model_col = cell->GetOwner()->GetModelColumn(); + + model->SetValue( value, model_col, model_row ); + model->ValueChanged( model_col, model_row ); +} + IMPLEMENT_ABSTRACT_CLASS(wxDataViewTextCell, wxDataViewCell) wxDataViewTextCell::wxDataViewTextCell( const wxString &varianttype, wxDataViewCellMode mode ) : wxDataViewCell( varianttype, mode ) { m_renderer = (void*) gtk_cell_renderer_text_new(); + + if (m_mode & wxDATAVIEW_CELL_EDITABLE) + { + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_BOOLEAN ); + g_value_set_boolean( &gvalue, true ); + g_object_set_property( G_OBJECT(m_renderer), "editable", &gvalue ); + g_value_unset( &gvalue ); + + g_signal_connect_after( m_renderer, "edited", G_CALLBACK(wxGtkTextRendererEditedCallback), this ); + } } bool wxDataViewTextCell::SetValue( const wxVariant &value ) @@ -538,6 +583,19 @@ bool wxDataViewTextCell::SetValue( const wxVariant &value ) return true; } +bool wxDataViewTextCell::GetValue( wxVariant &value ) +{ + GValue gvalue = { 0, }; + g_value_init( &gvalue, G_TYPE_STRING ); + g_object_get_property( G_OBJECT(m_renderer), "text", &gvalue ); + wxString tmp = wxGTK_CONV_BACK( g_value_get_string( &gvalue ) ); + g_value_unset( &gvalue ); + + value = tmp; + + return true; +} + // --------------------------------------------------------- // wxDataViewColumn // --------------------------------------------------------- @@ -562,9 +620,11 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column, GtkWxListStore *list_store = (GtkWxListStore *) model; wxDataViewCell *cell = (wxDataViewCell*) data; + + size_t model_row = (size_t) iter->user_data; - wxVariant value = list_store->model->GetValue( (size_t) iter->user_data, - cell->GetOwner()->GetModelColumn() ); + wxVariant value = list_store->model->GetValue( + cell->GetOwner()->GetModelColumn(), model_row ); if (value.GetType() != cell->GetVariantType()) wxPrintf( wxT("Wrong type\n") );