wxWidgets/samples/dataview/mymodels.h
Vadim Zeitlin 4073f3b9bf Use wxBitmapBundle in wxDataViewCtrl-related classes
Extend the existing use of wxIcon in wxDataViewIconText,
wxDataViewCheckIconText, the corresponding renderers and
wxDataViewTreeCtrl to wxBitmapBundle.

As with the other classes, the existing setters have been preserved as
they remain almost entirely compatible with the existing code and the
return type of the existing getters was preserved, with new getters
being introduced for returning wxBitmapBundle only where they're really
required.

Update the sample to use wxBitmapBundle with its wxDataViewTreeCtrl.
2022-01-23 21:55:30 +01:00

329 lines
9.7 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 );
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 unsigned int GetColumnCount() const wxOVERRIDE
{
return 6;
}
virtual wxString GetColumnType( unsigned int col ) const wxOVERRIDE
{
if (col == 2)
return "long";
return "string";
}
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,
Col_Max
};
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 unsigned int GetColumnCount() const wxOVERRIDE
{
return Col_Max;
}
virtual wxString GetColumnType( unsigned int col ) const wxOVERRIDE
{
if (col == Col_ToggleIconText)
return wxDataViewCheckIconTextRenderer::GetDefaultType();
return "string";
}
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 GetColumnCount() const wxOVERRIDE { return 1; }
wxString GetColumnType(unsigned) const wxOVERRIDE { return "string"; }
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;
}