]> git.saurik.com Git - wxWidgets.git/commitdiff
wxDataViewCtrl now with editable text and multiple
authorRobert Roebling <robert@roebling.de>
Thu, 23 Feb 2006 13:34:15 +0000 (13:34 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 23 Feb 2006 13:34:15 +0000 (13:34 +0000)
    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

include/wx/dataview.h
include/wx/gtk/dataview.h
samples/dataview/dataview.cpp
src/common/datavcmn.cpp
src/gtk/dataview.cpp

index 42da39cab3115f5ff8f9b520a0f50a2b75838d08..0b2ae8d09f90a158c44f416f3b6fe1cb36675727 100644 (file)
@@ -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;
index b7841cf6d7670837d9660239e28716dfc4a659ad..e1e1fab2cc6a1d565570bf67a1701cbfce68e305 100644 (file)
@@ -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)
index 6fb7bb6c0d9f64e97468effe23e37fb431d78236..2ce239a6bb856dc36690522b5ef9204bb2e58f1b 100644 (file)
 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) )
index cf065b765a6960f7749b1db79ec5f5b0ceab7515..e3f74ccac1457a613f0dfc065bc2fba38d3d80cb 100644 (file)
@@ -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;
 }
index eda63e10dd405b80af4cbf6a239b6aea7ab6e90c..9a45b2bbdd00fda9654324a8b981e2e780fdbe6d 100644 (file)
@@ -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") );