|
|
|
@ -11,7 +11,6 @@ using Avalonia.Data; |
|
|
|
using Avalonia.Data.Core; |
|
|
|
using Avalonia.Input; |
|
|
|
using Avalonia.LogicalTree; |
|
|
|
using Avalonia.Markup.Data; |
|
|
|
using Avalonia.UnitTests; |
|
|
|
using Xunit; |
|
|
|
|
|
|
|
@ -147,7 +146,7 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
var target = new TreeView |
|
|
|
{ |
|
|
|
Template = CreateTreeViewTemplate(), |
|
|
|
Items = tree, |
|
|
|
Items = tree |
|
|
|
}; |
|
|
|
|
|
|
|
var visualRoot = new TestRoot(); |
|
|
|
@ -183,7 +182,7 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
var target = new TreeView |
|
|
|
{ |
|
|
|
Template = CreateTreeViewTemplate(), |
|
|
|
Items = tree, |
|
|
|
Items = tree |
|
|
|
}; |
|
|
|
|
|
|
|
var visualRoot = new TestRoot(); |
|
|
|
@ -218,7 +217,46 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Clicking_WithShiftModifier_Should_Select_Range_Of_Items() |
|
|
|
public void Clicking_WithControlModifier_Selected_Item_Should_Deselect_And_Remove_From_SelectedItems() |
|
|
|
{ |
|
|
|
var tree = CreateTestTreeData(); |
|
|
|
var target = new TreeView |
|
|
|
{ |
|
|
|
Template = CreateTreeViewTemplate(), |
|
|
|
Items = tree, |
|
|
|
SelectionMode = SelectionMode.Multiple |
|
|
|
}; |
|
|
|
|
|
|
|
var visualRoot = new TestRoot(); |
|
|
|
visualRoot.Child = target; |
|
|
|
|
|
|
|
CreateNodeDataTemplate(target); |
|
|
|
ApplyTemplates(target); |
|
|
|
|
|
|
|
var rootNode = tree[0]; |
|
|
|
|
|
|
|
var item1 = rootNode.Children[0]; |
|
|
|
var item2 = rootNode.Children.Last(); |
|
|
|
|
|
|
|
var item1Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1); |
|
|
|
var item2Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2); |
|
|
|
|
|
|
|
TreeTestHelper.ClickContainer(item1Container, InputModifiers.Control); |
|
|
|
Assert.True(item1Container.IsSelected); |
|
|
|
|
|
|
|
TreeTestHelper.ClickContainer(item2Container, InputModifiers.Control); |
|
|
|
Assert.True(item2Container.IsSelected); |
|
|
|
|
|
|
|
Assert.Equal(new[] {item1, item2}, target.SelectedItems.OfType<Node>()); |
|
|
|
|
|
|
|
TreeTestHelper.ClickContainer(item1Container, InputModifiers.Control); |
|
|
|
Assert.False(item1Container.IsSelected); |
|
|
|
|
|
|
|
Assert.DoesNotContain(item1, target.SelectedItems.OfType<Node>()); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Clicking_WithShiftModifier_DownDirection_Should_Select_Range_Of_Items() |
|
|
|
{ |
|
|
|
var tree = CreateTestTreeData(); |
|
|
|
var target = new TreeView |
|
|
|
@ -242,45 +280,92 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); |
|
|
|
var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); |
|
|
|
|
|
|
|
void ClickContainer(IControl container, InputModifiers modifiers) |
|
|
|
{ |
|
|
|
container.RaiseEvent(new PointerPressedEventArgs |
|
|
|
{ |
|
|
|
RoutedEvent = InputElement.PointerPressedEvent, |
|
|
|
MouseButton = MouseButton.Left, |
|
|
|
InputModifiers = modifiers |
|
|
|
}); |
|
|
|
} |
|
|
|
TreeTestHelper.ClickContainer(fromContainer, InputModifiers.None); |
|
|
|
|
|
|
|
void AssertChildrenSelected() |
|
|
|
Assert.True(fromContainer.IsSelected); |
|
|
|
|
|
|
|
TreeTestHelper.ClickContainer(toContainer, InputModifiers.Shift); |
|
|
|
TreeTestHelper.AssertChildrenSelected(target, rootNode); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Clicking_WithShiftModifier_UpDirection_Should_Select_Range_Of_Items() |
|
|
|
{ |
|
|
|
var tree = CreateTestTreeData(); |
|
|
|
var target = new TreeView |
|
|
|
{ |
|
|
|
foreach (var child in rootNode.Children) |
|
|
|
{ |
|
|
|
var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(child); |
|
|
|
Template = CreateTreeViewTemplate(), |
|
|
|
Items = tree, |
|
|
|
SelectionMode = SelectionMode.Multiple |
|
|
|
}; |
|
|
|
|
|
|
|
Assert.True(container.IsSelected); |
|
|
|
} |
|
|
|
} |
|
|
|
var visualRoot = new TestRoot(); |
|
|
|
visualRoot.Child = target; |
|
|
|
|
|
|
|
CreateNodeDataTemplate(target); |
|
|
|
ApplyTemplates(target); |
|
|
|
|
|
|
|
var rootNode = tree[0]; |
|
|
|
|
|
|
|
var from = rootNode.Children.Last(); |
|
|
|
var to = rootNode.Children[0]; |
|
|
|
|
|
|
|
// Top to down
|
|
|
|
ClickContainer(fromContainer, InputModifiers.None); |
|
|
|
var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); |
|
|
|
var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); |
|
|
|
|
|
|
|
TreeTestHelper.ClickContainer(fromContainer, InputModifiers.None); |
|
|
|
|
|
|
|
Assert.True(fromContainer.IsSelected); |
|
|
|
|
|
|
|
ClickContainer(toContainer, InputModifiers.Shift); |
|
|
|
TreeTestHelper.ClickContainer(toContainer, InputModifiers.Shift); |
|
|
|
TreeTestHelper.AssertChildrenSelected(target, rootNode); |
|
|
|
} |
|
|
|
|
|
|
|
AssertChildrenSelected(); |
|
|
|
[Fact] |
|
|
|
public void Clicking_First_Item_Of_SelectedItems_Should_Select_Only_It() |
|
|
|
{ |
|
|
|
var tree = CreateTestTreeData(); |
|
|
|
var target = new TreeView |
|
|
|
{ |
|
|
|
Template = CreateTreeViewTemplate(), |
|
|
|
Items = tree, |
|
|
|
SelectionMode = SelectionMode.Multiple |
|
|
|
}; |
|
|
|
|
|
|
|
var visualRoot = new TestRoot(); |
|
|
|
visualRoot.Child = target; |
|
|
|
|
|
|
|
CreateNodeDataTemplate(target); |
|
|
|
ApplyTemplates(target); |
|
|
|
|
|
|
|
// Down to up
|
|
|
|
target.SelectedItem = null; |
|
|
|
var rootNode = tree[0]; |
|
|
|
|
|
|
|
ClickContainer(toContainer, InputModifiers.None); |
|
|
|
var from = rootNode.Children.Last(); |
|
|
|
var to = rootNode.Children[0]; |
|
|
|
|
|
|
|
Assert.True(toContainer.IsSelected); |
|
|
|
var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); |
|
|
|
var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); |
|
|
|
|
|
|
|
ClickContainer(fromContainer, InputModifiers.Shift); |
|
|
|
TreeTestHelper.ClickContainer(fromContainer, InputModifiers.None); |
|
|
|
|
|
|
|
AssertChildrenSelected(); |
|
|
|
TreeTestHelper.ClickContainer(toContainer, InputModifiers.Shift); |
|
|
|
TreeTestHelper.AssertChildrenSelected(target, rootNode); |
|
|
|
|
|
|
|
TreeTestHelper.ClickContainer(fromContainer, InputModifiers.None); |
|
|
|
|
|
|
|
Assert.True(fromContainer.IsSelected); |
|
|
|
|
|
|
|
foreach (var child in rootNode.Children) |
|
|
|
{ |
|
|
|
if (child == from) |
|
|
|
{ |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(child); |
|
|
|
|
|
|
|
Assert.False(container.IsSelected); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
@ -309,7 +394,6 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
Assert.True(container.IsSelected); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Setting_SelectedItem_Should_Raise_SelectedItemChanged_Event() |
|
|
|
{ |
|
|
|
@ -585,7 +669,7 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
new Node |
|
|
|
{ |
|
|
|
Value = "Child3", |
|
|
|
}, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
@ -658,6 +742,29 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static class TreeTestHelper |
|
|
|
{ |
|
|
|
public static void ClickContainer(IControl container, InputModifiers modifiers) |
|
|
|
{ |
|
|
|
container.RaiseEvent(new PointerPressedEventArgs |
|
|
|
{ |
|
|
|
RoutedEvent = InputElement.PointerPressedEvent, |
|
|
|
MouseButton = MouseButton.Left, |
|
|
|
InputModifiers = modifiers |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
public static void AssertChildrenSelected(TreeView treeView, Node rootNode) |
|
|
|
{ |
|
|
|
foreach (var child in rootNode.Children) |
|
|
|
{ |
|
|
|
var container = (TreeViewItem)treeView.ItemContainerGenerator.Index.ContainerFromItem(child); |
|
|
|
|
|
|
|
Assert.True(container.IsSelected); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private class Node : NotifyingBase |
|
|
|
{ |
|
|
|
private IAvaloniaList<Node> _children; |
|
|
|
|