]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
Give attribution to Jorgen Bodde
[wxWidgets.git] / src / gtk / dataview.cpp
index 711516b578501d29d0843cd6166689dee5801a5e..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()
@@ -501,39 +508,147 @@ bool wxGtkDataViewListModelNotifier::Cleared()
     return false;
 }
 
+// --------------------------------------------------------- 
+// wxDataViewCell
+// --------------------------------------------------------- 
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewCell, wxDataViewCellBase)
+
+wxDataViewCell::wxDataViewCell( const wxString &varianttype, wxDataViewCellMode mode ) :
+    wxDataViewCellBase( varianttype, mode )
+{
+    m_renderer = NULL;
+}
 
 // --------------------------------------------------------- 
-// wxDataViewColumn
+// wxDataViewTextCell
 // --------------------------------------------------------- 
 
-IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn, wxDataViewColumnBase)
+extern "C" {
+static void wxGtkTextRendererEditedCallback( GtkCellRendererText *renderer, 
+    gchar *arg1, gchar *arg2, gpointer user_data );
+}
 
-wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewCtrl *ctrl, 
-            wxDataViewColumnType kind, int flags ) :
-    wxDataViewColumnBase( title, ctrl, kind, flags )
+static void wxGtkTextRendererEditedCallback( GtkCellRendererText *renderer, 
+    gchar *arg1, gchar *arg2, gpointer user_data )
 {
-    GtkCellRenderer *renderer = NULL;
+    wxDataViewTextCell *cell = (wxDataViewTextCell*) user_data;
     
-    if (kind == wxDATAVIEW_COL_TEXT)
-    {
-        renderer = gtk_cell_renderer_text_new();
-    } else
-    if (kind == wxDATAVIEW_COL_CHECK)
-    {
-        renderer = gtk_cell_renderer_toggle_new();
-    } else
-    if (kind == wxDATAVIEW_COL_ICON)
+    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)
     {
-        renderer = gtk_cell_renderer_pixbuf_new();
+        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 );
     }
-    else
-        return;
+}
 
-    GtkTreeViewColumn *column = 
-        gtk_tree_view_column_new_with_attributes( wxGTK_CONV(title), renderer, "text", 0, NULL );
-       
-    // bind to data here... not above.
+bool wxDataViewTextCell::SetValue( const wxVariant &value )
+{
+    wxString tmp = value;
     
+    GValue gvalue = { 0, };
+    g_value_init( &gvalue, G_TYPE_STRING );
+    g_value_set_string( &gvalue, wxGTK_CONV( tmp ) );
+    g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue );
+    g_value_unset( &gvalue );
+    
+    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
+// --------------------------------------------------------- 
+
+
+extern "C" {
+static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column,
+                            GtkCellRenderer *cell,
+                            GtkTreeModel *model,
+                            GtkTreeIter *iter,
+                            gpointer data );
+}
+
+
+static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column,
+                            GtkCellRenderer *renderer,
+                            GtkTreeModel *model,
+                            GtkTreeIter *iter,
+                            gpointer data )
+{
+    g_return_if_fail (GTK_IS_WX_LIST_STORE (model));
+    GtkWxListStore *list_store = (GtkWxListStore *) model;
+    
+    wxDataViewCell *cell = (wxDataViewCell*) data;
+
+    size_t model_row = (size_t) iter->user_data;
+    
+    wxVariant value = list_store->model->GetValue( 
+        cell->GetOwner()->GetModelColumn(), model_row );
+
+    if (value.GetType() != cell->GetVariantType())
+        wxPrintf( wxT("Wrong type\n") );
+                                            
+    cell->SetValue( value );
+}
+
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn, wxDataViewColumnBase)
+
+wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewCell *cell, 
+    size_t model_column, int flags ) :
+    wxDataViewColumnBase( title, cell, model_column, flags )
+{
+    GtkCellRenderer *renderer = (GtkCellRenderer *) cell->GetGtkHandle();
+    
+    GtkTreeViewColumn *column = gtk_tree_view_column_new();
+   
+    gtk_tree_view_column_set_title( column, wxGTK_CONV(title) );
+    
+    gtk_tree_view_column_pack_start( column, renderer, TRUE );
+    
+    gtk_tree_view_column_set_cell_data_func( column, renderer, 
+        wxGtkTreeCellDataFunc, (gpointer) cell, NULL );
+       
     m_column = (void*) column;
 }