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();
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 );
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; }
-private:
+protected:
wxDataViewCellMode m_mode;
wxString m_variantType;
wxDataViewColumn *m_owner;
wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT );
bool SetValue( const wxVariant &value );
+ bool GetValue( wxVariant &value );
protected:
DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextCell)
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; }
// 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;
};
// -------------------------------------
void OnAbout(wxCommandEvent& event);
private:
- wxDataViewCtrl* dataview;
+ wxDataViewCtrl* dataview_left;
+ wxDataViewCtrl* dataview_right;
};
// -------------------------------------
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) )
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;
}
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()
// 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 )
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
// ---------------------------------------------------------
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") );