Use wxVector for storing wxDataViewTreeStoreNodes

Replace the use of wxList macros with wxVector.

Also make wxDataViewTreeStore::Compare() slightly more efficient by
iterating over the children list only once instead of doing it twice.
This commit is contained in:
Vadim Zeitlin
2018-02-03 20:35:38 +01:00
parent 342388a456
commit f7e592b335
2 changed files with 74 additions and 29 deletions

View File

@@ -1212,8 +1212,7 @@ private:
wxClientData *m_data; wxClientData *m_data;
}; };
WX_DECLARE_LIST_WITH_DECL(wxDataViewTreeStoreNode, wxDataViewTreeStoreNodeList, typedef wxVector<wxDataViewTreeStoreNode*> wxDataViewTreeStoreNodes;
class WXDLLIMPEXP_ADV);
class WXDLLIMPEXP_ADV wxDataViewTreeStoreContainerNode: public wxDataViewTreeStoreNode class WXDLLIMPEXP_ADV wxDataViewTreeStoreContainerNode: public wxDataViewTreeStoreNode
{ {
@@ -1223,11 +1222,13 @@ public:
wxClientData *data = NULL ); wxClientData *data = NULL );
virtual ~wxDataViewTreeStoreContainerNode(); virtual ~wxDataViewTreeStoreContainerNode();
const wxDataViewTreeStoreNodeList &GetChildren() const const wxDataViewTreeStoreNodes &GetChildren() const
{ return m_children; } { return m_children; }
wxDataViewTreeStoreNodeList &GetChildren() wxDataViewTreeStoreNodes &GetChildren()
{ return m_children; } { return m_children; }
wxDataViewTreeStoreNodes::iterator FindChild(wxDataViewTreeStoreNode* node);
void SetExpandedIcon( const wxIcon &icon ) void SetExpandedIcon( const wxIcon &icon )
{ m_iconExpanded = icon; } { m_iconExpanded = icon; }
const wxIcon &GetExpandedIcon() const const wxIcon &GetExpandedIcon() const
@@ -1241,8 +1242,10 @@ public:
virtual bool IsContainer() wxOVERRIDE virtual bool IsContainer() wxOVERRIDE
{ return true; } { return true; }
void DestroyChildren();
private: private:
wxDataViewTreeStoreNodeList m_children; wxDataViewTreeStoreNodes m_children;
wxIcon m_iconExpanded; wxIcon m_iconExpanded;
bool m_isExpanded; bool m_isExpanded;
}; };

View File

@@ -2439,9 +2439,6 @@ wxDataViewTreeStoreNode::~wxDataViewTreeStoreNode()
delete m_data; delete m_data;
} }
#include "wx/listimpl.cpp"
WX_DEFINE_LIST(wxDataViewTreeStoreNodeList)
wxDataViewTreeStoreContainerNode::wxDataViewTreeStoreContainerNode( wxDataViewTreeStoreContainerNode::wxDataViewTreeStoreContainerNode(
wxDataViewTreeStoreNode *parent, const wxString &text, wxDataViewTreeStoreNode *parent, const wxString &text,
const wxIcon &icon, const wxIcon &expanded, wxClientData *data ) const wxIcon &icon, const wxIcon &expanded, wxClientData *data )
@@ -2449,11 +2446,35 @@ wxDataViewTreeStoreContainerNode::wxDataViewTreeStoreContainerNode(
, m_iconExpanded(expanded) , m_iconExpanded(expanded)
{ {
m_isExpanded = false; m_isExpanded = false;
m_children.DeleteContents(true);
} }
wxDataViewTreeStoreContainerNode::~wxDataViewTreeStoreContainerNode() wxDataViewTreeStoreContainerNode::~wxDataViewTreeStoreContainerNode()
{ {
DestroyChildren();
}
wxDataViewTreeStoreNodes::iterator
wxDataViewTreeStoreContainerNode::FindChild(wxDataViewTreeStoreNode* node)
{
wxDataViewTreeStoreNodes::iterator iter;
for (iter = m_children.begin(); iter != m_children.end(); ++iter)
{
if ( *iter == node )
break;
}
return iter;
}
void wxDataViewTreeStoreContainerNode::DestroyChildren()
{
wxDataViewTreeStoreNodes::const_iterator iter;
for (iter = m_children.begin(); iter != m_children.end(); ++iter)
{
delete *iter;
}
m_children.clear();
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -2476,7 +2497,7 @@ wxDataViewItem wxDataViewTreeStore::AppendItem( const wxDataViewItem& parent,
wxDataViewTreeStoreNode *node = wxDataViewTreeStoreNode *node =
new wxDataViewTreeStoreNode( parent_node, text, icon, data ); new wxDataViewTreeStoreNode( parent_node, text, icon, data );
parent_node->GetChildren().Append( node ); parent_node->GetChildren().push_back( node );
return node->GetItem(); return node->GetItem();
} }
@@ -2489,7 +2510,8 @@ wxDataViewItem wxDataViewTreeStore::PrependItem( const wxDataViewItem& parent,
wxDataViewTreeStoreNode *node = wxDataViewTreeStoreNode *node =
new wxDataViewTreeStoreNode( parent_node, text, icon, data ); new wxDataViewTreeStoreNode( parent_node, text, icon, data );
parent_node->GetChildren().Insert( node ); wxDataViewTreeStoreNodes& children = parent_node->GetChildren();
children.insert(children.begin(), node);
return node->GetItem(); return node->GetItem();
} }
@@ -2505,12 +2527,13 @@ wxDataViewTreeStore::InsertItem(const wxDataViewItem& parent,
if (!parent_node) return wxDataViewItem(0); if (!parent_node) return wxDataViewItem(0);
wxDataViewTreeStoreNode *previous_node = FindNode( previous ); wxDataViewTreeStoreNode *previous_node = FindNode( previous );
int pos = parent_node->GetChildren().IndexOf( previous_node ); wxDataViewTreeStoreNodes& children = parent_node->GetChildren();
if (pos == wxNOT_FOUND) return wxDataViewItem(0); const wxDataViewTreeStoreNodes::iterator iter = parent_node->FindChild( previous_node );
if (iter == children.end()) return wxDataViewItem(0);
wxDataViewTreeStoreNode *node = wxDataViewTreeStoreNode *node =
new wxDataViewTreeStoreNode( parent_node, text, icon, data ); new wxDataViewTreeStoreNode( parent_node, text, icon, data );
parent_node->GetChildren().Insert( (size_t) pos, node ); children.insert(iter, node);
return node->GetItem(); return node->GetItem();
} }
@@ -2524,7 +2547,8 @@ wxDataViewItem wxDataViewTreeStore::PrependContainer( const wxDataViewItem& pare
wxDataViewTreeStoreContainerNode *node = wxDataViewTreeStoreContainerNode *node =
new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data ); new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data );
parent_node->GetChildren().Insert( node ); wxDataViewTreeStoreNodes& children = parent_node->GetChildren();
children.insert(children.begin(), node);
return node->GetItem(); return node->GetItem();
} }
@@ -2541,7 +2565,7 @@ wxDataViewTreeStore::AppendContainer(const wxDataViewItem& parent,
wxDataViewTreeStoreContainerNode *node = wxDataViewTreeStoreContainerNode *node =
new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data ); new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data );
parent_node->GetChildren().Append( node ); parent_node->GetChildren().push_back( node );
return node->GetItem(); return node->GetItem();
} }
@@ -2558,12 +2582,13 @@ wxDataViewTreeStore::InsertContainer(const wxDataViewItem& parent,
if (!parent_node) return wxDataViewItem(0); if (!parent_node) return wxDataViewItem(0);
wxDataViewTreeStoreNode *previous_node = FindNode( previous ); wxDataViewTreeStoreNode *previous_node = FindNode( previous );
int pos = parent_node->GetChildren().IndexOf( previous_node ); wxDataViewTreeStoreNodes& children = parent_node->GetChildren();
if (pos == wxNOT_FOUND) return wxDataViewItem(0); const wxDataViewTreeStoreNodes::iterator iter = parent_node->FindChild( previous_node );
if (iter == children.end()) return wxDataViewItem(0);
wxDataViewTreeStoreContainerNode *node = wxDataViewTreeStoreContainerNode *node =
new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data ); new wxDataViewTreeStoreContainerNode( parent_node, text, icon, expanded, data );
parent_node->GetChildren().Insert( (size_t) pos, node ); children.insert(iter, node);
return node->GetItem(); return node->GetItem();
} }
@@ -2581,7 +2606,7 @@ wxDataViewItem wxDataViewTreeStore::GetNthChild( const wxDataViewItem& parent, u
wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent );
if (!parent_node) return wxDataViewItem(0); if (!parent_node) return wxDataViewItem(0);
wxDataViewTreeStoreNodeList::compatibility_iterator node = parent_node->GetChildren().Item( pos ); wxDataViewTreeStoreNode* const node = parent_node->GetChildren()[pos];
if (node) if (node)
return wxDataViewItem(node->GetData()); return wxDataViewItem(node->GetData());
@@ -2597,7 +2622,7 @@ int wxDataViewTreeStore::GetChildCount( const wxDataViewItem& parent ) const
return 0; return 0;
wxDataViewTreeStoreContainerNode *container_node = (wxDataViewTreeStoreContainerNode*) node; wxDataViewTreeStoreContainerNode *container_node = (wxDataViewTreeStoreContainerNode*) node;
return (int) container_node->GetChildren().GetCount(); return (int) container_node->GetChildren().size();
} }
void wxDataViewTreeStore::SetItemText( const wxDataViewItem& item, const wxString &text ) void wxDataViewTreeStore::SetItemText( const wxDataViewItem& item, const wxString &text )
@@ -2673,7 +2698,13 @@ void wxDataViewTreeStore::DeleteItem( const wxDataViewItem& item )
wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent_item ); wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent_item );
if (!parent_node) return; if (!parent_node) return;
parent_node->GetChildren().DeleteObject( FindNode(item) ); const wxDataViewTreeStoreNodes::iterator
iter = parent_node->FindChild(FindNode(item));
if ( iter != parent_node->GetChildren().end() )
{
delete *iter;
parent_node->GetChildren().erase(iter);
}
} }
void wxDataViewTreeStore::DeleteChildren( const wxDataViewItem& item ) void wxDataViewTreeStore::DeleteChildren( const wxDataViewItem& item )
@@ -2681,7 +2712,7 @@ void wxDataViewTreeStore::DeleteChildren( const wxDataViewItem& item )
wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
if (!node) return; if (!node) return;
node->GetChildren().clear(); node->DestroyChildren();
} }
void wxDataViewTreeStore::DeleteAllItems() void wxDataViewTreeStore::DeleteAllItems()
@@ -2751,14 +2782,14 @@ unsigned int wxDataViewTreeStore::GetChildren( const wxDataViewItem &item, wxDat
wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); wxDataViewTreeStoreContainerNode *node = FindContainerNode( item );
if (!node) return 0; if (!node) return 0;
wxDataViewTreeStoreNodeList::iterator iter; wxDataViewTreeStoreNodes::iterator iter;
for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); ++iter) for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); ++iter)
{ {
wxDataViewTreeStoreNode* child = *iter; wxDataViewTreeStoreNode* child = *iter;
children.Add( child->GetItem() ); children.Add( child->GetItem() );
} }
return node->GetChildren().GetCount(); return node->GetChildren().size();
} }
int wxDataViewTreeStore::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, int wxDataViewTreeStore::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
@@ -2767,13 +2798,13 @@ int wxDataViewTreeStore::Compare( const wxDataViewItem &item1, const wxDataViewI
wxDataViewTreeStoreNode *node1 = FindNode( item1 ); wxDataViewTreeStoreNode *node1 = FindNode( item1 );
wxDataViewTreeStoreNode *node2 = FindNode( item2 ); wxDataViewTreeStoreNode *node2 = FindNode( item2 );
if (!node1 || !node2) if (!node1 || !node2 || (node1 == node2))
return 0; return 0;
wxDataViewTreeStoreContainerNode* const parent = wxDataViewTreeStoreContainerNode* const parent =
(wxDataViewTreeStoreContainerNode*) node1->GetParent(); (wxDataViewTreeStoreContainerNode*) node1->GetParent();
wxCHECK_MSG( node2->GetParent() == parent, 0 wxCHECK_MSG( node2->GetParent() == parent, 0,
wxS("Comparing items with different parent.") ); wxS("Comparing items with different parent.") );
if (node1->IsContainer() && !node2->IsContainer()) if (node1->IsContainer() && !node2->IsContainer())
@@ -2782,7 +2813,18 @@ int wxDataViewTreeStore::Compare( const wxDataViewItem &item1, const wxDataViewI
if (node2->IsContainer() && !node1->IsContainer()) if (node2->IsContainer() && !node1->IsContainer())
return 1; return 1;
return parent1->GetChildren().IndexOf( node1 ) - parent2->GetChildren().IndexOf( node2 ); wxDataViewTreeStoreNodes::const_iterator iter;
for (iter = parent->GetChildren().begin(); iter != parent->GetChildren().end(); ++iter)
{
if ( *iter == node1 )
return -1;
if ( *iter == node2 )
return 1;
}
wxFAIL_MSG(wxS("Unreachable"));
return 0;
} }
wxDataViewTreeStoreNode *wxDataViewTreeStore::FindNode( const wxDataViewItem &item ) const wxDataViewTreeStoreNode *wxDataViewTreeStore::FindNode( const wxDataViewItem &item ) const
@@ -2951,7 +2993,7 @@ void wxDataViewTreeCtrl::DeleteChildren( const wxDataViewItem& item )
if (!node) return; if (!node) return;
wxDataViewItemArray array; wxDataViewItemArray array;
wxDataViewTreeStoreNodeList::iterator iter; wxDataViewTreeStoreNodes::iterator iter;
for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); ++iter) for (iter = node->GetChildren().begin(); iter != node->GetChildren().end(); ++iter)
{ {
wxDataViewTreeStoreNode* child = *iter; wxDataViewTreeStoreNode* child = *iter;