Skip to content

Commit

Permalink
Merge pull request #18987 from unoplatform/dev/mara/net9-calendarview
Browse files Browse the repository at this point in the history
fix: CalendarView maxdate scrolling
  • Loading branch information
rajamatt authored Dec 9, 2024
2 parents 1e655ed + 27242cb commit 67913e6
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ namespace Uno.UI.RuntimeTests.Tests.Windows_UI_Xaml_Controls;
[RunsOnUIThread]
public class Given_CalendarView
{
const int DEFAULT_MIN_MAX_DATE_YEAR_OFFSET = 100;

[TestMethod]
[UnoWorkItem("https://github.com/unoplatform/uno/issues/16123")]
[Ignore("Test is unstable on CI: https://github.com/unoplatform/uno/issues/16123")]
Expand Down Expand Up @@ -61,6 +63,42 @@ public async Task When_MinDate_Has_Different_Offset()
await UITestHelper.Load(calendarView);
}

[TestMethod]
public async Task When_Scroll_To_MaxDate()
{
var calendarView = new CalendarView()
{
DisplayMode = CalendarViewDisplayMode.Decade
};

await UITestHelper.Load(calendarView);

Type calendarViewType = typeof(CalendarView);
MethodInfo ChangeVisualStateInfo = calendarViewType.GetMethod("ChangeVisualState", BindingFlags.NonPublic | BindingFlags.Instance);

// Scroll to max date
calendarView.SetDisplayDate(calendarView.MaxDate);

// Switch to Year view
calendarView.DisplayMode = CalendarViewDisplayMode.Year;
ChangeVisualStateInfo.Invoke(calendarView, new object[] { false });
await TestServices.WindowHelper.WaitForIdle();

// Switch back to Decade view
calendarView.DisplayMode = CalendarViewDisplayMode.Decade;
ChangeVisualStateInfo.Invoke(calendarView, new object[] { false });
await TestServices.WindowHelper.WaitForIdle();

// Decade viewport should be full of items (no missing row)
calendarView.GetActiveGeneratorHost(out var pHost);
var maxDecadeIndex = DEFAULT_MIN_MAX_DATE_YEAR_OFFSET * 2;
var maxDisplayedItems = pHost.Panel.Rows * pHost.Panel.Cols;

// The first visible index should be less than the max possible index minus the max items we can display
// Worst case scenario is that the last row only has 1 item
Assert.IsTrue(pHost.Panel.FirstVisibleIndex <= maxDecadeIndex - (maxDisplayedItems - pHost.Panel.Rows - 1));
}

#if __WASM__
[TestMethod]
[Ignore("Fails on Fluent styles #17272")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,21 @@ internal void ScrollItemIntoView(int index, ScrollIntoViewAlignment alignment, d
// then it will request GetContainerFromIndex and tries to focus it.
// So here we prepare the _effectiveViewport (which will most probably be re-updated by the ChangeView below),
// and then force a base_Measure()
_effectiveViewport.Y += newOffset - currentOffset;

#if HAS_UNO
// Scrolling to the MaxDate and switching between Decade/Year/Month views keeps increasing the _effectiveViewport.Y
// even though there's no more items to show after MaxDate, causing empty rows in the viewport
if (newOffset >= sv.ScrollableHeight)
{
_effectiveViewport.Y = currentOffset;
}
else
{
_effectiveViewport.Y += newOffset - currentOffset;
}
#else
_effectiveViewport.Y += newOffset - currentOffset;
#endif

sv.ChangeView(
horizontalOffset: null,
Expand Down

0 comments on commit 67913e6

Please sign in to comment.