dbd211dbc2
Neither of these methods was actually ever used after the changes of the last two commits (and they hadn't been used when not using wxGTK even before), so don't force the user-defined model classes to override them. Also stop using them, as the stub versions don't return correct values any longer. Still keep the virtual functions in the base class for compatibility however as it doesn't cost us much and avoids breaking the existing code using "override".
301 lines
9.0 KiB
C++
301 lines
9.0 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: mymodels.h
|
|
// Purpose: wxDataViewCtrl wxWidgets sample
|
|
// Author: Robert Roebling
|
|
// Modified by: Francesco Montorsi, Bo Yang
|
|
// Created: 06/01/06
|
|
// Copyright: (c) Robert Roebling
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "wx/hashmap.h"
|
|
#include "wx/vector.h"
|
|
|
|
WX_DECLARE_HASH_MAP(unsigned, wxString, wxIntegerHash, wxIntegerEqual,
|
|
IntToStringMap);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// 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,
|
|
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 );
|
|
void Clear();
|
|
|
|
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 wxOVERRIDE;
|
|
|
|
// implementation of base class virtuals to define model
|
|
|
|
virtual void GetValue( wxVariant &variant,
|
|
const wxDataViewItem &item, unsigned int col ) const wxOVERRIDE;
|
|
virtual bool SetValue( const wxVariant &variant,
|
|
const wxDataViewItem &item, unsigned int col ) wxOVERRIDE;
|
|
|
|
virtual bool IsEnabled( const wxDataViewItem &item,
|
|
unsigned int col ) const wxOVERRIDE;
|
|
|
|
virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const wxOVERRIDE;
|
|
virtual bool IsContainer( const wxDataViewItem &item ) const wxOVERRIDE;
|
|
virtual unsigned int GetChildren( const wxDataViewItem &parent,
|
|
wxDataViewItemArray &array ) const wxOVERRIDE;
|
|
|
|
private:
|
|
MyMusicTreeModelNode* m_root;
|
|
|
|
// pointers to some "special" nodes of the tree:
|
|
MyMusicTreeModelNode* m_pop;
|
|
MyMusicTreeModelNode* m_classical;
|
|
MyMusicTreeModelNode* m_ninth;
|
|
|
|
// ??
|
|
bool m_classicalMusicIsKnownToControl;
|
|
};
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// MyLongMusicTreeModel
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class MyLongMusicTreeModel : public MyMusicTreeModel
|
|
{
|
|
public:
|
|
MyLongMusicTreeModel();
|
|
};
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// MyListModel
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class MyListModel: public wxDataViewVirtualListModel
|
|
{
|
|
public:
|
|
enum
|
|
{
|
|
Col_ToggleIconText,
|
|
Col_EditableText,
|
|
Col_Date,
|
|
Col_TextWithAttr,
|
|
Col_Custom
|
|
};
|
|
|
|
MyListModel(int modelFlags);
|
|
|
|
// 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 void GetValueByRow( wxVariant &variant,
|
|
unsigned int row, unsigned int col ) const wxOVERRIDE;
|
|
virtual bool GetAttrByRow( unsigned int row, unsigned int col,
|
|
wxDataViewItemAttr &attr ) const wxOVERRIDE;
|
|
virtual bool SetValueByRow( const wxVariant &variant,
|
|
unsigned int row, unsigned int col ) wxOVERRIDE;
|
|
|
|
private:
|
|
wxVector<bool> m_toggleColValues;
|
|
wxArrayString m_textColValues;
|
|
wxArrayString m_iconColValues;
|
|
IntToStringMap m_customColValues;
|
|
wxBitmapBundle m_icon[2];
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// MyListStoreDerivedModel
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class MyListStoreDerivedModel : public wxDataViewListStore
|
|
{
|
|
public:
|
|
virtual bool IsEnabledByRow(unsigned int row, unsigned int col) const wxOVERRIDE;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// MyListStoreHasValueModel
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class MyListStoreHasValueModel : public MyListStoreDerivedModel
|
|
{
|
|
public:
|
|
virtual bool HasValue(const wxDataViewItem &item, unsigned int col) const wxOVERRIDE;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// MyIndexListModel
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class MyIndexListModel : public wxDataViewIndexListModel
|
|
{
|
|
public:
|
|
MyIndexListModel() { }
|
|
|
|
void Fill(const wxArrayString& strings)
|
|
{
|
|
m_strings = strings;
|
|
|
|
Reset(m_strings.size());
|
|
}
|
|
|
|
// Implement base class pure virtual methods.
|
|
unsigned GetCount() const wxOVERRIDE { return m_strings.size(); }
|
|
void GetValueByRow(wxVariant& val, unsigned row, unsigned) const wxOVERRIDE
|
|
{
|
|
val = m_strings[row];
|
|
}
|
|
bool SetValueByRow(const wxVariant&, unsigned, unsigned) wxOVERRIDE
|
|
{
|
|
return false;
|
|
}
|
|
|
|
private:
|
|
wxArrayString m_strings;
|
|
|
|
wxDECLARE_NO_COPY_CLASS(MyIndexListModel);
|
|
};
|
|
|
|
enum ModelFlags
|
|
{
|
|
MODEL_USE_TALL_ROWS = 1 << 0,
|
|
MODEL_KEEP_LOGO_SMALL = 1 << 1,
|
|
MODEL_USE_MULTI_LINE_TEXT = 1 << 2
|
|
};
|
|
|
|
inline wxSize GetIconSizeFromModelFlags(int modelFlags)
|
|
{
|
|
wxSize size(16, 16);
|
|
if ( (modelFlags & MODEL_USE_TALL_ROWS) && !(modelFlags & MODEL_KEEP_LOGO_SMALL) )
|
|
size *= 2;
|
|
|
|
return size;
|
|
}
|