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;
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()
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;
}