// setup pop music
m_pop = new MyMusicTreeModelNode( m_root, "Pop music" );
m_pop->Append(
- new MyMusicTreeModelNode( m_pop, "You are not alone"), "Michael Jackson", 1995 ) );
+ new MyMusicTreeModelNode( m_pop, "You are not alone", "Michael Jackson", 1995 ) );
m_pop->Append(
new MyMusicTreeModelNode( m_pop, "Take a bow", "Madonna", 1994 ) );
m_root->Append( m_pop );
return node->m_title;
}
+wxString MyMusicTreeModel::GetArtist( const wxDataViewItem &item ) const
+{
+ MyMusicTreeModelNode *node = (MyMusicTreeModelNode*) item.GetID();
+ if (!node) // happens if item.IsOk()==false
+ return wxEmptyString;
+
+ return node->m_artist;
+}
+
int MyMusicTreeModel::GetYear( const wxDataViewItem &item ) const
{
MyMusicTreeModelNode *node = (MyMusicTreeModelNode*) item.GetID();
}
int MyMusicTreeModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
- unsigned int column, bool ascending )
+ unsigned int column, bool ascending ) const
{
wxASSERT(item1.IsOk() && item2.IsOk());
// should never happen
m_virtualItems = INITIAL_NUMBER_OF_ITEMS;
// the first 100 items are really stored in this model;
- // all the others are synthetized on request
- for (unsigned int i = 0; i < 100; i++)
+ // all the others are synthesized on request
+ static const unsigned NUMBER_REAL_ITEMS = 100;
+
+ m_textColValues.reserve(NUMBER_REAL_ITEMS);
+ m_textColValues.push_back("first row with long label to test ellipsization");
+ for (unsigned int i = 1; i < NUMBER_REAL_ITEMS; i++)
{
- wxString str;
- str.Printf( "real row %d"), i );
- m_array.Add( str );
+ m_textColValues.push_back(wxString::Format("real row %d", i));
}
+ m_iconColValues.assign(NUMBER_REAL_ITEMS, "test");
+
m_icon[0] = wxIcon( null_xpm );
m_icon[1] = wxIcon( wx_small_xpm );
}
void MyListModel::Prepend( const wxString &text )
{
- m_array.Insert( text, 0 );
+ m_textColValues.Insert( text, 0 );
RowPrepended();
}
void MyListModel::DeleteItem( const wxDataViewItem &item )
{
unsigned int row = GetRow( item );
- if (row >= m_array.GetCount())
+ if (row >= m_textColValues.GetCount())
return;
- m_array.RemoveAt( row );
+ m_textColValues.RemoveAt( row );
RowDeleted( row );
}
for (i = 0; i < items.GetCount(); i++)
{
unsigned int row = GetRow( items[i] );
- if (row < m_array.GetCount())
+ if (row < m_textColValues.GetCount())
rows.Add( row );
}
{
// none of the selected items were in the range of the items
// which we store... for simplicity, don't allow removing them
- wxLogError( "Cannot remove rows with an index greater than %d", m_array.GetCount() );
+ wxLogError( "Cannot remove rows with an index greater than %d", m_textColValues.GetCount() );
return;
}
// remaining indeces would all be wrong.
rows.Sort( my_sort_reverse );
for (i = 0; i < rows.GetCount(); i++)
- m_array.RemoveAt( rows[i] );
+ m_textColValues.RemoveAt( rows[i] );
// This is just to test if wxDataViewCtrl can
// cope with removing rows not sorted in
void MyListModel::AddMany()
{
m_virtualItems += 1000;
- Reset( m_array.GetCount() + m_virtualItems );
+ Reset( m_textColValues.GetCount() + m_virtualItems );
}
void MyListModel::GetValueByRow( wxVariant &variant,
{
if (col==0)
{
- if (row >= m_array.GetCount())
+ if (row >= m_textColValues.GetCount())
variant = wxString::Format( "virtual row %d", row );
else
- variant = m_array[ row ];
+ variant = m_textColValues[ row ];
}
else if (col==1)
{
- wxDataViewIconText data( "test", m_icon[ row%2 ] );
- variant << data;
+ wxString text;
+ if ( row >= m_iconColValues.GetCount() )
+ text = "virtual icon";
+ else
+ text = m_iconColValues[row];
+
+ variant << wxDataViewIconText(text, m_icon[row % 2]);
}
else if (col==2)
{
- if (row >= m_array.GetCount())
- variant = "plain";
- else
- variant = "blue/green/red";
+ static const char *labels[5] =
+ {
+ "blue", "green", "red", "bold cyan", "default",
+ };
+
+ variant = labels[row % 5];
}
}
bool MyListModel::GetAttrByRow( unsigned int row, unsigned int col,
wxDataViewItemAttr &attr )
{
- if (col != 2)
- return false;
-
- if (row < m_array.GetCount())
+ switch ( col )
{
- attr.SetColour( (row%2) == 0 ? *wxBLUE :
- ((row%3) == 0 ? *wxGREEN : *wxRED) );
- attr.SetItalic( (row%2) == 5 );
+ case 0:
+ return false;
+
+ case 1:
+ if ( !(row % 2) )
+ return false;
+ attr.SetColour(*wxLIGHT_GREY);
+ break;
+
+ case 2:
+ // do what the labels defined above hint at
+ switch ( row % 5 )
+ {
+ case 0:
+ attr.SetColour(*wxBLUE);
+ break;
+
+ case 1:
+ attr.SetColour(*wxGREEN);
+ break;
+
+ case 2:
+ attr.SetColour(*wxRED);
+ break;
+
+ case 3:
+ attr.SetColour(*wxCYAN);
+ attr.SetBold(true);
+ break;
+
+ case 4:
+ return false;
+ }
+ break;
}
return true;
bool MyListModel::SetValueByRow( const wxVariant &variant,
unsigned int row, unsigned int col )
{
- if (col == 0)
+ switch ( col )
{
- if (row >= m_array.GetCount())
- {
- // the item is not in the range of the items
- // which we store... for simplicity, don't allow editing it
- wxLogError( "Cannot edit rows with an index greater than %d", m_array.GetCount() );
- return false;
- }
+ case 0:
+ case 1:
+ if (row >= m_textColValues.GetCount())
+ {
+ // the item is not in the range of the items
+ // which we store... for simplicity, don't allow editing it
+ wxLogError( "Cannot edit rows with an index greater than %d",
+ m_textColValues.GetCount() );
+ return false;
+ }
+
+ if ( col == 0 )
+ {
+ m_textColValues[row] = variant.GetString();
+ }
+ else // col == 1
+ {
+ wxDataViewIconText iconText;
+ iconText << variant;
+ m_iconColValues[row] = iconText.GetText();
+ }
+ break;
- m_array[row] = variant.GetString();
- return true;
+ default:
+ wxLogError("Cannot edit the column %d", col);
+ return false;
}
- return false;
+ return true;
}