1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-15 14:33:01 +08:00

Apply NRT to SectionsContainer

This commit is contained in:
Dean Herbert 2023-06-07 14:53:37 +09:00
parent 2a76348481
commit 7d49f5d7c6
3 changed files with 35 additions and 31 deletions

View File

@ -1,12 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text. // See the LICENCE file in the repository root for full licence text.
#nullable disable
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using JetBrains.Annotations;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -23,11 +20,35 @@ namespace osu.Game.Graphics.Containers
public partial class SectionsContainer<T> : Container<T> public partial class SectionsContainer<T> : Container<T>
where T : Drawable where T : Drawable
{ {
public Bindable<T> SelectedSection { get; } = new Bindable<T>(); public Bindable<T?> SelectedSection { get; } = new Bindable<T?>();
private T lastClickedSection; private T? lastClickedSection;
public Drawable ExpandableHeader protected override Container<T> Content => scrollContentContainer;
private readonly UserTrackingScrollContainer scrollContainer;
private readonly Container headerBackgroundContainer;
private readonly MarginPadding originalSectionsMargin;
private Drawable? fixedHeader;
private Drawable? footer;
private Drawable? headerBackground;
private FlowContainer<T> scrollContentContainer = null!;
private float? headerHeight, footerHeight;
private float? lastKnownScroll;
/// <summary>
/// The percentage of the container to consider the centre-point for deciding the active section (and scrolling to a requested section).
/// </summary>
private const float scroll_y_centre = 0.1f;
private Drawable? expandableHeader;
public Drawable? ExpandableHeader
{ {
get => expandableHeader; get => expandableHeader;
set set
@ -42,11 +63,12 @@ namespace osu.Game.Graphics.Containers
if (value == null) return; if (value == null) return;
AddInternal(expandableHeader); AddInternal(expandableHeader);
lastKnownScroll = null; lastKnownScroll = null;
} }
} }
public Drawable FixedHeader public Drawable? FixedHeader
{ {
get => fixedHeader; get => fixedHeader;
set set
@ -63,7 +85,7 @@ namespace osu.Game.Graphics.Containers
} }
} }
public Drawable Footer public Drawable? Footer
{ {
get => footer; get => footer;
set set
@ -75,16 +97,17 @@ namespace osu.Game.Graphics.Containers
footer = value; footer = value;
if (value == null) return; if (footer == null) return;
footer.Anchor |= Anchor.y2; footer.Anchor |= Anchor.y2;
footer.Origin |= Anchor.y2; footer.Origin |= Anchor.y2;
scrollContainer.Add(footer); scrollContainer.Add(footer);
lastKnownScroll = null; lastKnownScroll = null;
} }
} }
public Drawable HeaderBackground public Drawable? HeaderBackground
{ {
get => headerBackground; get => headerBackground;
set set
@ -102,23 +125,6 @@ namespace osu.Game.Graphics.Containers
} }
} }
protected override Container<T> Content => scrollContentContainer;
private readonly UserTrackingScrollContainer scrollContainer;
private readonly Container headerBackgroundContainer;
private readonly MarginPadding originalSectionsMargin;
private Drawable expandableHeader, fixedHeader, footer, headerBackground;
private FlowContainer<T> scrollContentContainer;
private float? headerHeight, footerHeight;
private float? lastKnownScroll;
/// <summary>
/// The percentage of the container to consider the centre-point for deciding the active section (and scrolling to a requested section).
/// </summary>
private const float scroll_y_centre = 0.1f;
public SectionsContainer() public SectionsContainer()
{ {
AddRangeInternal(new Drawable[] AddRangeInternal(new Drawable[]
@ -171,10 +177,8 @@ namespace osu.Game.Graphics.Containers
public void ScrollToTop() => scrollContainer.ScrollTo(0); public void ScrollToTop() => scrollContainer.ScrollTo(0);
[NotNull]
protected virtual UserTrackingScrollContainer CreateScrollContainer() => new UserTrackingScrollContainer(); protected virtual UserTrackingScrollContainer CreateScrollContainer() => new UserTrackingScrollContainer();
[NotNull]
protected virtual FlowContainer<T> CreateScrollContentContainer() => protected virtual FlowContainer<T> CreateScrollContentContainer() =>
new FillFlowContainer<T> new FillFlowContainer<T>
{ {

View File

@ -120,7 +120,7 @@ namespace osu.Game.Overlays
if (lastSection != section.NewValue) if (lastSection != section.NewValue)
{ {
lastSection = section.NewValue; lastSection = section.NewValue;
tabs.Current.Value = lastSection; tabs.Current.Value = lastSection!;
} }
}; };

View File

@ -65,7 +65,7 @@ namespace osu.Game.Screens.Edit.Setup
{ {
base.LoadComplete(); base.LoadComplete();
sections.SelectedSection.BindValueChanged(section => tabControl.Current.Value = section.NewValue); sections.SelectedSection.BindValueChanged(section => tabControl.Current.Value = section.NewValue!);
tabControl.Current.BindValueChanged(section => tabControl.Current.BindValueChanged(section =>
{ {
if (section.NewValue != sections.SelectedSection.Value) if (section.NewValue != sections.SelectedSection.Value)