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

Add SortDirection Bindable and refactor to make everything work

This commit is contained in:
Andrei Zavatski 2020-02-17 03:38:14 +03:00
parent 2ba0bd872b
commit fe7923b7e8
3 changed files with 161 additions and 17 deletions

View File

@ -5,8 +5,11 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Overlays; using osu.Game.Overlays;
using osu.Game.Overlays.BeatmapListing; using osu.Game.Overlays.BeatmapListing;
using osuTK;
namespace osu.Game.Tests.Visual.UserInterface namespace osu.Game.Tests.Visual.UserInterface
{ {
@ -20,14 +23,39 @@ namespace osu.Game.Tests.Visual.UserInterface
[Cached] [Cached]
private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Blue); private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Blue);
private readonly FillFlowContainer placeholder;
private readonly BeatmapListingSortTabControl control;
public TestSceneBeatmapListingSort() public TestSceneBeatmapListingSort()
{ {
Add(new BeatmapListingSortTabControl Add(control = new BeatmapListingSortTabControl
{ {
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
}); });
Add(placeholder = new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 5),
});
}
protected override void LoadComplete()
{
base.LoadComplete();
control.SortDirection.BindValueChanged(_ => updateBindablesVisual());
control.Current.BindValueChanged(_ => updateBindablesVisual(), true);
}
private void updateBindablesVisual()
{
placeholder.Clear();
placeholder.Add(new OsuSpriteText { Text = $"Current: {control.Current.Value}" });
placeholder.Add(new OsuSpriteText { Text = $"Sort direction: {control.SortDirection.Value}" });
} }
} }
} }

View File

@ -1,14 +1,109 @@
// 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.
using osu.Framework.Bindables;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Graphics;
using osuTK.Graphics;
using osuTK;
using osu.Framework.Input.Events;
namespace osu.Game.Overlays.BeatmapListing namespace osu.Game.Overlays.BeatmapListing
{ {
public class BeatmapListingSortTabControl : OverlaySortTabControl<BeatmapSortCriteria> public class BeatmapListingSortTabControl : OverlaySortTabControl<BeatmapSortCriteria>
{ {
public readonly Bindable<SortDirection> SortDirection = new Bindable<SortDirection>(Overlays.SortDirection.Descending);
public BeatmapListingSortTabControl() public BeatmapListingSortTabControl()
{ {
Current.Value = BeatmapSortCriteria.Ranked; Current.Value = BeatmapSortCriteria.Ranked;
} }
protected override SortTabControl CreateControl() => new BeatmapSortTabControl
{
SortDirection = { BindTarget = SortDirection }
};
private class BeatmapSortTabControl : SortTabControl
{
public readonly Bindable<SortDirection> SortDirection = new Bindable<SortDirection>();
protected override TabItem<BeatmapSortCriteria> CreateTabItem(BeatmapSortCriteria value) => new BeatmapSortTabItem(value)
{
SortDirection = { BindTarget = SortDirection }
};
private class BeatmapSortTabItem : SortTabItem
{
public readonly Bindable<SortDirection> SortDirection = new Bindable<SortDirection>();
public BeatmapSortTabItem(BeatmapSortCriteria value)
: base(value)
{
}
protected override TabButton CreateTabButton(BeatmapSortCriteria value) => new BeatmapTabButton(value)
{
Active = { BindTarget = Active },
SortDirection = { BindTarget = SortDirection }
};
private class BeatmapTabButton : TabButton
{
public readonly Bindable<SortDirection> SortDirection = new Bindable<SortDirection>();
protected override Color4 ContentColour
{
set
{
base.ContentColour = value;
icon.Colour = value;
}
}
private readonly SpriteIcon icon;
public BeatmapTabButton(BeatmapSortCriteria value)
: base(value)
{
Add(icon = new SpriteIcon
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
AlwaysPresent = true,
Alpha = 0,
Size = new Vector2(6)
});
}
protected override void LoadComplete()
{
base.LoadComplete();
SortDirection.BindValueChanged(direction =>
{
icon.Icon = direction.NewValue == Overlays.SortDirection.Ascending ? FontAwesome.Solid.CaretUp : FontAwesome.Solid.CaretDown;
icon.Margin = direction.NewValue == Overlays.SortDirection.Ascending ? new MarginPadding { Top = 1 } : new MarginPadding { Top = 2 };
}, true);
}
protected override void UpdateState()
{
base.UpdateState();
icon.FadeTo(Active.Value || IsHovered ? 1 : 0, 200, Easing.OutQuint);
}
protected override bool OnClick(ClickEvent e)
{
if (Active.Value)
SortDirection.Value = SortDirection.Value == Overlays.SortDirection.Ascending ? Overlays.SortDirection.Descending : Overlays.SortDirection.Ascending;
return base.OnClick(e);
}
}
}
}
} }
public enum BeatmapSortCriteria public enum BeatmapSortCriteria

View File

@ -82,9 +82,15 @@ namespace osu.Game.Overlays
: base(value) : base(value)
{ {
AutoSizeAxes = Axes.Both; AutoSizeAxes = Axes.Both;
Child = new TabButton(value) { Active = { BindTarget = Active } }; Child = CreateTabButton(value);
} }
[NotNull]
protected virtual TabButton CreateTabButton(T value) => new TabButton(value)
{
Active = { BindTarget = Active }
};
protected override void OnActivated() protected override void OnActivated()
{ {
} }
@ -93,52 +99,67 @@ namespace osu.Game.Overlays
{ {
} }
private class TabButton : HeaderButton protected class TabButton : HeaderButton
{ {
public readonly BindableBool Active = new BindableBool(); public readonly BindableBool Active = new BindableBool();
protected override Container<Drawable> Content => content;
protected virtual Color4 ContentColour
{
set => text.Colour = value;
}
[Resolved] [Resolved]
private OverlayColourProvider colourProvider { get; set; } private OverlayColourProvider colourProvider { get; set; }
private readonly SpriteText text; private readonly SpriteText text;
private readonly FillFlowContainer content;
public TabButton(T value) public TabButton(T value)
{ {
Add(text = new OsuSpriteText base.Content.Add(content = new FillFlowContainer
{ {
Font = OsuFont.GetFont(size: 12), AutoSizeAxes = Axes.Both,
Text = value.ToString() Direction = FillDirection.Horizontal,
Spacing = new Vector2(3, 0),
Children = new Drawable[]
{
text = new OsuSpriteText
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Font = OsuFont.GetFont(size: 12),
Text = value.ToString()
}
}
}); });
} }
protected override void LoadComplete() protected override void LoadComplete()
{ {
base.LoadComplete(); base.LoadComplete();
Active.BindValueChanged(_ => updateState(), true); Active.BindValueChanged(_ => UpdateState(), true);
} }
protected override bool OnHover(HoverEvent e) protected override bool OnHover(HoverEvent e)
{ {
updateHoverState(); UpdateState();
return true; return true;
} }
protected override void OnHoverLost(HoverLostEvent e) => updateHoverState(); protected override void OnHoverLost(HoverLostEvent e) => UpdateState();
private void updateState() protected virtual void UpdateState()
{
updateHoverState();
text.Font = text.Font.With(weight: Active.Value ? FontWeight.Bold : FontWeight.Medium);
}
private void updateHoverState()
{ {
if (Active.Value || IsHovered) if (Active.Value || IsHovered)
ShowBackground(); ShowBackground();
else else
HideBackground(); HideBackground();
text.Colour = Active.Value && !IsHovered ? colourProvider.Light1 : Color4.White; ContentColour = Active.Value && !IsHovered ? colourProvider.Light1 : Color4.White;
text.Font = text.Font.With(weight: Active.Value ? FontWeight.Bold : FontWeight.Medium);
} }
} }
} }