Browse Source

Allow selection of multiple consecutive blocks in SelectingItemsControl. (#16907)

* Stop Selection.Clear() when selecting a range to enable multiple consecutive blocks to be selected.

* Reinstated Selection.Clear() when range is true and toggleModifier is false.
When range and toggleModifier are true, consecutive ranges are selected.
Added new unit test.
pull/17021/head
Brubning 2 years ago
committed by GitHub
parent
commit
3858a7214b
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 5
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  2. 30
      tests/Avalonia.Controls.UnitTests/ListBoxTests_Multiple.cs

5
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@ -817,7 +817,10 @@ namespace Avalonia.Controls.Primitives
else if (range)
{
using var operation = Selection.BatchUpdate();
Selection.Clear();
if (!toggleModifier)
{
Selection.Clear();
}
Selection.SelectRange(Selection.AnchorIndex, index);
}
else if (!fromFocus && toggle)

30
tests/Avalonia.Controls.UnitTests/ListBoxTests_Multiple.cs

@ -167,6 +167,36 @@ namespace Avalonia.Controls.UnitTests
}
}
[Fact]
public void ToggleModifier_And_Range_Should_Select_Second_Range()
{
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
{
var target = new ListBox
{
Template = new FuncControlTemplate(CreateListBoxTemplate),
ItemsSource = new[] { "Foo", "Bar", "Baz", "Gap", "Boo", "Far", "Faz" },
SelectionMode = SelectionMode.Multiple,
Width = 100,
Height = 100,
};
var root = new TestRoot(target);
root.LayoutManager.ExecuteInitialLayoutPass();
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
// Select first range
_helper.Click(target.Presenter.Panel.Children[0]);
_helper.Click(target.Presenter.Panel.Children[2], modifiers: KeyModifiers.Shift);
// Select second range
_helper.Click(target.Presenter.Panel.Children[4], modifiers: KeyModifiers.Control);
_helper.Click(target.Presenter.Panel.Children[6], modifiers: KeyModifiers.Control | KeyModifiers.Shift);
Assert.Equal(new[] { "Foo", "Bar", "Baz", "Boo", "Far", "Faz" }, target.SelectedItems);
}
}
[Fact]
public void Should_Ctrl_Select_Correct_Item_When_Duplicate_Items_Are_Present()
{

Loading…
Cancel
Save