From a59b15c43a523c3a636dc722d10a2786457b5135 Mon Sep 17 00:00:00 2001 From: jiajia_deng <2894220@gmail.com> Date: Thu, 25 Jul 2019 11:42:39 +0800 Subject: [PATCH] Revert "Fix #85 crash when removing TreeView from Box" This reverts commit f811e9836cb6681cdeeebd40621417603264141c. Signed-off-by: jiajia_deng <2894220@gmail.com> --- tool_kits/duilib/Control/TreeView.cpp | 47 +++++++++++++-------------- tool_kits/duilib/Control/TreeView.h | 2 +- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/tool_kits/duilib/Control/TreeView.cpp b/tool_kits/duilib/Control/TreeView.cpp index 9c870b4e..c88040cb 100644 --- a/tool_kits/duilib/Control/TreeView.cpp +++ b/tool_kits/duilib/Control/TreeView.cpp @@ -10,7 +10,7 @@ TreeNode::TreeNode() : m_pTreeView(nullptr), m_pParentTreeNode(nullptr), m_iDepth(ROOT_NODE_DEPTH), - m_aTreeNodes() + mTreeNodes() { } @@ -37,12 +37,9 @@ void TreeNode::SetInternVisible(bool bVisible) void TreeNode::SetWindow(Window* pManager, Box* pParent, bool bInit) { - for (auto it = m_aTreeNodes.begin(); it != m_aTreeNodes.end(); it++) + for (auto it = mTreeNodes.begin(); it != mTreeNodes.end(); it++) { - // 将所有子控件的父节点(GetParent)都设置为 TreeView 中隐藏的 TreeNode - // 在 TreeView 递归销毁子控件时不会因为获取不到父容器指针而崩溃 - // RootNode 是一个智能指针,在 TreeView 完全销毁以后会自动销毁 - (*it)->SetWindow(pManager, m_pTreeView->GetRootNode(), bInit); + (*it)->SetWindow(pManager, this, bInit); } ListContainerElement::SetWindow(pManager, pParent, bInit); @@ -78,8 +75,8 @@ bool TreeNode::AddChildNode(TreeNode* pTreeNode) bool TreeNode::AddChildNodeAt(TreeNode* pTreeNode, std::size_t iIndex) { - if( iIndex < 0 || iIndex > m_aTreeNodes.size() ) return false; - m_aTreeNodes.insert(m_aTreeNodes.begin() + iIndex, pTreeNode); + if( iIndex < 0 || iIndex > mTreeNodes.size() ) return false; + mTreeNodes.insert(mTreeNodes.begin() + iIndex, pTreeNode); pTreeNode->m_iDepth = m_iDepth + 1; pTreeNode->SetParentNode(this); @@ -98,7 +95,7 @@ bool TreeNode::AddChildNodeAt(TreeNode* pTreeNode, std::size_t iIndex) std::size_t nGlobalIndex = iIndex; for (std::size_t i = 0; i < iIndex; i++) { - nGlobalIndex += ((TreeNode*)m_aTreeNodes[i])->GetDescendantNodeCount(); + nGlobalIndex += ((TreeNode*)mTreeNodes[i])->GetDescendantNodeCount(); } return m_pTreeView->ListBox::AddAt(pTreeNode, (int)(nodeIndex + nGlobalIndex + 1)); @@ -106,30 +103,30 @@ bool TreeNode::AddChildNodeAt(TreeNode* pTreeNode, std::size_t iIndex) bool TreeNode::RemoveChildNodeAt(std::size_t iIndex) { - if (iIndex < 0 || iIndex >= m_aTreeNodes.size()) { + if (iIndex < 0 || iIndex >= mTreeNodes.size()) { return false; } - TreeNode* pTreeNode = ((TreeNode*)m_aTreeNodes[iIndex]); - m_aTreeNodes.erase(m_aTreeNodes.begin() + iIndex); + TreeNode* pTreeNode = ((TreeNode*)mTreeNodes[iIndex]); + mTreeNodes.erase(mTreeNodes.begin() + iIndex); return pTreeNode->RemoveSelf(); } bool TreeNode::RemoveChildNode(TreeNode* pTreeNode) { - auto it = std::find(m_aTreeNodes.begin(), m_aTreeNodes.end(), pTreeNode); - if (it == m_aTreeNodes.end()) { + auto it = std::find(mTreeNodes.begin(), mTreeNodes.end(), pTreeNode); + if (it == mTreeNodes.end()) { return false; } - int iIndex = it - m_aTreeNodes.begin(); + int iIndex = it - mTreeNodes.begin(); return RemoveChildNodeAt(iIndex); } void TreeNode::RemoveAllChildNode() { - while (m_aTreeNodes.size() > 0) + while (mTreeNodes.size() > 0) { RemoveChildNodeAt(0); } @@ -137,11 +134,11 @@ void TreeNode::RemoveAllChildNode() bool TreeNode::RemoveSelf() { - for( auto it = m_aTreeNodes.begin(); it != m_aTreeNodes.end(); it++ ) + for( auto it = mTreeNodes.begin(); it != mTreeNodes.end(); it++ ) { (*it)->RemoveSelf(); } - m_aTreeNodes.clear(); + mTreeNodes.clear(); if (m_iDepth != ROOT_NODE_DEPTH) { return m_pTreeView->ListBox::RemoveAt(GetIndex()); @@ -153,7 +150,7 @@ bool TreeNode::RemoveSelf() int TreeNode::GetDescendantNodeCount() { int nodeCount = (int)GetChildNodeCount(); - for( auto it = m_aTreeNodes.begin(); it != m_aTreeNodes.end(); it++ ) + for( auto it = mTreeNodes.begin(); it != mTreeNodes.end(); it++ ) { nodeCount += (*it)->GetDescendantNodeCount(); } @@ -163,22 +160,22 @@ int TreeNode::GetDescendantNodeCount() std::size_t TreeNode::GetChildNodeCount() { - return m_aTreeNodes.size(); + return mTreeNodes.size(); } TreeNode* TreeNode::GetChildNode(std::size_t iIndex) { - if( iIndex < 0 || iIndex >= m_aTreeNodes.size() ) return NULL; - return static_cast(m_aTreeNodes[iIndex]); + if( iIndex < 0 || iIndex >= mTreeNodes.size() ) return NULL; + return static_cast(mTreeNodes[iIndex]); } int TreeNode::GetChildNodeIndex(TreeNode* pTreeNode) { - auto it = std::find(m_aTreeNodes.begin(), m_aTreeNodes.end(), pTreeNode); - if (it == m_aTreeNodes.end()) { + auto it = std::find(mTreeNodes.begin(), mTreeNodes.end(), pTreeNode); + if (it == mTreeNodes.end()) { return -1; } - return it - m_aTreeNodes.begin(); + return it - mTreeNodes.begin(); } bool TreeNode::IsExpand() const diff --git a/tool_kits/duilib/Control/TreeView.h b/tool_kits/duilib/Control/TreeView.h index de601927..2c7c106f 100644 --- a/tool_kits/duilib/Control/TreeView.h +++ b/tool_kits/duilib/Control/TreeView.h @@ -140,7 +140,7 @@ private: bool m_bExpand; TreeView *m_pTreeView; TreeNode *m_pParentTreeNode; - std::vector m_aTreeNodes; + std::vector mTreeNodes; }; class UILIB_API TreeView : public ListBox