]> git.saurik.com Git - wxWidgets.git/commitdiff
Add items to correct position in wxDataViewCtrl:ItemAdded.
authorVáclav Slavík <vslavik@fastmail.fm>
Wed, 31 Aug 2011 09:36:27 +0000 (09:36 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Wed, 31 Aug 2011 09:36:27 +0000 (09:36 +0000)
In both the generic and GTK+ versions, ItemAdded() always appended the
new item, regardless of its position among its siblings  in the model.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68965 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/generic/datavgen.cpp
src/gtk/dataview.cpp

index 32f9ee47ac492255beef7d1a2aff06b0b1f44883..9959c748fff7321eb8d85df6d4e297e64580f862 100644 (file)
@@ -321,12 +321,13 @@ public:
         return m_branchData->children;
     }
 
-    void AddChild( wxDataViewTreeNode * node )
+    void InsertChild(wxDataViewTreeNode *node, unsigned index)
     {
         if ( !m_branchData )
             m_branchData = new BranchNodeData;
 
-        m_branchData->children.Add( node );
+        m_branchData->children.Insert(node, index);
+
         // TODO: insert into sorted array directly in O(log n) instead of resorting in O(n log n)
         if (g_column >= -1)
             m_branchData->children.Sort( &wxGenericTreeModelNodeCmp );
@@ -2024,11 +2025,16 @@ bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxData
         if ( !parentNode )
             return false;
 
+        wxDataViewItemArray siblings;
+        GetModel()->GetChildren(parent, siblings);
+        int itemPos = siblings.Index(item, /*fromEnd=*/true);
+        wxCHECK_MSG( itemPos != wxNOT_FOUND, false, "adding non-existent item?" );
+
         wxDataViewTreeNode *itemNode = new wxDataViewTreeNode(parentNode, item);
         itemNode->SetHasChildren(GetModel()->IsContainer(item));
 
         parentNode->SetHasChildren(true);
-        parentNode->AddChild(itemNode);
+        parentNode->InsertChild(itemNode, itemPos);
         parentNode->ChangeSubTreeCount(+1);
 
         m_count = -1;
@@ -3257,7 +3263,7 @@ static void BuildTreeHelper( const wxDataViewModel * model,  const wxDataViewIte
         if( model->IsContainer(children[index]) )
             n->SetHasChildren( true );
 
-        node->AddChild(n);
+        node->InsertChild(n, index);
     }
 
     wxASSERT( node->IsOpen() );
index 51713e1c48e3a41a51d7b23f46166439af65b8a0..9c0115e8441c981a0aae3e798082d422d65d2556 100644 (file)
@@ -352,7 +352,7 @@ public:
         }
     }
 
-    unsigned int AddNode( wxGtkTreeModelNode* child )
+    void AddNode( wxGtkTreeModelNode* child )
         {
             m_nodes.Add( child );
 
@@ -364,24 +364,50 @@ public:
             {
                 gs_internal = m_internal;
                 m_children.Sort( &wxGtkTreeModelChildCmp );
-                return m_children.Index( id );
+            }
+        }
+
+    void InsertNode( wxGtkTreeModelNode* child, unsigned pos )
+        {
+            if (m_internal->IsSorted() || m_internal->GetDataViewModel()->HasDefaultCompare())
+            {
+                AddNode(child);
+                return;
             }
 
-            return m_children.GetCount()-1;
+            void *id = child->GetItem().GetID();
+
+            // Insert into m_nodes so that the order of nodes in m_nodes is the
+            // same as the order of their corresponding IDs in m_children:
+            const unsigned int count = m_nodes.GetCount();
+            for (unsigned i = 0; i < count; i++)
+            {
+                wxGtkTreeModelNode *node = m_nodes[i];
+                int posInChildren = m_children.Index(node->GetItem().GetID());
+                if ( (unsigned)posInChildren >= pos )
+                {
+                    m_nodes.Insert(child, i);
+                    break;
+                }
+            }
+
+            m_children.Insert( id, pos );
         }
 
-    unsigned int AddLeave( void* id )
+    void AddLeaf( void* id )
         {
-            m_children.Add( id );
+            InsertLeaf(id, m_children.size());
+        }
+
+    void InsertLeaf( void* id, unsigned pos )
+        {
+            m_children.Insert( id, pos );
 
             if (m_internal->IsSorted() || m_internal->GetDataViewModel()->HasDefaultCompare())
             {
                 gs_internal = m_internal;
                 m_children.Sort( &wxGtkTreeModelChildCmp );
-                return m_children.Index( id );
             }
-
-            return m_children.GetCount()-1;
         }
 
     void DeleteChild( void* id )
@@ -3574,7 +3600,7 @@ void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node )
             if (m_wx_model->IsContainer( child ))
                 node->AddNode( new wxGtkTreeModelNode( node, child, this ) );
             else
-                node->AddLeave( child.GetID() );
+                node->AddLeaf( child.GetID() );
 
             // Don't send any events here
         }
@@ -3761,13 +3787,18 @@ bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDa
     if (!m_wx_model->IsVirtualListModel())
     {
         wxGtkTreeModelNode *parent_node = FindNode( parent );
-        wxASSERT_MSG(parent_node,
+        wxCHECK_MSG(parent_node, false,
             "Did you forget a call to ItemAdded()? The parent node is unknown to the wxGtkTreeModel");
 
+        wxDataViewItemArray siblings;
+        m_wx_model->GetChildren(parent, siblings);
+        int itemPos = siblings.Index(item, /*fromEnd=*/true);
+        wxCHECK_MSG( itemPos != wxNOT_FOUND, false, "adding non-existent item?" );
+
         if (m_wx_model->IsContainer( item ))
-            parent_node->AddNode( new wxGtkTreeModelNode( parent_node, item, this ) );
+            parent_node->InsertNode( new wxGtkTreeModelNode( parent_node, item, this ), itemPos );
         else
-            parent_node->AddLeave( item.GetID() );
+            parent_node->InsertLeaf( item.GetID(), itemPos );
     }
 
     ScheduleRefresh();