1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-15 00:17:50 +08:00
osu-lazer/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs

180 lines
6.6 KiB
C#
Raw Normal View History

// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2019-01-28 06:45:00 +08:00
// See the LICENCE file in the repository root for full licence text.
using System;
using System.Linq;
using Humanizer;
using osu.Framework.Allocation;
2019-03-10 06:58:14 +08:00
using osu.Framework.Bindables;
using osu.Framework.Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Online.API;
using osu.Game.Users;
using osuTK;
using osuTK.Graphics;
namespace osu.Game.Overlays.Profile.Header
{
2019-03-10 06:58:14 +08:00
public class BottomHeaderContainer : CompositeDrawable
{
2019-04-25 17:42:19 +08:00
public readonly Bindable<User> User = new Bindable<User>();
private LinkFlowContainer topLinkContainer;
private LinkFlowContainer bottomLinkContainer;
2019-04-25 17:42:19 +08:00
private Color4 iconColour;
[Resolved]
private IAPIProvider api { get; set; }
2019-04-25 17:42:19 +08:00
public BottomHeaderContainer()
{
2019-03-10 06:58:14 +08:00
AutoSizeAxes = Axes.Y;
2019-04-25 17:42:19 +08:00
}
2019-03-10 06:58:14 +08:00
2019-04-25 17:42:19 +08:00
[BackgroundDependencyLoader]
2020-01-30 05:10:19 +08:00
private void load(OverlayColourProvider colourProvider)
2019-04-25 17:42:19 +08:00
{
2020-01-30 05:10:19 +08:00
iconColour = colourProvider.Foreground1;
2019-04-25 19:05:59 +08:00
2019-03-10 06:58:14 +08:00
InternalChildren = new Drawable[]
{
new Box
{
RelativeSizeAxes = Axes.Both,
2020-01-30 05:10:19 +08:00
Colour = colourProvider.Background4
},
new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Direction = FillDirection.Vertical,
Padding = new MarginPadding { Horizontal = UserProfileOverlay.CONTENT_X_MARGIN, Vertical = 10 },
Spacing = new Vector2(0, 10),
Children = new Drawable[]
{
topLinkContainer = new LinkFlowContainer(text => text.Font = text.Font.With(size: 12))
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
},
bottomLinkContainer = new LinkFlowContainer(text => text.Font = text.Font.With(size: 12))
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
}
}
}
};
2019-04-25 17:42:19 +08:00
User.BindValueChanged(user => updateDisplay(user.NewValue));
}
2019-03-10 06:58:14 +08:00
private void updateDisplay(User user)
{
topLinkContainer.Clear();
bottomLinkContainer.Clear();
if (user == null) return;
if (user.JoinDate.ToUniversalTime().Year < 2008)
topLinkContainer.AddText("Here since the beginning");
else
{
topLinkContainer.AddText("Joined ");
2020-02-03 00:22:48 +08:00
topLinkContainer.AddText(new DrawableDate(user.JoinDate, italic: false), embolden);
}
addSpacer(topLinkContainer);
2019-06-19 00:13:21 +08:00
if (user.IsOnline)
{
topLinkContainer.AddText("Currently online");
addSpacer(topLinkContainer);
2019-06-19 00:13:21 +08:00
}
2019-06-19 02:04:36 +08:00
else if (user.LastVisit.HasValue)
{
topLinkContainer.AddText("Last seen ");
2020-02-03 00:22:48 +08:00
topLinkContainer.AddText(new DrawableDate(user.LastVisit.Value, italic: false), embolden);
addSpacer(topLinkContainer);
}
if (user.PlayStyles?.Length > 0)
{
topLinkContainer.AddText("Plays with ");
topLinkContainer.AddText(string.Join(", ", user.PlayStyles.Select(style => style.GetDescription())), embolden);
addSpacer(topLinkContainer);
}
topLinkContainer.AddText("Contributed ");
topLinkContainer.AddLink("forum post".ToQuantity(user.PostCount, "#,##0"), $"{api.WebsiteRootUrl}/users/{user.Id}/posts", creationParameters: embolden);
addSpacer(topLinkContainer);
topLinkContainer.AddText("Posted ");
topLinkContainer.AddLink("comment".ToQuantity(user.CommentsCount, "#,##0"), $"{api.WebsiteRootUrl}/comments?user_id={user.Id}", creationParameters: embolden);
2020-01-31 00:46:59 +08:00
string websiteWithoutProtocol = user.Website;
2020-01-31 00:46:59 +08:00
if (!string.IsNullOrEmpty(websiteWithoutProtocol))
{
2020-01-31 00:46:59 +08:00
if (Uri.TryCreate(websiteWithoutProtocol, UriKind.Absolute, out var uri))
2019-04-25 17:42:19 +08:00
{
2020-01-31 00:46:59 +08:00
websiteWithoutProtocol = uri.Host + uri.PathAndQuery + uri.Fragment;
websiteWithoutProtocol = websiteWithoutProtocol.TrimEnd('/');
2019-04-25 17:42:19 +08:00
}
}
bool anyInfoAdded = false;
anyInfoAdded |= tryAddInfo(FontAwesome.Solid.MapMarker, user.Location);
anyInfoAdded |= tryAddInfo(OsuIcon.Heart, user.Interests);
anyInfoAdded |= tryAddInfo(FontAwesome.Solid.Suitcase, user.Occupation);
2020-02-03 00:39:58 +08:00
if (anyInfoAdded)
bottomLinkContainer.NewLine();
if (!string.IsNullOrEmpty(user.Twitter))
anyInfoAdded |= tryAddInfo(FontAwesome.Brands.Twitter, "@" + user.Twitter, $@"https://twitter.com/{user.Twitter}");
anyInfoAdded |= tryAddInfo(FontAwesome.Brands.Discord, user.Discord);
anyInfoAdded |= tryAddInfo(FontAwesome.Solid.Link, websiteWithoutProtocol, user.Website);
// If no information was added to the bottomLinkContainer, hide it to avoid unwanted padding
2020-02-03 00:41:42 +08:00
bottomLinkContainer.Alpha = anyInfoAdded ? 1 : 0;
}
2019-04-25 17:42:19 +08:00
private void addSpacer(OsuTextFlowContainer textFlow) => textFlow.AddArbitraryDrawable(new Container { Width = 15 });
private bool tryAddInfo(IconUsage icon, string content, string link = null)
2019-04-25 17:42:19 +08:00
{
if (string.IsNullOrEmpty(content)) return false;
2019-08-15 13:38:49 +08:00
// newlines could be contained in API returned user content.
2020-10-16 17:52:29 +08:00
content = content.Replace('\n', ' ');
2019-08-15 13:38:49 +08:00
bottomLinkContainer.AddIcon(icon, text =>
2019-04-25 17:42:19 +08:00
{
text.Font = text.Font.With(size: 10);
text.Colour = iconColour;
});
if (link != null)
bottomLinkContainer.AddLink(" " + content, link, creationParameters: embolden);
2019-04-25 17:42:19 +08:00
else
bottomLinkContainer.AddText(" " + content, embolden);
2019-04-25 17:42:19 +08:00
addSpacer(bottomLinkContainer);
return true;
2019-04-25 17:42:19 +08:00
}
private void embolden(SpriteText text) => text.Font = text.Font.With(weight: FontWeight.Bold);
}
}