Simplify user graph tooltips logic

The same tooltip can be used for the rank graph, the play history graph,
and the replay history graph.

The only difference between those three is the displayed label, which
has now been included as part of the `TooltipContent`, rather than
unnecessarily recreating tooltips just for different sprite texts.
This commit is contained in:
Salman Ahmed
2021-08-28 19:11:44 +03:00
parent d6a0d2aa44
commit 208f66cc76
3 changed files with 32 additions and 79 deletions

View File

@ -8,7 +8,6 @@ using Humanizer;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Extensions.LocalisationExtensions; using osu.Framework.Extensions.LocalisationExtensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Localisation;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using osu.Game.Resources.Localisation.Web; using osu.Game.Resources.Localisation.Web;
@ -61,40 +60,16 @@ namespace osu.Game.Overlays.Profile.Header.Components
placeholder.FadeIn(FADE_DURATION, Easing.Out); placeholder.FadeIn(FADE_DURATION, Easing.Out);
} }
protected override object GetTooltipContent(int index, int rank) protected override UserGraphTooltipContent GetTooltipContent(int index, int rank)
{ {
var days = ranked_days - index + 1; var days = ranked_days - index + 1;
return new TooltipDisplayContent return new UserGraphTooltipContent
{ {
Rank = rank.ToLocalisableString("\\##,##0"), Name = UsersStrings.ShowRankGlobalSimple,
Count = rank.ToLocalisableString("\\##,##0"),
Time = days == 0 ? "now" : $"{"day".ToQuantity(days)} ago" Time = days == 0 ? "now" : $"{"day".ToQuantity(days)} ago"
}; };
} }
protected override UserGraphTooltip GetTooltip() => new RankGraphTooltip();
private class RankGraphTooltip : UserGraphTooltip
{
public RankGraphTooltip()
: base(UsersStrings.ShowRankGlobalSimple)
{
}
public override void SetContent(object content)
{
if (!(content is TooltipDisplayContent info))
return;
Counter.Text = info.Rank;
BottomText.Text = info.Time;
}
}
private class TooltipDisplayContent
{
public LocalisableString Rank;
public string Time;
}
} }
} }

View File

@ -28,43 +28,11 @@ namespace osu.Game.Overlays.Profile.Sections.Historical
protected override float GetDataPointHeight(long playCount) => playCount; protected override float GetDataPointHeight(long playCount) => playCount;
protected override UserGraphTooltip GetTooltip() => new HistoryGraphTooltip(tooltipCounterName); protected override UserGraphTooltipContent GetTooltipContent(DateTime date, long playCount) => new UserGraphTooltipContent
protected override object GetTooltipContent(DateTime date, long playCount)
{
return new TooltipDisplayContent
{ {
Name = tooltipCounterName, Name = tooltipCounterName,
Count = playCount.ToLocalisableString("N0"), Count = playCount.ToLocalisableString("N0"),
Date = date.ToLocalisableString("MMMM yyyy") Time = date.ToLocalisableString("MMMM yyyy")
}; };
} }
protected class HistoryGraphTooltip : UserGraphTooltip
{
private readonly LocalisableString tooltipCounterName;
public HistoryGraphTooltip(LocalisableString tooltipCounterName)
: base(tooltipCounterName)
{
this.tooltipCounterName = tooltipCounterName;
}
public override void SetContent(object content)
{
if (!(content is TooltipDisplayContent info) || info.Name != tooltipCounterName)
return;
Counter.Text = info.Count;
BottomText.Text = info.Date;
}
}
private class TooltipDisplayContent
{
public LocalisableString Name;
public LocalisableString Count;
public LocalisableString Date;
}
}
} }

View File

@ -24,7 +24,7 @@ namespace osu.Game.Overlays.Profile
/// </summary> /// </summary>
/// <typeparam name="TKey">Type of data to be used for X-axis of the graph.</typeparam> /// <typeparam name="TKey">Type of data to be used for X-axis of the graph.</typeparam>
/// <typeparam name="TValue">Type of data to be used for Y-axis of the graph.</typeparam> /// <typeparam name="TValue">Type of data to be used for Y-axis of the graph.</typeparam>
public abstract class UserGraph<TKey, TValue> : Container, IHasCustomTooltip public abstract class UserGraph<TKey, TValue> : Container, IHasCustomTooltip<UserGraphTooltipContent>
{ {
protected const float FADE_DURATION = 150; protected const float FADE_DURATION = 150;
@ -118,23 +118,21 @@ namespace osu.Game.Overlays.Profile
protected virtual void ShowGraph() => graph.FadeIn(FADE_DURATION, Easing.Out); protected virtual void ShowGraph() => graph.FadeIn(FADE_DURATION, Easing.Out);
protected virtual void HideGraph() => graph.FadeOut(FADE_DURATION, Easing.Out); protected virtual void HideGraph() => graph.FadeOut(FADE_DURATION, Easing.Out);
public ITooltip GetCustomTooltip() => GetTooltip(); public ITooltip<UserGraphTooltipContent> GetCustomTooltip() => new UserGraphTooltip();
protected abstract UserGraphTooltip GetTooltip(); public UserGraphTooltipContent TooltipContent
public object TooltipContent
{ {
get get
{ {
if (data == null || hoveredIndex == -1) if (data == null || hoveredIndex == -1)
return null; return default;
var (key, value) = data[hoveredIndex]; var (key, value) = data[hoveredIndex];
return GetTooltipContent(key, value); return GetTooltipContent(key, value);
} }
} }
protected abstract object GetTooltipContent(TKey key, TValue value); protected abstract UserGraphTooltipContent GetTooltipContent(TKey key, TValue value);
protected class UserLineGraph : LineGraph protected class UserLineGraph : LineGraph
{ {
@ -207,12 +205,12 @@ namespace osu.Game.Overlays.Profile
} }
} }
protected abstract class UserGraphTooltip : VisibilityContainer, ITooltip private class UserGraphTooltip : VisibilityContainer, ITooltip<UserGraphTooltipContent>
{ {
protected readonly OsuSpriteText Counter, BottomText; protected readonly OsuSpriteText Label, Counter, BottomText;
private readonly Box background; private readonly Box background;
protected UserGraphTooltip(LocalisableString tooltipCounterName) public UserGraphTooltip()
{ {
AutoSizeAxes = Axes.Both; AutoSizeAxes = Axes.Both;
Masking = true; Masking = true;
@ -238,10 +236,9 @@ namespace osu.Game.Overlays.Profile
Spacing = new Vector2(3, 0), Spacing = new Vector2(3, 0),
Children = new Drawable[] Children = new Drawable[]
{ {
new OsuSpriteText Label = new OsuSpriteText
{ {
Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold), Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold),
Text = tooltipCounterName
}, },
Counter = new OsuSpriteText Counter = new OsuSpriteText
{ {
@ -268,7 +265,12 @@ namespace osu.Game.Overlays.Profile
background.Colour = colours.Gray1; background.Colour = colours.Gray1;
} }
public abstract void SetContent(object content); public void SetContent(UserGraphTooltipContent content)
{
Label.Text = content.Name;
Counter.Text = content.Count;
BottomText.Text = content.Time;
}
private bool instantMove = true; private bool instantMove = true;
@ -292,4 +294,12 @@ namespace osu.Game.Overlays.Profile
protected override void PopOut() => this.FadeOut(200, Easing.OutQuint); protected override void PopOut() => this.FadeOut(200, Easing.OutQuint);
} }
} }
public class UserGraphTooltipContent
{
// todo: change to init-only on C# 9
public LocalisableString Name { get; set; }
public LocalisableString Count { get; set; }
public LocalisableString Time { get; set; }
}
} }