Skip to content

Commit f811e98

Browse files
committed
Fix #85 crash when removing TreeView from Box
- Set all of the child node parent is root node. Signed-off-by: jiajia_deng <[email protected]>
1 parent b0f2e45 commit f811e98

File tree

2 files changed

+26
-23
lines changed

2 files changed

+26
-23
lines changed

tool_kits/duilib/Control/TreeView.cpp

+25-22
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ TreeNode::TreeNode() :
1010
m_pTreeView(nullptr),
1111
m_pParentTreeNode(nullptr),
1212
m_iDepth(ROOT_NODE_DEPTH),
13-
mTreeNodes()
13+
m_aTreeNodes()
1414
{
1515

1616
}
@@ -37,9 +37,12 @@ void TreeNode::SetInternVisible(bool bVisible)
3737

3838
void TreeNode::SetWindow(Window* pManager, Box* pParent, bool bInit)
3939
{
40-
for (auto it = mTreeNodes.begin(); it != mTreeNodes.end(); it++)
40+
for (auto it = m_aTreeNodes.begin(); it != m_aTreeNodes.end(); it++)
4141
{
42-
(*it)->SetWindow(pManager, this, bInit);
42+
// 将所有子控件的父节点(GetParent)都设置为 TreeView 中隐藏的 TreeNode
43+
// 在 TreeView 递归销毁子控件时不会因为获取不到父容器指针而崩溃
44+
// RootNode 是一个智能指针,在 TreeView 完全销毁以后会自动销毁
45+
(*it)->SetWindow(pManager, m_pTreeView->GetRootNode(), bInit);
4346
}
4447

4548
ListContainerElement::SetWindow(pManager, pParent, bInit);
@@ -75,8 +78,8 @@ bool TreeNode::AddChildNode(TreeNode* pTreeNode)
7578

7679
bool TreeNode::AddChildNodeAt(TreeNode* pTreeNode, std::size_t iIndex)
7780
{
78-
if( iIndex < 0 || iIndex > mTreeNodes.size() ) return false;
79-
mTreeNodes.insert(mTreeNodes.begin() + iIndex, pTreeNode);
81+
if( iIndex < 0 || iIndex > m_aTreeNodes.size() ) return false;
82+
m_aTreeNodes.insert(m_aTreeNodes.begin() + iIndex, pTreeNode);
8083

8184
pTreeNode->m_iDepth = m_iDepth + 1;
8285
pTreeNode->SetParentNode(this);
@@ -95,50 +98,50 @@ bool TreeNode::AddChildNodeAt(TreeNode* pTreeNode, std::size_t iIndex)
9598
std::size_t nGlobalIndex = iIndex;
9699
for (std::size_t i = 0; i < iIndex; i++)
97100
{
98-
nGlobalIndex += ((TreeNode*)mTreeNodes[i])->GetDescendantNodeCount();
101+
nGlobalIndex += ((TreeNode*)m_aTreeNodes[i])->GetDescendantNodeCount();
99102
}
100103

101104
return m_pTreeView->ListBox::AddAt(pTreeNode, (int)(nodeIndex + nGlobalIndex + 1));
102105
}
103106

104107
bool TreeNode::RemoveChildNodeAt(std::size_t iIndex)
105108
{
106-
if (iIndex < 0 || iIndex >= mTreeNodes.size()) {
109+
if (iIndex < 0 || iIndex >= m_aTreeNodes.size()) {
107110
return false;
108111
}
109112

110-
TreeNode* pTreeNode = ((TreeNode*)mTreeNodes[iIndex]);
111-
mTreeNodes.erase(mTreeNodes.begin() + iIndex);
113+
TreeNode* pTreeNode = ((TreeNode*)m_aTreeNodes[iIndex]);
114+
m_aTreeNodes.erase(m_aTreeNodes.begin() + iIndex);
112115

113116
return pTreeNode->RemoveSelf();
114117
}
115118

116119
bool TreeNode::RemoveChildNode(TreeNode* pTreeNode)
117120
{
118-
auto it = std::find(mTreeNodes.begin(), mTreeNodes.end(), pTreeNode);
119-
if (it == mTreeNodes.end()) {
121+
auto it = std::find(m_aTreeNodes.begin(), m_aTreeNodes.end(), pTreeNode);
122+
if (it == m_aTreeNodes.end()) {
120123
return false;
121124
}
122125

123-
int iIndex = it - mTreeNodes.begin();
126+
int iIndex = it - m_aTreeNodes.begin();
124127
return RemoveChildNodeAt(iIndex);
125128
}
126129

127130
void TreeNode::RemoveAllChildNode()
128131
{
129-
while (mTreeNodes.size() > 0)
132+
while (m_aTreeNodes.size() > 0)
130133
{
131134
RemoveChildNodeAt(0);
132135
}
133136
}
134137

135138
bool TreeNode::RemoveSelf()
136139
{
137-
for( auto it = mTreeNodes.begin(); it != mTreeNodes.end(); it++ )
140+
for( auto it = m_aTreeNodes.begin(); it != m_aTreeNodes.end(); it++ )
138141
{
139142
(*it)->RemoveSelf();
140143
}
141-
mTreeNodes.clear();
144+
m_aTreeNodes.clear();
142145

143146
if (m_iDepth != ROOT_NODE_DEPTH) {
144147
return m_pTreeView->ListBox::RemoveAt(GetIndex());
@@ -150,7 +153,7 @@ bool TreeNode::RemoveSelf()
150153
int TreeNode::GetDescendantNodeCount()
151154
{
152155
int nodeCount = (int)GetChildNodeCount();
153-
for( auto it = mTreeNodes.begin(); it != mTreeNodes.end(); it++ )
156+
for( auto it = m_aTreeNodes.begin(); it != m_aTreeNodes.end(); it++ )
154157
{
155158
nodeCount += (*it)->GetDescendantNodeCount();
156159
}
@@ -160,22 +163,22 @@ int TreeNode::GetDescendantNodeCount()
160163

161164
std::size_t TreeNode::GetChildNodeCount()
162165
{
163-
return mTreeNodes.size();
166+
return m_aTreeNodes.size();
164167
}
165168

166169
TreeNode* TreeNode::GetChildNode(std::size_t iIndex)
167170
{
168-
if( iIndex < 0 || iIndex >= mTreeNodes.size() ) return NULL;
169-
return static_cast<TreeNode*>(mTreeNodes[iIndex]);
171+
if( iIndex < 0 || iIndex >= m_aTreeNodes.size() ) return NULL;
172+
return static_cast<TreeNode*>(m_aTreeNodes[iIndex]);
170173
}
171174

172175
int TreeNode::GetChildNodeIndex(TreeNode* pTreeNode)
173176
{
174-
auto it = std::find(mTreeNodes.begin(), mTreeNodes.end(), pTreeNode);
175-
if (it == mTreeNodes.end()) {
177+
auto it = std::find(m_aTreeNodes.begin(), m_aTreeNodes.end(), pTreeNode);
178+
if (it == m_aTreeNodes.end()) {
176179
return -1;
177180
}
178-
return it - mTreeNodes.begin();
181+
return it - m_aTreeNodes.begin();
179182
}
180183

181184
bool TreeNode::IsExpand() const

tool_kits/duilib/Control/TreeView.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class UILIB_API TreeNode : public ListContainerElement
140140
bool m_bExpand;
141141
TreeView *m_pTreeView;
142142
TreeNode *m_pParentTreeNode;
143-
std::vector<TreeNode*> mTreeNodes;
143+
std::vector<TreeNode*> m_aTreeNodes;
144144
};
145145

146146
class UILIB_API TreeView : public ListBox

0 commit comments

Comments
 (0)