1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-11 12:57:36 +08:00

Merge pull request #7983 from EVAST9919/user-list-toolbar

Implement UserListToolbar component
This commit is contained in:
Dan Balasescu 2020-02-26 10:35:14 +09:00 committed by GitHub
commit 045355786a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 226 additions and 1 deletions

View File

@ -0,0 +1,57 @@
// 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.
using System;
using System.Collections.Generic;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Overlays;
using osu.Game.Overlays.Home.Friends;
using osuTK;
namespace osu.Game.Tests.Visual.UserInterface
{
public class TestSceneUserListToolbar : OsuTestScene
{
public override IReadOnlyList<Type> RequiredTypes => new[]
{
typeof(UserSortTabControl),
typeof(OverlaySortTabControl<>),
typeof(OverlayPanelDisplayStyleControl),
typeof(UserListToolbar),
};
[Cached]
private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Purple);
public TestSceneUserListToolbar()
{
UserListToolbar toolbar;
OsuSpriteText sort;
OsuSpriteText displayStyle;
Add(toolbar = new UserListToolbar
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
});
Add(new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 5),
Children = new Drawable[]
{
sort = new OsuSpriteText(),
displayStyle = new OsuSpriteText()
}
});
toolbar.SortCriteria.BindValueChanged(criteria => sort.Text = $"Criteria: {criteria.NewValue}", true);
toolbar.DisplayStyle.BindValueChanged(style => displayStyle.Text = $"Style: {style.NewValue}", true);
}
}
}

View File

@ -109,6 +109,7 @@ namespace osu.Game.Overlays.Comments
public enum CommentsSortCriteria
{
[System.ComponentModel.Description(@"Recent")]
New,
Old,
Top

View File

@ -0,0 +1,45 @@
// 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.
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osuTK;
using osu.Framework.Bindables;
namespace osu.Game.Overlays.Home.Friends
{
public class UserListToolbar : CompositeDrawable
{
public Bindable<UserSortCriteria> SortCriteria => sortControl.Current;
public Bindable<OverlayPanelDisplayStyle> DisplayStyle => styleControl.Current;
private readonly UserSortTabControl sortControl;
private readonly OverlayPanelDisplayStyleControl styleControl;
public UserListToolbar()
{
AutoSizeAxes = Axes.Both;
AddInternal(new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal,
Spacing = new Vector2(10, 0),
Children = new Drawable[]
{
sortControl = new UserSortTabControl
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
},
styleControl = new OverlayPanelDisplayStyleControl
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
}
}
});
}
}
}

View File

@ -0,0 +1,19 @@
// 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.
using System.ComponentModel;
namespace osu.Game.Overlays.Home.Friends
{
public class UserSortTabControl : OverlaySortTabControl<UserSortCriteria>
{
}
public enum UserSortCriteria
{
[Description(@"Recently Active")]
LastVisit,
Rank,
Username
}
}

View File

@ -0,0 +1,101 @@
// 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.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osuTK;
using osu.Framework.Input.Events;
using osu.Game.Graphics.UserInterface;
using osu.Framework.Allocation;
using osuTK.Graphics;
using osu.Framework.Graphics.Cursor;
namespace osu.Game.Overlays
{
public class OverlayPanelDisplayStyleControl : OsuTabControl<OverlayPanelDisplayStyle>
{
protected override Dropdown<OverlayPanelDisplayStyle> CreateDropdown() => null;
protected override TabItem<OverlayPanelDisplayStyle> CreateTabItem(OverlayPanelDisplayStyle value) => new PanelDisplayTabItem(value);
protected override bool AddEnumEntriesAutomatically => false;
public OverlayPanelDisplayStyleControl()
{
AutoSizeAxes = Axes.Both;
AddTabItem(new PanelDisplayTabItem(OverlayPanelDisplayStyle.Card)
{
Icon = FontAwesome.Solid.Square
});
AddTabItem(new PanelDisplayTabItem(OverlayPanelDisplayStyle.List)
{
Icon = FontAwesome.Solid.Bars
});
}
protected override TabFillFlowContainer CreateTabFlow() => new TabFillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal
};
private class PanelDisplayTabItem : TabItem<OverlayPanelDisplayStyle>, IHasTooltip
{
public IconUsage Icon
{
set => icon.Icon = value;
}
[Resolved]
private OverlayColourProvider colourProvider { get; set; }
public string TooltipText => $@"{Value} view";
private readonly SpriteIcon icon;
public PanelDisplayTabItem(OverlayPanelDisplayStyle value)
: base(value)
{
Size = new Vector2(11);
AddRange(new Drawable[]
{
icon = new SpriteIcon
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
FillMode = FillMode.Fit
},
new HoverClickSounds()
});
}
protected override void OnActivated() => updateState();
protected override void OnDeactivated() => updateState();
protected override bool OnHover(HoverEvent e)
{
updateState();
return base.OnHover(e);
}
protected override void OnHoverLost(HoverLostEvent e)
{
updateState();
base.OnHoverLost(e);
}
private void updateState() => icon.Colour = Active.Value || IsHovered ? colourProvider.Light1 : Color4.White;
}
}
public enum OverlayPanelDisplayStyle
{
Card,
List
}
}

View File

@ -15,6 +15,8 @@ using osu.Game.Graphics.Sprites;
using osuTK.Graphics;
using osu.Game.Overlays.Comments;
using JetBrains.Annotations;
using System;
using osu.Framework.Extensions;
namespace osu.Game.Overlays
{
@ -132,7 +134,7 @@ namespace osu.Game.Overlays
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Font = OsuFont.GetFont(size: 12),
Text = value.ToString()
Text = (value as Enum)?.GetDescription() ?? value.ToString()
}
}
});