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
This commit is contained in:
		@@ -80,9 +80,12 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    virtual size_t GetNumberOfRows() = 0;
 | 
					    virtual size_t GetNumberOfRows() = 0;
 | 
				
			||||||
    virtual size_t GetNumberOfCols() = 0;
 | 
					    virtual size_t GetNumberOfCols() = 0;
 | 
				
			||||||
    // as reported by wxVariant
 | 
					    // return type as reported by wxVariant
 | 
				
			||||||
    virtual wxString GetColType( size_t col ) = 0;
 | 
					    virtual wxString GetColType( size_t col ) = 0;
 | 
				
			||||||
 | 
					    // get value into a wxVariant
 | 
				
			||||||
    virtual wxVariant GetValue( size_t col, size_t row ) = 0;
 | 
					    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
 | 
					    // delegated notifiers
 | 
				
			||||||
    bool RowAppended();
 | 
					    bool RowAppended();
 | 
				
			||||||
@@ -90,7 +93,7 @@ public:
 | 
				
			|||||||
    bool RowInserted( size_t before );
 | 
					    bool RowInserted( size_t before );
 | 
				
			||||||
    bool RowDeleted( size_t row );
 | 
					    bool RowDeleted( size_t row );
 | 
				
			||||||
    bool RowChanged( 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();
 | 
					    bool Cleared();
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    void SetNotifier( wxDataViewListModelNotifier *notifier );
 | 
					    void SetNotifier( wxDataViewListModelNotifier *notifier );
 | 
				
			||||||
@@ -129,6 +132,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    virtual bool SetValue( const wxVariant &value ) { return true; }
 | 
					    virtual bool SetValue( const wxVariant &value ) { return true; }
 | 
				
			||||||
    virtual bool GetValue( 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 BeginEdit()    { return true; }
 | 
				
			||||||
    virtual bool EndEdit()      { return true; }
 | 
					    virtual bool EndEdit()      { return true; }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -139,7 +143,7 @@ public:
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    wxString GetVariantType()   { return m_variantType; }
 | 
					    wxString GetVariantType()   { return m_variantType; }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
private:
 | 
					protected:
 | 
				
			||||||
    wxDataViewCellMode      m_mode;
 | 
					    wxDataViewCellMode      m_mode;
 | 
				
			||||||
    wxString                m_variantType;
 | 
					    wxString                m_variantType;
 | 
				
			||||||
    wxDataViewColumn       *m_owner;
 | 
					    wxDataViewColumn       *m_owner;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,7 @@ public:
 | 
				
			|||||||
                        wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT );
 | 
					                        wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool SetValue( const wxVariant &value );
 | 
					    bool SetValue( const wxVariant &value );
 | 
				
			||||||
 | 
					    bool GetValue( wxVariant &value );
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextCell)
 | 
					    DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextCell)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,7 +33,12 @@
 | 
				
			|||||||
class MyTextModel: public wxDataViewListModel
 | 
					class MyTextModel: public wxDataViewListModel
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    MyTextModel() {}
 | 
					    MyTextModel() 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        size_t i;
 | 
				
			||||||
 | 
					        for (i = 0; i < 1000; i++)
 | 
				
			||||||
 | 
					            m_list.Add( wxT("Test") );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    virtual size_t GetNumberOfRows() 
 | 
					    virtual size_t GetNumberOfRows() 
 | 
				
			||||||
        { return 1000; }
 | 
					        { return 1000; }
 | 
				
			||||||
@@ -42,11 +47,30 @@ public:
 | 
				
			|||||||
    // as reported by wxVariant
 | 
					    // as reported by wxVariant
 | 
				
			||||||
    virtual wxString GetColType( size_t col )
 | 
					    virtual wxString GetColType( size_t col )
 | 
				
			||||||
        { return wxT("string"); }
 | 
					        { return wxT("string"); }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
    virtual wxVariant GetValue( size_t col, size_t row )
 | 
					    virtual wxVariant GetValue( size_t col, size_t row )
 | 
				
			||||||
        {   wxString tmp; 
 | 
					        {   
 | 
				
			||||||
            tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col ); 
 | 
					            if (col == 2)
 | 
				
			||||||
            return tmp;
 | 
					            {
 | 
				
			||||||
 | 
					                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);
 | 
					    void OnAbout(wxCommandEvent& event);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
private:
 | 
					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();
 | 
					    CreateStatusBar();
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    dataview = new wxDataViewCtrl( this, -1 );
 | 
					    // Left wxDataViewCtrl
 | 
				
			||||||
 | 
					    dataview_left = new wxDataViewCtrl( this, -1 );
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    MyTextModel *model = new MyTextModel;
 | 
					    MyTextModel *model = new MyTextModel;
 | 
				
			||||||
    dataview->AssociateModel( model );
 | 
					    dataview_left->AssociateModel( model );
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    dataview->AppendStringColumn( wxT("first"), 0 );
 | 
					    dataview_left->AppendStringColumn( wxT("first"), 0 );
 | 
				
			||||||
    dataview->AppendStringColumn( wxT("second"), 1 );
 | 
					    dataview_left->AppendStringColumn( wxT("second"), 1 );
 | 
				
			||||||
    dataview->AppendStringColumn( wxT("third"), 2 );
 | 
					    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 );
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    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) )
 | 
					void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,10 +83,10 @@ bool wxDataViewListModel::RowChanged( size_t row )
 | 
				
			|||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool wxDataViewListModel::ValueChanged( size_t row, size_t col )
 | 
					bool wxDataViewListModel::ValueChanged( size_t col, size_t row )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (m_notifier)
 | 
					    if (m_notifier)
 | 
				
			||||||
        return m_notifier->RowAppended();
 | 
					        return m_notifier->ValueChanged( col, row );
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -437,7 +437,7 @@ public:
 | 
				
			|||||||
    virtual bool RowInserted( size_t before );
 | 
					    virtual bool RowInserted( size_t before );
 | 
				
			||||||
    virtual bool RowDeleted( size_t row );
 | 
					    virtual bool RowDeleted( size_t row );
 | 
				
			||||||
    virtual bool RowChanged( 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();
 | 
					    virtual bool Cleared();
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    GtkWxListStore      *m_gtk_store;
 | 
					    GtkWxListStore      *m_gtk_store;
 | 
				
			||||||
@@ -488,12 +488,19 @@ bool wxGtkDataViewListModelNotifier::RowDeleted( size_t row )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
bool wxGtkDataViewListModelNotifier::RowChanged( 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()
 | 
					bool wxGtkDataViewListModelNotifier::Cleared()
 | 
				
			||||||
@@ -517,12 +524,50 @@ wxDataViewCell::wxDataViewCell( const wxString &varianttype, wxDataViewCellMode
 | 
				
			|||||||
// wxDataViewTextCell
 | 
					// 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)
 | 
					IMPLEMENT_ABSTRACT_CLASS(wxDataViewTextCell, wxDataViewCell)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
wxDataViewTextCell::wxDataViewTextCell( const wxString &varianttype, wxDataViewCellMode mode ) :
 | 
					wxDataViewTextCell::wxDataViewTextCell( const wxString &varianttype, wxDataViewCellMode mode ) :
 | 
				
			||||||
    wxDataViewCell( varianttype, mode )
 | 
					    wxDataViewCell( varianttype, mode )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_renderer = (void*) gtk_cell_renderer_text_new();
 | 
					    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 )
 | 
					bool wxDataViewTextCell::SetValue( const wxVariant &value )
 | 
				
			||||||
@@ -538,6 +583,19 @@ bool wxDataViewTextCell::SetValue( const wxVariant &value )
 | 
				
			|||||||
    return true;
 | 
					    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
 | 
					// wxDataViewColumn
 | 
				
			||||||
// --------------------------------------------------------- 
 | 
					// --------------------------------------------------------- 
 | 
				
			||||||
@@ -562,9 +620,11 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column,
 | 
				
			|||||||
    GtkWxListStore *list_store = (GtkWxListStore *) model;
 | 
					    GtkWxListStore *list_store = (GtkWxListStore *) model;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    wxDataViewCell *cell = (wxDataViewCell*) data;
 | 
					    wxDataViewCell *cell = (wxDataViewCell*) data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    size_t model_row = (size_t) iter->user_data;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    wxVariant value = list_store->model->GetValue( (size_t) iter->user_data,
 | 
					    wxVariant value = list_store->model->GetValue( 
 | 
				
			||||||
                                                   cell->GetOwner()->GetModelColumn() );
 | 
					        cell->GetOwner()->GetModelColumn(), model_row );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (value.GetType() != cell->GetVariantType())
 | 
					    if (value.GetType() != cell->GetVariantType())
 | 
				
			||||||
        wxPrintf( wxT("Wrong type\n") );
 | 
					        wxPrintf( wxT("Wrong type\n") );
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user