1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-30 14:53:20 +08:00
osu-lazer/osu.Game/Rulesets/UI/ModIcon.cs

221 lines
7.6 KiB
C#
Raw Normal View History

// 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.
2018-04-13 17:19:50 +08:00
using System;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Extensions.Color4Extensions;
2018-04-13 17:19:50 +08:00
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures;
using osu.Framework.Localisation;
using osu.Framework.Utils;
using osu.Game.Configuration;
2018-04-13 17:19:50 +08:00
using osu.Game.Graphics;
2020-01-14 21:22:00 +08:00
using osu.Game.Graphics.Sprites;
2018-04-13 17:19:50 +08:00
using osu.Game.Rulesets.Mods;
2018-11-20 15:51:59 +08:00
using osuTK;
using osuTK.Graphics;
2018-04-13 17:19:50 +08:00
namespace osu.Game.Rulesets.UI
{
2021-01-26 18:11:19 +08:00
/// <summary>
/// Display the specified mod at a fixed size.
/// </summary>
2022-11-24 13:32:20 +08:00
public partial class ModIcon : Container, IHasTooltip
2018-04-13 17:19:50 +08:00
{
2019-11-22 01:34:19 +08:00
public readonly BindableBool Selected = new BindableBool();
2019-08-07 13:42:43 +08:00
2023-09-28 15:19:06 +08:00
private SpriteIcon modIcon = null!;
private SpriteText modAcronym = null!;
private Sprite background = null!;
2018-04-13 17:19:50 +08:00
public static readonly Vector2 MOD_ICON_SIZE = new Vector2(80);
2018-04-13 17:19:50 +08:00
2023-09-28 15:19:06 +08:00
public virtual LocalisableString TooltipText => showTooltip ? ((mod as Mod)?.IconTooltip ?? mod.Name) : string.Empty;
2018-04-13 17:19:50 +08:00
private IMod mod;
2021-01-26 18:11:19 +08:00
private readonly bool showTooltip;
private readonly bool showExtendedInformation;
2020-01-14 20:11:32 +08:00
public IMod Mod
2020-01-14 20:11:32 +08:00
{
get => mod;
2020-01-14 21:22:00 +08:00
set
{
if (mod == value)
return;
2020-01-14 21:22:00 +08:00
mod = value;
if (IsLoaded)
updateMod(value);
2020-01-14 21:22:00 +08:00
}
2020-01-14 20:11:32 +08:00
}
[Resolved]
2023-09-28 15:19:06 +08:00
private OsuColour colours { get; set; } = null!;
private Color4 backgroundColour;
2023-09-28 15:19:06 +08:00
private Sprite extendedBackground = null!;
2023-09-28 15:19:06 +08:00
private OsuSpriteText extendedText = null!;
2023-09-28 15:19:06 +08:00
private Container extendedContent = null!;
2023-09-28 15:19:06 +08:00
private ModSettingChangeTracker? modSettingsChangeTracker;
2021-01-26 18:11:19 +08:00
/// <summary>
/// Construct a new instance.
/// </summary>
/// <param name="mod">The mod to be displayed</param>
/// <param name="showTooltip">Whether a tooltip describing the mod should display on hover.</param>
/// <param name="showExtendedInformation">Whether to display a mod's extended information, if available.</param>
public ModIcon(IMod mod, bool showTooltip = true, bool showExtendedInformation = true)
2018-04-13 17:19:50 +08:00
{
// May expand due to expanded content, so autosize here.
AutoSizeAxes = Axes.X;
Height = MOD_ICON_SIZE.Y;
2020-01-14 21:22:00 +08:00
this.mod = mod ?? throw new ArgumentNullException(nameof(mod));
2021-01-26 18:11:19 +08:00
this.showTooltip = showTooltip;
this.showExtendedInformation = showExtendedInformation;
}
2018-04-13 17:19:50 +08:00
[BackgroundDependencyLoader]
private void load(TextureStore textures)
{
2018-04-13 17:19:50 +08:00
Children = new Drawable[]
{
extendedContent = new Container
{
Name = "extended content",
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
Size = new Vector2(116, MOD_ICON_SIZE.Y),
X = MOD_ICON_SIZE.X - 22,
Children = new Drawable[]
{
extendedBackground = new Sprite
{
RelativeSizeAxes = Axes.Both,
FillMode = FillMode.Fit,
Texture = textures.Get("Icons/BeatmapDetails/mod-icon-extender"),
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
},
extendedText = new OsuSpriteText
{
Font = OsuFont.Default.With(size: 34f, weight: FontWeight.Bold),
UseFullGlyphHeight = false,
Text = mod.ExtendedIconInformation,
2023-09-28 21:23:45 +08:00
X = 6,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
},
}
},
new Container
2018-04-13 17:19:50 +08:00
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
Name = "main content",
Size = MOD_ICON_SIZE,
Children = new Drawable[]
{
background = new Sprite
{
RelativeSizeAxes = Axes.Both,
FillMode = FillMode.Fit,
Texture = textures.Get("Icons/BeatmapDetails/mod-icon"),
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
},
modAcronym = new OsuSpriteText
{
Origin = Anchor.Centre,
Anchor = Anchor.Centre,
Alpha = 0,
2024-08-26 11:42:57 +08:00
Font = OsuFont.Numeric.With(size: 22f, weight: FontWeight.Black),
UseFullGlyphHeight = false,
Text = mod.Acronym
},
modIcon = new SpriteIcon
{
Origin = Anchor.Centre,
Anchor = Anchor.Centre,
Size = new Vector2(45),
Icon = FontAwesome.Solid.Question
},
}
2018-04-13 17:19:50 +08:00
},
};
}
protected override void LoadComplete()
{
base.LoadComplete();
Selected.BindValueChanged(_ => updateColour());
2020-01-14 21:22:00 +08:00
updateMod(mod);
}
private void updateMod(IMod value)
2020-01-14 21:22:00 +08:00
{
modSettingsChangeTracker?.Dispose();
if (value is Mod actualMod)
{
modSettingsChangeTracker = new ModSettingChangeTracker(new[] { actualMod });
modSettingsChangeTracker.SettingChanged = _ => updateExtendedInformation();
}
2020-01-14 21:22:00 +08:00
modAcronym.Text = value.Acronym;
modIcon.Icon = value.Icon ?? FontAwesome.Solid.Question;
if (value.Icon == null)
2020-01-14 21:22:00 +08:00
{
modIcon.FadeOut();
modAcronym.FadeIn();
}
else
{
modIcon.FadeIn();
modAcronym.FadeOut();
2020-01-14 21:22:00 +08:00
}
backgroundColour = colours.ForModType(value.Type);
updateColour();
updateExtendedInformation();
}
private void updateExtendedInformation()
{
bool showExtended = showExtendedInformation && !string.IsNullOrEmpty(mod.ExtendedIconInformation);
extendedContent.Alpha = showExtended ? 1 : 0;
extendedText.Text = mod.ExtendedIconInformation;
2018-04-13 17:19:50 +08:00
}
private void updateColour()
2018-04-13 17:19:50 +08:00
{
modAcronym.Colour = modIcon.Colour = Interpolation.ValueAt<Colour4>(0.1f, Colour4.Black, backgroundColour, 0, 1);
2023-11-06 18:24:56 +08:00
extendedText.Colour = background.Colour = Selected.Value ? backgroundColour.Lighten(0.2f) : backgroundColour;
extendedBackground.Colour = Selected.Value ? backgroundColour.Darken(2.4f) : backgroundColour.Darken(2.8f);
2018-04-13 17:19:50 +08:00
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
modSettingsChangeTracker?.Dispose();
}
2018-04-13 17:19:50 +08:00
}
}