Skip to content

Commit

Permalink
Merge branch 'main' into grids
Browse files Browse the repository at this point in the history
  • Loading branch information
Redth committed Jun 10, 2024
2 parents f2938b6 + cf2e554 commit c10986e
Show file tree
Hide file tree
Showing 17 changed files with 141 additions and 72 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -350,4 +350,5 @@ MigrationBackup/
.ionide/
.DS_Store

.idea/
# Rider
.idea
14 changes: 0 additions & 14 deletions .vscode/launch.json

This file was deleted.

12 changes: 0 additions & 12 deletions .vscode/tasks.json

This file was deleted.

2 changes: 0 additions & 2 deletions VirtualListView/Apple/CvCell.ios.maccatalyst.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
using CoreGraphics;
using Foundation;
using Microsoft.Maui.Platform;
using Microsoft.VisualBasic;
using System.Diagnostics.CodeAnalysis;
using UIKit;

namespace Microsoft.Maui;
Expand Down
12 changes: 9 additions & 3 deletions VirtualListView/Apple/CvDataSource.ios.maccatalyst.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public override UICollectionViewCell GetCell(UICollectionView collectionView, NS
{
data = Handler?.Adapter?.DataFor(info.Kind, info.SectionIndex, info.ItemIndex);

if (data is not null)
nativeReuseId = info.Kind switch
{
var reuseId = Handler?.VirtualView?.ViewSelector?.GetReuseId(info, data);

Check failure on line 40 in VirtualListView/Apple/CvDataSource.ios.maccatalyst.cs

View workflow job for this annotation

GitHub Actions / Build

Syntax error, '=>' expected

Check failure on line 40 in VirtualListView/Apple/CvDataSource.ios.maccatalyst.cs

View workflow job for this annotation

GitHub Actions / Build

Invalid expression term '='

Check failure on line 40 in VirtualListView/Apple/CvDataSource.ios.maccatalyst.cs

View workflow job for this annotation

GitHub Actions / Build

Syntax error, ',' expected

Expand Down Expand Up @@ -71,7 +71,13 @@ public override UICollectionViewCell GetCell(UICollectionView collectionView, NS
info.IsSelected = false;
else
info.IsSelected = Handler?.IsItemSelected(info.SectionIndex, info.ItemIndex) ?? false;
}

if (cell.NeedsView)
{
var view = Handler?.PositionalViewSelector?.ViewSelector?.CreateView(info, data);
if (view is not null)
cell.SetupView(view);
}

if (cell.NeedsView && info is not null && data is not null)
{
Expand All @@ -84,7 +90,7 @@ public override UICollectionViewCell GetCell(UICollectionView collectionView, NS
{
cell.UpdatePosition(info);

if (data is not null && (cell.VirtualView?.TryGetTarget(out var cellVirtualView) ?? false))
if (cell.VirtualView?.TryGetTarget(out var cellVirtualView) ?? false)
{
Handler?.VirtualView?.ViewSelector?.RecycleView(info, data, cellVirtualView);

Expand Down
12 changes: 12 additions & 0 deletions VirtualListView/Apple/VirtualListViewHandler.ios.maccatalyst.cs
Original file line number Diff line number Diff line change
Expand Up @@ -280,5 +280,17 @@ public static void MapColumns(VirtualListViewHandler handler, IVirtualListView v
// {
//
// }

public IReadOnlyList<IPositionInfo> FindVisiblePositions()

Check failure on line 284 in VirtualListView/Apple/VirtualListViewHandler.ios.maccatalyst.cs

View workflow job for this annotation

GitHub Actions / Build

The modifier 'public' is not valid for this item
{
var positions = new List<PositionInfo>();

foreach (var cell in PlatformView.VisibleCells)
{
if (cell is CvCell cvCell)
positions.Add(cvCell.PositionInfo);
}

return positions;
}
}

Check failure on line 296 in VirtualListView/Apple/VirtualListViewHandler.ios.maccatalyst.cs

View workflow job for this annotation

GitHub Actions / Build

} expected
59 changes: 34 additions & 25 deletions VirtualListView/Controls/VirtualListView.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Windows.Input;
#nullable enable
using System.Windows.Input;
using Microsoft.Maui.Adapters;

namespace Microsoft.Maui.Controls;
Expand All @@ -21,7 +22,7 @@ public IVirtualListViewAdapter Adapter
BindableProperty.Create(nameof(Adapter), typeof(IVirtualListViewAdapter), typeof(VirtualListView), default);


public IView GlobalHeader
public IView? GlobalHeader
{
get => (IView)GetValue(GlobalHeaderProperty);
set => SetValue(GlobalHeaderProperty, value);
Expand All @@ -39,7 +40,7 @@ public bool IsHeaderVisible
public static readonly BindableProperty IsHeaderVisibleProperty =
BindableProperty.Create(nameof(IsHeaderVisible), typeof(bool), typeof(VirtualListView), true);

public IView GlobalFooter
public IView? GlobalFooter
{
get => (IView)GetValue(GlobalFooterProperty);
set => SetValue(GlobalFooterProperty, value);
Expand All @@ -59,7 +60,7 @@ public bool IsFooterVisible
BindableProperty.Create(nameof(IsFooterVisible), typeof(bool), typeof(VirtualListView), true);


public DataTemplate ItemTemplate
public DataTemplate? ItemTemplate
{
get => (DataTemplate)GetValue(ItemTemplateProperty);
set => SetValue(ItemTemplateProperty, value);
Expand All @@ -68,7 +69,7 @@ public DataTemplate ItemTemplate
public static readonly BindableProperty ItemTemplateProperty =
BindableProperty.Create(nameof(ItemTemplate), typeof(DataTemplate), typeof(VirtualListView), default);

public VirtualListViewItemTemplateSelector ItemTemplateSelector
public VirtualListViewItemTemplateSelector? ItemTemplateSelector
{
get => (VirtualListViewItemTemplateSelector)GetValue(ItemTemplateSelectorProperty);
set => SetValue(ItemTemplateSelectorProperty, value);
Expand Down Expand Up @@ -97,7 +98,7 @@ public ScrollBarVisibility HorizontalScrollbarVisibility
public static readonly BindableProperty HorizontalScrollbarVisibilityProperty =
BindableProperty.Create(nameof(HorizontalScrollbarVisibility), typeof(ScrollBarVisibility), typeof(VirtualListView), ScrollBarVisibility.Default);

public DataTemplate SectionHeaderTemplate
public DataTemplate? SectionHeaderTemplate
{
get => (DataTemplate)GetValue(SectionHeaderTemplateProperty);
set => SetValue(SectionHeaderTemplateProperty, value);
Expand All @@ -106,7 +107,7 @@ public DataTemplate SectionHeaderTemplate
public static readonly BindableProperty SectionHeaderTemplateProperty =
BindableProperty.Create(nameof(SectionHeaderTemplate), typeof(DataTemplate), typeof(VirtualListView), default);

public VirtualListViewSectionTemplateSelector SectionHeaderTemplateSelector
public VirtualListViewSectionTemplateSelector? SectionHeaderTemplateSelector
{
get => (VirtualListViewSectionTemplateSelector)GetValue(SectionHeaderTemplateSelectorProperty);
set => SetValue(SectionHeaderTemplateSelectorProperty, value);
Expand All @@ -117,7 +118,7 @@ public VirtualListViewSectionTemplateSelector SectionHeaderTemplateSelector



public DataTemplate SectionFooterTemplate
public DataTemplate? SectionFooterTemplate
{
get => (DataTemplate)GetValue(SectionFooterTemplateProperty);
set => SetValue(SectionFooterTemplateProperty, value);
Expand All @@ -126,7 +127,7 @@ public DataTemplate SectionFooterTemplate
public static readonly BindableProperty SectionFooterTemplateProperty =
BindableProperty.Create(nameof(SectionFooterTemplate), typeof(DataTemplate), typeof(VirtualListView), default);

public VirtualListViewSectionTemplateSelector SectionFooterTemplateSelector
public VirtualListViewSectionTemplateSelector? SectionFooterTemplateSelector
{
get => (VirtualListViewSectionTemplateSelector)GetValue(SectionFooterTemplateSelectorProperty);
set => SetValue(SectionFooterTemplateSelectorProperty, value);
Expand Down Expand Up @@ -159,7 +160,7 @@ void IVirtualListView.Refresh(Action completionCallback)
OnRefresh?.Invoke(this, new RefreshEventArgs(completionCallback));
}

public ICommand RefreshCommand
public ICommand? RefreshCommand
{
get => (ICommand)GetValue(RefreshCommandProperty);
set => SetValue(RefreshCommandProperty, value);
Expand All @@ -168,9 +169,9 @@ public ICommand RefreshCommand
public static readonly BindableProperty RefreshCommandProperty =
BindableProperty.Create(nameof(RefreshCommand), typeof(ICommand), typeof(VirtualListView), default);

public Color RefreshAccentColor
public Color? RefreshAccentColor
{
get => (Color)GetValue(RefreshAccentColorProperty);
get => (Color?)GetValue(RefreshAccentColorProperty);
set => SetValue(RefreshAccentColorProperty, value);
}

Expand All @@ -196,14 +197,14 @@ public ListOrientation Orientation
BindableProperty.Create(nameof(Orientation), typeof(ListOrientation), typeof(VirtualListView), ListOrientation.Vertical);


public View EmptyView
public IView? EmptyView
{
get => (View)GetValue(EmptyViewProperty);
get => (IView)GetValue(EmptyViewProperty);
set => SetValue(EmptyViewProperty, value);
}

public static readonly BindableProperty EmptyViewProperty =
BindableProperty.Create(nameof(EmptyView), typeof(View), typeof(VirtualListView), null,
BindableProperty.Create(nameof(EmptyView), typeof(IView), typeof(VirtualListView), null,
propertyChanged: (bobj, oldValue, newValue) =>
{
if (bobj is VirtualListView virtualListView)
Expand All @@ -216,13 +217,13 @@ public View EmptyView
}
});

IView IVirtualListView.EmptyView => EmptyView;
IView? IVirtualListView.EmptyView => EmptyView;


public IVirtualListViewSelector ViewSelector => this;

public IView Header => GlobalHeader;
public IView Footer => GlobalFooter;
public IView? Header => GlobalHeader;
public IView? Footer => GlobalFooter;

public event EventHandler<ScrolledEventArgs> OnScrolled;

Check warning on line 228 in VirtualListView/Controls/VirtualListView.cs

View workflow job for this annotation

GitHub Actions / Build

Non-nullable event 'OnScrolled' must contain a non-null value when exiting constructor. Consider declaring the event as nullable.

Check warning on line 228 in VirtualListView/Controls/VirtualListView.cs

View workflow job for this annotation

GitHub Actions / Build

Non-nullable event 'OnScrolled' must contain a non-null value when exiting constructor. Consider declaring the event as nullable.

Expand All @@ -239,7 +240,7 @@ public void Scrolled(double x, double y)
public static readonly BindableProperty ScrolledCommandProperty =
BindableProperty.Create(nameof(ScrolledCommand), typeof(ICommand), typeof(VirtualListView), default);

public ICommand ScrolledCommand
public ICommand? ScrolledCommand
{
get => (ICommand)GetValue(ScrolledCommandProperty);
set => SetValue(ScrolledCommandProperty, value);
Expand All @@ -256,7 +257,7 @@ public ICommand ScrolledCommand
vlv.RaiseSelectedItemsChanged(oldSelection.ToArray(), newSelection.ToArray());
}
});
public IList<ItemPosition> SelectedItems
public IList<ItemPosition>? SelectedItems
{
get => (IList<ItemPosition>)GetValue(SelectedItemsProperty);
set => SetValue(SelectedItemsProperty, value ?? Array.Empty<ItemPosition>());
Expand Down Expand Up @@ -314,9 +315,9 @@ public void SelectItem(ItemPosition itemPosition)
else if (SelectionMode == Maui.SelectionMode.Multiple)
{
var current = SelectedItems;
if (!current.Contains(itemPosition))
if (current is null || !current.Contains(itemPosition))
{
SelectedItems = current.Append(itemPosition).ToArray();
SelectedItems = (current ?? []).Append(itemPosition).ToArray();
}
}
}
Expand All @@ -338,7 +339,7 @@ public bool SectionHasHeader(int sectionIndex)
public bool SectionHasFooter(int sectionIndex)
=> SectionFooterTemplateSelector != null || SectionFooterTemplate != null;

public IView CreateView(PositionInfo position, object data)
public IView? CreateView(PositionInfo position, object? data)
=> position.Kind switch
{
PositionKind.Item =>
Expand All @@ -357,7 +358,7 @@ public IView CreateView(PositionInfo position, object data)
_ => default
};

public void RecycleView(PositionInfo position, object data, IView view)
public void RecycleView(PositionInfo position, object? data, IView view)
{
if (view is View controlsView)
{
Expand All @@ -370,7 +371,7 @@ public void RecycleView(PositionInfo position, object data, IView view)
}
}

public string GetReuseId(PositionInfo position, object data)
public string GetReuseId(PositionInfo position, object? data)
=> position.Kind switch
{
PositionKind.Item =>
Expand Down Expand Up @@ -415,4 +416,12 @@ public int Columns
});


public IReadOnlyList<IPositionInfo> FindVisiblePositions()
{
#if ANDROID || IOS || MACCATALYST || WINDOWS
if (Handler is IVirtualListViewHandler handler)
return handler.FindVisiblePositions();
#endif
return [];
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
namespace Microsoft.Maui.Controls;
#nullable enable

namespace Microsoft.Maui.Controls;

public abstract class VirtualListViewItemTemplateSelector
{
public abstract DataTemplate SelectTemplate(object item, int sectionIndex, int itemIndex);
public abstract DataTemplate SelectTemplate(object? item, int sectionIndex, int itemIndex);
}

public abstract class VirtualListViewSectionTemplateSelector
{
public abstract DataTemplate SelectTemplate(object section, int sectionIndex);
public abstract DataTemplate SelectTemplate(object? section, int sectionIndex);
}
2 changes: 2 additions & 0 deletions VirtualListView/IVirtualListView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ public interface IVirtualListView : IView
void ClearSelectedItems();

void ScrollToItem(ItemPosition path, bool animated);

IReadOnlyList<IPositionInfo> FindVisiblePositions();
}

public enum ListOrientation
Expand Down
8 changes: 8 additions & 0 deletions VirtualListView/IVirtualListViewHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Microsoft.Maui;

public interface IVirtualListViewHandler
{
#if ANDROID || IOS || MACCATALYST || WINDOWS
IReadOnlyList<IPositionInfo> FindVisiblePositions();
#endif
}
9 changes: 5 additions & 4 deletions VirtualListView/IVirtualListViewSelector.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
namespace Microsoft.Maui;
#nullable enable
namespace Microsoft.Maui;

public interface IVirtualListViewSelector
{
bool SectionHasHeader(int sectionIndex);
bool SectionHasFooter(int sectionIndex);

IView CreateView(PositionInfo position, object data);
void RecycleView(PositionInfo position, object data, IView view);
string GetReuseId(PositionInfo position, object data);
IView? CreateView(PositionInfo position, object? data);
void RecycleView(PositionInfo position, object? data, IView view);
string GetReuseId(PositionInfo position, object? data);

void ViewDetached(PositionInfo position, IView view)
{ }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,3 +205,19 @@ public static void MapColumns(VirtualListViewHandler handler, IVirtualListView v
handler.InvalidateData();
}
}

public IReadOnlyList<IPositionInfo> FindVisiblePositions()
{
var positions = new List<IPositionInfo>();

var firstVisibleItemPosition = layoutManager.FindFirstVisibleItemPosition();
var lastVisibleItemPosition = layoutManager.FindLastVisibleItemPosition();

for (var p = firstVisibleItemPosition; p <= lastVisibleItemPosition; p++)
{
positions.Add(PositionalViewSelector.GetInfo(p));
}

return positions;
}
}
Loading

0 comments on commit c10986e

Please sign in to comment.