Skip to content

Commit

Permalink
TreeView: Set IsExpanded when last child has been removed (#2449)
Browse files Browse the repository at this point in the history
* Add test for IsExpanded not being set to false when removing last child

* Fix issue with setting IsExpanded not to false when removing last child

* Fix test failures

* Fix test
  • Loading branch information
marcelwgn authored and ranjeshj committed Jul 7, 2020
1 parent 180f212 commit 0a12fab
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 6 deletions.
43 changes: 43 additions & 0 deletions dev/TreeView/APITests/TreeViewTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -667,6 +667,49 @@ public void TreeViewSelectionChangedMultipleMode()
});
}

[TestMethod]
public void RemovingLastChildrenSetsIsExpandedToFalse()
{
RunOnUIThread.Execute(() =>
{
var treeViewRoot = new TreeViewNode();
var treeViewNode1 = new TreeViewNode();
var treeViewNode2 = new TreeViewNode();
var treeViewNode3 = new TreeViewNode();
var treeViewNode4 = new TreeViewNode();
var treeViewNode5 = new TreeViewNode();

// Need root since in TreeView we otherwise
// could collapse whole tree and hide it forever
treeViewRoot.Children.Add(treeViewNode1);

treeViewNode1.Children.Add(treeViewNode2);
treeViewNode1.Children.Add(treeViewNode3);
treeViewNode1.Children.Add(treeViewNode4);
treeViewNode1.Children.Add(treeViewNode5);

treeViewNode1.IsExpanded = true;
Verify.IsTrue(treeViewNode1.IsExpanded);

treeViewNode1.Children.Clear();
Verify.IsFalse(treeViewNode1.IsExpanded);

treeViewNode1.Children.Add(treeViewNode2);
treeViewNode1.IsExpanded = true;
Verify.IsTrue(treeViewNode1.IsExpanded);

treeViewNode1.Children.Remove(treeViewNode2);
Verify.IsFalse(treeViewNode1.IsExpanded);

treeViewNode1.Children.Add(treeViewNode2);
treeViewNode1.IsExpanded = true;
Verify.IsTrue(treeViewNode1.IsExpanded);

treeViewNode1.Children.RemoveAt(0);
Verify.IsFalse(treeViewNode1.IsExpanded);
});
}

private bool IsMultiSelectCheckBoxChecked(TreeView tree, TreeViewNode node)
{
var treeViewItem = tree.ContainerFromNode(node) as TreeViewItem;
Expand Down
33 changes: 29 additions & 4 deletions dev/TreeView/TreeViewNode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ void TreeViewNode::SyncChildrenNodesWithItemsSource()
if (!AreChildrenNodesEqualToItemsSource())
{
auto children = winrt::get_self<TreeViewNodeVector>(Children());
children->Clear(false /* updateItemsSource */);
children->Clear(false /* updateItemsSource */, false /* updateIsExpanded */);

auto size = m_itemsDataSource ? m_itemsDataSource.Count() : 0;
for (auto i = 0; i < size; i++)
Expand Down Expand Up @@ -383,11 +383,11 @@ void TreeViewNodeVector::InsertAt(unsigned int index, winrt::TreeViewNode const&

void TreeViewNodeVector::SetAt(unsigned int index, winrt::TreeViewNode const& item, bool updateItemsSource)
{
RemoveAt(index, updateItemsSource);
RemoveAt(index, updateItemsSource,false /* updateIsExpanded */);
InsertAt(index, item, updateItemsSource);
}

void TreeViewNodeVector::RemoveAt(unsigned int index, bool updateItemsSource)
void TreeViewNodeVector::RemoveAt(unsigned int index, bool updateItemsSource,bool updateIsExpanded)
{
auto inner = GetVectorInnerImpl();
auto targetNode = inner->GetAt(index);
Expand All @@ -402,6 +402,19 @@ void TreeViewNodeVector::RemoveAt(unsigned int index, bool updateItemsSource)
source.RemoveAt(index);
}
}

// No children, so close parent if not requested otherwise
if (updateIsExpanded && inner->Size() == 0)
{
if (auto&& ownerNode = m_parent.get())
{
// Only set IsExpanded to false if we are not the root node
if (auto&& ownerParent = ownerNode.Parent())
{
ownerNode.IsExpanded(false);
}
}
}
}

void TreeViewNodeVector::RemoveAtEnd(bool updateItemsSource)
Expand Down Expand Up @@ -435,7 +448,7 @@ void TreeViewNodeVector::ReplaceAll(winrt::array_view<winrt::TreeViewNode const>
}
}

void TreeViewNodeVector::Clear(bool updateItemsSource)
void TreeViewNodeVector::Clear(bool updateItemsSource,bool updateIsExpanded)
{
auto inner = GetVectorInnerImpl();
auto count = inner->Size();
Expand All @@ -458,6 +471,18 @@ void TreeViewNodeVector::Clear(bool updateItemsSource)
}
}
}

if (updateIsExpanded)
{
if(auto&& ownerNode = m_parent.get())
{
// Only set IsExpanded to false if we are not the root node
if (auto&& ownerParent = ownerNode.Parent())
{
ownerNode.IsExpanded(false);
}
}
}
}

#pragma endregion
4 changes: 2 additions & 2 deletions dev/TreeView/TreeViewNode.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@ class TreeViewNodeVector :
void Append(winrt::TreeViewNode const& item, bool updateItemsSource = true);
void InsertAt(unsigned int index, winrt::TreeViewNode const& item, bool updateItemsSource = true);
void SetAt(unsigned int index, winrt::TreeViewNode const& item, bool updateItemsSource = true);
void RemoveAt(unsigned int index, bool updateItemsSource = true);
void RemoveAt(unsigned int index, bool updateItemsSource = true, bool updateIsExpanded = true);
void RemoveAtEnd(bool updateItemsSource = true);
void ReplaceAll(winrt::array_view<winrt::TreeViewNode const> values, bool updateItemsSource = true);
void Clear(bool updateItemsSource = true);
void Clear(bool updateItemsSource = true, bool updateIsExpanded = true);
};

0 comments on commit 0a12fab

Please sign in to comment.