|
|
|
@ -1,10 +1,13 @@ |
|
|
|
using System; |
|
|
|
using System.Diagnostics; |
|
|
|
using System.Linq; |
|
|
|
using Avalonia.Automation.Peers; |
|
|
|
using Avalonia.Controls.Metadata; |
|
|
|
using Avalonia.Controls.Primitives; |
|
|
|
using Avalonia.Controls.Selection; |
|
|
|
using Avalonia.Controls.Shapes; |
|
|
|
using Avalonia.Controls.Templates; |
|
|
|
using Avalonia.Controls.Utils; |
|
|
|
using Avalonia.Input; |
|
|
|
using Avalonia.Interactivity; |
|
|
|
using Avalonia.Layout; |
|
|
|
@ -216,7 +219,7 @@ namespace Avalonia.Controls |
|
|
|
} |
|
|
|
else if (e.Key == Key.Up) |
|
|
|
{ |
|
|
|
SelectPrev(); |
|
|
|
SelectPrevious(); |
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -247,7 +250,7 @@ namespace Avalonia.Controls |
|
|
|
if (e.Delta.Y < 0) |
|
|
|
SelectNext(); |
|
|
|
else |
|
|
|
SelectPrev(); |
|
|
|
SelectPrevious(); |
|
|
|
|
|
|
|
e.Handled = true; |
|
|
|
} |
|
|
|
@ -475,53 +478,39 @@ namespace Avalonia.Controls |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void SelectNext() |
|
|
|
private void SelectNext() => MoveSelection(SelectedIndex, 1, WrapSelection); |
|
|
|
private void SelectPrevious() => MoveSelection(SelectedIndex, -1, WrapSelection); |
|
|
|
|
|
|
|
private void MoveSelection(int startIndex, int step, bool wrap) |
|
|
|
{ |
|
|
|
if (ItemCount >= 1) |
|
|
|
{ |
|
|
|
if (IsDropDownOpen) |
|
|
|
{ |
|
|
|
MoveSelection(NavigationDirection.Next, WrapSelection); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var index = SelectedIndex + 1; |
|
|
|
var count = ItemCount; |
|
|
|
static bool IsSelectable(object? o) => (o as AvaloniaObject)?.GetValue(IsEnabledProperty) ?? true; |
|
|
|
|
|
|
|
if (WrapSelection) |
|
|
|
index %= count; |
|
|
|
else |
|
|
|
index = Math.Min(index, count - 1); |
|
|
|
var count = ItemCount; |
|
|
|
|
|
|
|
SelectedIndex = index; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void SelectPrev() |
|
|
|
{ |
|
|
|
if (ItemCount >= 1) |
|
|
|
for (int i = startIndex + step; i != startIndex; i += step) |
|
|
|
{ |
|
|
|
if (IsDropDownOpen) |
|
|
|
{ |
|
|
|
MoveSelection(NavigationDirection.Previous, WrapSelection); |
|
|
|
} |
|
|
|
else |
|
|
|
if (i < 0 || i >= count) |
|
|
|
{ |
|
|
|
var index = SelectedIndex - 1; |
|
|
|
var count = ItemCount; |
|
|
|
|
|
|
|
if (WrapSelection) |
|
|
|
if (wrap) |
|
|
|
{ |
|
|
|
if (index < 0) |
|
|
|
index += count; |
|
|
|
if (i < 0) |
|
|
|
i += count; |
|
|
|
else if (i >= count) |
|
|
|
i %= count; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
index = Math.Max(index, 0); |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
SelectedIndex = index; |
|
|
|
var item = ItemsView[i]; |
|
|
|
var container = ContainerFromIndex(i); |
|
|
|
|
|
|
|
if (IsSelectable(item) && IsSelectable(container)) |
|
|
|
{ |
|
|
|
SelectedIndex = i; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|