Browse Source

Make ScrollIntoView accept an index, not an item.

Fixes #2569.
fixes/tree-selectionmodel
Steven Kirk 6 years ago
parent
commit
0f9ceb25b7
  1. 2
      src/Avalonia.Controls/ComboBox.cs
  2. 2
      src/Avalonia.Controls/Presenters/IItemsPresenter.cs
  3. 4
      src/Avalonia.Controls/Presenters/ItemVirtualizer.cs
  4. 15
      src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs
  5. 15
      src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
  6. 4
      src/Avalonia.Controls/Presenters/ItemsPresenter.cs
  7. 2
      src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs
  8. 15
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  9. 2
      src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs
  10. 8
      tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs

2
src/Avalonia.Controls/ComboBox.cs

@ -291,7 +291,7 @@ namespace Avalonia.Controls
if (container == null && SelectedIndex != -1)
{
ScrollIntoView(Selection.SelectedItem);
ScrollIntoView(Selection.SelectedIndex);
container = ItemContainerGenerator.ContainerFromIndex(selectedIndex);
}

2
src/Avalonia.Controls/Presenters/IItemsPresenter.cs

@ -14,6 +14,6 @@ namespace Avalonia.Controls.Presenters
void ItemsChanged(NotifyCollectionChangedEventArgs e);
void ScrollIntoView(object item);
void ScrollIntoView(int index);
}
}

4
src/Avalonia.Controls/Presenters/ItemVirtualizer.cs

@ -257,8 +257,8 @@ namespace Avalonia.Controls.Presenters
/// <summary>
/// Scrolls the specified item into view.
/// </summary>
/// <param name="item">The item.</param>
public virtual void ScrollIntoView(object item)
/// <param name="index">The index of the item.</param>
public virtual void ScrollIntoView(int index)
{
}

15
src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs

@ -67,18 +67,13 @@ namespace Avalonia.Controls.Presenters
/// <summary>
/// Scrolls the specified item into view.
/// </summary>
/// <param name="item">The item.</param>
public override void ScrollIntoView(object item)
/// <param name="index">The index of the item.</param>
public override void ScrollIntoView(int index)
{
if (Items != null)
if (index != -1)
{
var index = Items.IndexOf(item);
if (index != -1)
{
var container = Owner.ItemContainerGenerator.ContainerFromIndex(index);
container?.BringIntoView();
}
var container = Owner.ItemContainerGenerator.ContainerFromIndex(index);
container?.BringIntoView();
}
}

15
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@ -289,20 +289,15 @@ namespace Avalonia.Controls.Presenters
break;
}
return ScrollIntoView(newItemIndex);
return ScrollIntoViewCore(newItemIndex);
}
/// <inheritdoc/>
public override void ScrollIntoView(object item)
public override void ScrollIntoView(int index)
{
if (Items != null)
if (index != -1)
{
var index = Items.IndexOf(item);
if (index != -1)
{
ScrollIntoView(index);
}
ScrollIntoViewCore(index);
}
}
@ -514,7 +509,7 @@ namespace Avalonia.Controls.Presenters
/// </summary>
/// <param name="index">The item index.</param>
/// <returns>The container that was brought into view.</returns>
private IControl ScrollIntoView(int index)
private IControl ScrollIntoViewCore(int index)
{
var panel = VirtualizingPanel;
var generator = Owner.ItemContainerGenerator;

4
src/Avalonia.Controls/Presenters/ItemsPresenter.cs

@ -120,9 +120,9 @@ namespace Avalonia.Controls.Presenters
return Virtualizer?.GetControlInDirection(direction, from);
}
public override void ScrollIntoView(object item)
public override void ScrollIntoView(int index)
{
Virtualizer?.ScrollIntoView(item);
Virtualizer?.ScrollIntoView(index);
}
/// <inheritdoc/>

2
src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs

@ -142,7 +142,7 @@ namespace Avalonia.Controls.Presenters
}
/// <inheritdoc/>
public virtual void ScrollIntoView(object item)
public virtual void ScrollIntoView(int index)
{
}

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

@ -339,11 +339,17 @@ namespace Avalonia.Controls.Primitives
base.EndInit();
}
/// <summary>
/// Scrolls the specified item into view.
/// </summary>
/// <param name="index">The index of the item.</param>
public void ScrollIntoView(int index) => Presenter?.ScrollIntoView(index);
/// <summary>
/// Scrolls the specified item into view.
/// </summary>
/// <param name="item">The item.</param>
public void ScrollIntoView(object item) => Presenter?.ScrollIntoView(item);
public void ScrollIntoView(object item) => ScrollIntoView(IndexOf(Items, item));
/// <summary>
/// Tries to get the container that was the source of an event.
@ -665,12 +671,9 @@ namespace Avalonia.Controls.Primitives
{
if (e.PropertyName == nameof(SelectionModel.AnchorIndex) && AutoScrollToSelectedItem)
{
var index = Selection.AnchorIndex.GetSize() > 0 ? Selection.AnchorIndex.GetAt(0) : -1;
var item = index != -1 ? ElementAt(Items, index) : null;
if (item != null)
if (Selection.AnchorIndex.GetSize() > 0)
{
ScrollIntoView(item);
ScrollIntoView(Selection.AnchorIndex.GetAt(0));
}
}
}

2
src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs

@ -81,7 +81,7 @@ namespace Avalonia.Dialogs
if (indexOfPreselected > 1)
{
_filesView.ScrollIntoView(model.Items[indexOfPreselected - 1]);
_filesView.ScrollIntoView(indexOfPreselected - 1);
}
}
}

8
tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs

@ -575,7 +575,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
target.Arrange(Rect.Empty);
// Check for issue #591: this should not throw.
target.ScrollIntoView(items[0]);
target.ScrollIntoView(0);
}
}
@ -729,7 +729,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
var last = (target.Items as IList)[10];
target.ScrollIntoView(last);
target.ScrollIntoView(10);
Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset);
Assert.Same(target.Panel.Children[9].DataContext, last);
@ -746,12 +746,12 @@ namespace Avalonia.Controls.UnitTests.Presenters
var last = (target.Items as IList)[10];
target.ScrollIntoView(last);
target.ScrollIntoView(10);
Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset);
Assert.Same(target.Panel.Children[9].DataContext, last);
target.ScrollIntoView(last);
target.ScrollIntoView(10);
Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset);
Assert.Same(target.Panel.Children[9].DataContext, last);

Loading…
Cancel
Save