wxWidgets/samples/dataview/mymodels.h
Vadim Zeitlin 205bdf2069 Implement icon text column using native GTK renderers in wxDVC.
This has a possible advantage of a more native look and feel (although it's
hard to tell the difference between drawing the icon ourselves and how the
default GTK+ renderer does it to be honest) and a very real advantage of
allowing to edit in place cells with icons. It also reduces code duplication
in GTK implementation.

Modify the sample to make the icon-text column in the list model editable to
show that it works. This required storing the values of the second column as
well, so do it in its own array and to avoid calling it "m_array2", rename the
existing m_array to m_textColValues (which accounts for most of the diff in
the sample) and call the new one m_iconColValues.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62423 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2009-10-16 01:29:06 +00:00

234 lines
6.9 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: mymodels.h
// Purpose: wxDataViewCtrl wxWidgets sample
// Author: Robert Roebling
// Modified by: Francesco Montorsi, Bo Yang
// Created: 06/01/06
// RCS-ID: $Id$
// Copyright: (c) Robert Roebling
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// MyMusicTreeModelNode: a node inside MyMusicTreeModel
// ----------------------------------------------------------------------------
class MyMusicTreeModelNode;
WX_DEFINE_ARRAY_PTR( MyMusicTreeModelNode*, MyMusicTreeModelNodePtrArray );
class MyMusicTreeModelNode
{
public:
MyMusicTreeModelNode( MyMusicTreeModelNode* parent,
const wxString &title, const wxString &artist,
unsigned int year )
{
m_parent = parent;
m_title = title;
m_artist = artist;
m_year = year;
m_quality = "good";
m_container = false;
}
MyMusicTreeModelNode( MyMusicTreeModelNode* parent,
const wxString &branch )
{
m_parent = parent;
m_title = branch;
m_year = -1;
m_container = true;
}
~MyMusicTreeModelNode()
{
// free all our children nodes
size_t count = m_children.GetCount();
for (size_t i = 0; i < count; i++)
{
MyMusicTreeModelNode *child = m_children[i];
delete child;
}
}
bool IsContainer() const
{ return m_container; }
MyMusicTreeModelNode* GetParent()
{ return m_parent; }
MyMusicTreeModelNodePtrArray& GetChildren()
{ return m_children; }
MyMusicTreeModelNode* GetNthChild( unsigned int n )
{ return m_children.Item( n ); }
void Insert( MyMusicTreeModelNode* child, unsigned int n)
{ m_children.Insert( child, n); }
void Append( MyMusicTreeModelNode* child )
{ m_children.Add( child ); }
unsigned int GetChildCount() const
{ return m_children.GetCount(); }
public: // public to avoid getters/setters
wxString m_title;
wxString m_artist;
int m_year;
wxString m_quality;
// TODO/FIXME:
// the GTK version of wxDVC (in particular wxDataViewCtrlInternal::ItemAdded)
// needs to know in advance if a node is or _will be_ a container.
// Thus implementing:
// bool IsContainer() const
// { return m_children.GetCount()>0; }
// doesn't work with wxGTK when MyMusicTreeModel::AddToClassical is called
// AND the classical node was removed (a new node temporary without children
// would be added to the control)
bool m_container;
private:
MyMusicTreeModelNode *m_parent;
MyMusicTreeModelNodePtrArray m_children;
};
// ----------------------------------------------------------------------------
// MyMusicTreeModel
// ----------------------------------------------------------------------------
/*
Implement this data model
Title Artist Year Judgement
--------------------------------------------------------------------------
1: My Music:
2: Pop music
3: You are not alone Michael Jackson 1995 good
4: Take a bow Madonna 1994 good
5: Classical music
6: Ninth Symphony Ludwig v. Beethoven 1824 good
7: German Requiem Johannes Brahms 1868 good
*/
class MyMusicTreeModel: public wxDataViewModel
{
public:
MyMusicTreeModel();
~MyMusicTreeModel()
{
delete m_root;
}
// helper method for wxLog
wxString GetTitle( const wxDataViewItem &item ) const;
wxString GetArtist( const wxDataViewItem &item ) const;
int GetYear( const wxDataViewItem &item ) const;
// helper methods to change the model
void AddToClassical( const wxString &title, const wxString &artist,
unsigned int year );
void Delete( const wxDataViewItem &item );
wxDataViewItem GetNinthItem() const
{
return wxDataViewItem( m_ninth );
}
// override sorting to always sort branches ascendingly
int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
unsigned int column, bool ascending ) const;
// implementation of base class virtuals to define model
virtual unsigned int GetColumnCount() const
{
return 6;
}
virtual wxString GetColumnType( unsigned int col ) const
{
if (col == 2)
return wxT("long");
return wxT("string");
}
virtual void GetValue( wxVariant &variant,
const wxDataViewItem &item, unsigned int col ) const;
virtual bool SetValue( const wxVariant &variant,
const wxDataViewItem &item, unsigned int col );
virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const;
virtual bool IsContainer( const wxDataViewItem &item ) const;
virtual unsigned int GetChildren( const wxDataViewItem &parent,
wxDataViewItemArray &array ) const;
private:
MyMusicTreeModelNode* m_root;
// pointers to some "special" nodes of the tree:
MyMusicTreeModelNode* m_pop;
MyMusicTreeModelNode* m_classical;
MyMusicTreeModelNode* m_ninth;
// ??
bool m_classicalMusicIsKnownToControl;
};
// ----------------------------------------------------------------------------
// MyListModel
// ----------------------------------------------------------------------------
class MyListModel: public wxDataViewVirtualListModel
{
public:
MyListModel();
// helper methods to change the model
void Prepend( const wxString &text );
void DeleteItem( const wxDataViewItem &item );
void DeleteItems( const wxDataViewItemArray &items );
void AddMany();
// implementation of base class virtuals to define model
virtual unsigned int GetColumnCount() const
{
return 3;
}
virtual wxString GetColumnType( unsigned int col ) const
{
if (col == 1)
return wxT("wxDataViewIconText");
return wxT("string");
}
virtual unsigned int GetRowCount()
{
return m_textColValues.GetCount();
}
virtual void GetValueByRow( wxVariant &variant,
unsigned int row, unsigned int col ) const;
virtual bool GetAttrByRow( unsigned int row, unsigned int col, wxDataViewItemAttr &attr );
virtual bool SetValueByRow( const wxVariant &variant,
unsigned int row, unsigned int col );
private:
wxArrayString m_textColValues;
wxArrayString m_iconColValues;
wxIcon m_icon[2];
int m_virtualItems;
};