void SettersGettersModel::DeleteItem(const wxDataViewItem& item) { SettersGettersModel_Item* node = reinterpret_cast<SettersGettersModel_Item*>(item.m_pItem); if ( node ) { SettersGettersModel_Item* parent = node->GetParent(); wxDataViewItem parentItem(parent); ItemDeleted(parentItem, item); // this will also remove it from its model parent children list if ( parent == NULL ) { // root item, remove it from the roots array wxVector<SettersGettersModel_Item*>::iterator where = std::find(m_data.begin(), m_data.end(), node); if ( where != m_data.end() ) { m_data.erase(where); } } // If there are no more children, change the item back to 'normal' if ( parent && parent->GetChildren().empty() ) DoChangeItemType(parentItem, false); wxDELETE(node); } if ( IsEmpty() ) Cleared(); }
wxDataViewItem SettersGettersModel::GetParent(const wxDataViewItem& item) const { SettersGettersModel_Item* node = reinterpret_cast<SettersGettersModel_Item*>(item.m_pItem); if ( node ) { return wxDataViewItem(node->GetParent()); } return wxDataViewItem(NULL); }
wxDataViewItem SettersGettersModel::InsertItem(const wxDataViewItem& insertBeforeMe, const wxVector<wxVariant>& data, wxClientData *clientData) { wxDataViewItem ch = DoInsertItem(insertBeforeMe, data, false, clientData); if ( ch.IsOk() ) { SettersGettersModel_Item* node = reinterpret_cast<SettersGettersModel_Item*>(ch.GetID()); ItemAdded(wxDataViewItem(node->GetParent()), ch); } return ch; }
void SettersGettersModel::DeleteItems(const wxDataViewItem& parent, const wxDataViewItemArray& items) { // sanity for(size_t i=0; i<items.GetCount(); ++i) { SettersGettersModel_Item* node = reinterpret_cast<SettersGettersModel_Item*>(items.Item(i).m_pItem); wxUnusedVar(node); wxASSERT(node && node->GetParent() == parent.m_pItem); DeleteItem(items.Item(i)); } }
void SettersGettersModel::DoChangeItemType(const wxDataViewItem& item, bool changeToContainer) { SettersGettersModel_Item* node = reinterpret_cast<SettersGettersModel_Item*>(item.GetID()); if ( !node ) return; if ( ( changeToContainer && !node->IsContainer()) || // change an item from non-container to container type ( !changeToContainer && node->IsContainer()) ) { // change an item from container to non-container type #if defined(__WXGTK__) || defined(__WXMAC__) // change the item to container type: // 1st we need to delete it ItemDeleted(wxDataViewItem(node->GetParent()), item); // update the node type node->SetIsContainer(changeToContainer); ItemAdded(wxDataViewItem(node->GetParent()), item); #else node->SetIsContainer(changeToContainer); #endif } }
wxDataViewItem SettersGettersModel::DoInsertItem(const wxDataViewItem& insertBeforeMe, const wxVector<wxVariant>& data, bool isContainer, wxClientData *clientData) { SettersGettersModel_Item* child = new SettersGettersModel_Item(); child->SetIsContainer(isContainer); child->SetClientObject( clientData ); child->SetData( data ); // find the location where to insert the new item SettersGettersModel_Item* node = reinterpret_cast<SettersGettersModel_Item*>(insertBeforeMe.m_pItem); if ( !node ) return wxDataViewItem(); wxVector<SettersGettersModel_Item*>::iterator where = std::find(m_data.begin(), m_data.end(), node); if ( where != m_data.end() ) { // top level item m_data.insert( where, child ); } else { if ( !node->GetParent() ) return wxDataViewItem(); child->SetParent(node->GetParent()); where = std::find(node->GetParent()->GetChildren().begin(), node->GetParent()->GetChildren().end(), node); if ( where == node->GetParent()->GetChildren().end() ) { node->GetParent()->GetChildren().push_back( child ); } else { node->GetParent()->GetChildren().insert(where, child); } } return wxDataViewItem(child); }