Skip to content

Commit

Permalink
Revert "Fix #85 crash when removing TreeView from Box"
Browse files Browse the repository at this point in the history
This reverts commit f811e98.

Signed-off-by: jiajia_deng <2894220@gmail.com>
  • Loading branch information
nmgwddj committed Jul 25, 2019
1 parent 78e3db2 commit a59b15c
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 26 deletions.
47 changes: 22 additions & 25 deletions tool_kits/duilib/Control/TreeView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ TreeNode::TreeNode() :
m_pTreeView(nullptr),
m_pParentTreeNode(nullptr),
m_iDepth(ROOT_NODE_DEPTH),
m_aTreeNodes()
mTreeNodes()
{

}
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -98,50 +95,50 @@ 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));
}

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);
}
}

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());
Expand All @@ -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();
}
Expand All @@ -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<TreeNode*>(m_aTreeNodes[iIndex]);
if( iIndex < 0 || iIndex >= mTreeNodes.size() ) return NULL;
return static_cast<TreeNode*>(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
Expand Down
2 changes: 1 addition & 1 deletion tool_kits/duilib/Control/TreeView.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class UILIB_API TreeNode : public ListContainerElement
bool m_bExpand;
TreeView *m_pTreeView;
TreeNode *m_pParentTreeNode;
std::vector<TreeNode*> m_aTreeNodes;
std::vector<TreeNode*> mTreeNodes;
};

class UILIB_API TreeView : public ListBox
Expand Down

0 comments on commit a59b15c

Please sign in to comment.