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) if (container == null && SelectedIndex != -1)
{ {
ScrollIntoView(Selection.SelectedItem); ScrollIntoView(Selection.SelectedIndex);
container = ItemContainerGenerator.ContainerFromIndex(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 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> /// <summary>
/// Scrolls the specified item into view. /// Scrolls the specified item into view.
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="index">The index of the item.</param>
public virtual void ScrollIntoView(object item) public virtual void ScrollIntoView(int index)
{ {
} }

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

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

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

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

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

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

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

@ -142,7 +142,7 @@ namespace Avalonia.Controls.Presenters
} }
/// <inheritdoc/> /// <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(); 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> /// <summary>
/// Scrolls the specified item into view. /// Scrolls the specified item into view.
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
public void ScrollIntoView(object item) => Presenter?.ScrollIntoView(item); public void ScrollIntoView(object item) => ScrollIntoView(IndexOf(Items, item));
/// <summary> /// <summary>
/// Tries to get the container that was the source of an event. /// 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) if (e.PropertyName == nameof(SelectionModel.AnchorIndex) && AutoScrollToSelectedItem)
{ {
var index = Selection.AnchorIndex.GetSize() > 0 ? Selection.AnchorIndex.GetAt(0) : -1; if (Selection.AnchorIndex.GetSize() > 0)
var item = index != -1 ? ElementAt(Items, index) : null;
if (item != null)
{ {
ScrollIntoView(item); ScrollIntoView(Selection.AnchorIndex.GetAt(0));
} }
} }
} }

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

@ -81,7 +81,7 @@ namespace Avalonia.Dialogs
if (indexOfPreselected > 1) 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); target.Arrange(Rect.Empty);
// Check for issue #591: this should not throw. // 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]; var last = (target.Items as IList)[10];
target.ScrollIntoView(last); target.ScrollIntoView(10);
Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset); Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset);
Assert.Same(target.Panel.Children[9].DataContext, last); Assert.Same(target.Panel.Children[9].DataContext, last);
@ -746,12 +746,12 @@ namespace Avalonia.Controls.UnitTests.Presenters
var last = (target.Items as IList)[10]; var last = (target.Items as IList)[10];
target.ScrollIntoView(last); target.ScrollIntoView(10);
Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset); Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset);
Assert.Same(target.Panel.Children[9].DataContext, last); Assert.Same(target.Panel.Children[9].DataContext, last);
target.ScrollIntoView(last); target.ScrollIntoView(10);
Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset); Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset);
Assert.Same(target.Panel.Children[9].DataContext, last); Assert.Same(target.Panel.Children[9].DataContext, last);

Loading…
Cancel
Save