mirror of
https://github.com/ppy/osu.git
synced 2025-01-12 18:23:04 +08:00
Merge pull request #28017 from Joehuu/scrollable-text
Scroll now playing overlay text when overflowing
This commit is contained in:
commit
ecb9173e51
@ -6,6 +6,7 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Game.Rulesets.Osu;
|
using osu.Game.Rulesets.Osu;
|
||||||
|
|
||||||
@ -22,8 +23,6 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
{
|
{
|
||||||
Beatmap.Value = CreateWorkingBeatmap(new OsuRuleset().RulesetInfo);
|
|
||||||
|
|
||||||
nowPlayingOverlay = new NowPlayingOverlay
|
nowPlayingOverlay = new NowPlayingOverlay
|
||||||
{
|
{
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
@ -37,9 +36,38 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
[Test]
|
[Test]
|
||||||
public void TestShowHideDisable()
|
public void TestShowHideDisable()
|
||||||
{
|
{
|
||||||
|
AddStep(@"set beatmap", () => Beatmap.Value = CreateWorkingBeatmap(new OsuRuleset().RulesetInfo));
|
||||||
AddStep(@"show", () => nowPlayingOverlay.Show());
|
AddStep(@"show", () => nowPlayingOverlay.Show());
|
||||||
AddToggleStep(@"toggle beatmap lock", state => Beatmap.Disabled = state);
|
AddToggleStep(@"toggle beatmap lock", state => Beatmap.Disabled = state);
|
||||||
AddStep(@"hide", () => nowPlayingOverlay.Hide());
|
AddStep(@"hide", () => nowPlayingOverlay.Hide());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestLongMetadata()
|
||||||
|
{
|
||||||
|
AddStep(@"set metadata within tolerance", () => Beatmap.Value = CreateWorkingBeatmap(new Beatmap
|
||||||
|
{
|
||||||
|
Metadata =
|
||||||
|
{
|
||||||
|
Artist = "very very very very very very very very very very verry long artist",
|
||||||
|
ArtistUnicode = "very very very very very very very very very very verry long artist",
|
||||||
|
Title = "very very very very very verry long title",
|
||||||
|
TitleUnicode = "very very very very very verry long title",
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
AddStep(@"set metadata outside bounds", () => Beatmap.Value = CreateWorkingBeatmap(new Beatmap
|
||||||
|
{
|
||||||
|
Metadata =
|
||||||
|
{
|
||||||
|
Artist = "very very very very very very very very very very verrry long artist",
|
||||||
|
ArtistUnicode = "very very very very very very very very very very verrry long artist",
|
||||||
|
Title = "very very very very very verrry long title",
|
||||||
|
TitleUnicode = "very very very very very verrry long title",
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
AddStep(@"show", () => nowPlayingOverlay.Show());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ namespace osu.Game.Overlays
|
|||||||
public LocalisableString Title => NowPlayingStrings.HeaderTitle;
|
public LocalisableString Title => NowPlayingStrings.HeaderTitle;
|
||||||
public LocalisableString Description => NowPlayingStrings.HeaderDescription;
|
public LocalisableString Description => NowPlayingStrings.HeaderDescription;
|
||||||
|
|
||||||
|
private const float player_width = 400;
|
||||||
private const float player_height = 130;
|
private const float player_height = 130;
|
||||||
private const float transition_length = 800;
|
private const float transition_length = 800;
|
||||||
private const float progress_height = 10;
|
private const float progress_height = 10;
|
||||||
@ -47,7 +48,7 @@ namespace osu.Game.Overlays
|
|||||||
private IconButton nextButton = null!;
|
private IconButton nextButton = null!;
|
||||||
private IconButton playlistButton = null!;
|
private IconButton playlistButton = null!;
|
||||||
|
|
||||||
private SpriteText title = null!, artist = null!;
|
private ScrollingTextContainer title = null!, artist = null!;
|
||||||
|
|
||||||
private PlaylistOverlay? playlist;
|
private PlaylistOverlay? playlist;
|
||||||
|
|
||||||
@ -70,7 +71,7 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
public NowPlayingOverlay()
|
public NowPlayingOverlay()
|
||||||
{
|
{
|
||||||
Width = 400;
|
Width = player_width;
|
||||||
Margin = new MarginPadding(margin);
|
Margin = new MarginPadding(margin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +102,7 @@ namespace osu.Game.Overlays
|
|||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
background = Empty(),
|
background = Empty(),
|
||||||
title = new OsuSpriteText
|
title = new ScrollingTextContainer
|
||||||
{
|
{
|
||||||
Origin = Anchor.BottomCentre,
|
Origin = Anchor.BottomCentre,
|
||||||
Anchor = Anchor.TopCentre,
|
Anchor = Anchor.TopCentre,
|
||||||
@ -110,7 +111,7 @@ namespace osu.Game.Overlays
|
|||||||
Colour = Color4.White,
|
Colour = Color4.White,
|
||||||
Text = @"Nothing to play",
|
Text = @"Nothing to play",
|
||||||
},
|
},
|
||||||
artist = new OsuSpriteText
|
artist = new ScrollingTextContainer
|
||||||
{
|
{
|
||||||
Origin = Anchor.TopCentre,
|
Origin = Anchor.TopCentre,
|
||||||
Anchor = Anchor.TopCentre,
|
Anchor = Anchor.TopCentre,
|
||||||
@ -319,15 +320,15 @@ namespace osu.Game.Overlays
|
|||||||
switch (direction)
|
switch (direction)
|
||||||
{
|
{
|
||||||
case TrackChangeDirection.Next:
|
case TrackChangeDirection.Next:
|
||||||
newBackground.Position = new Vector2(400, 0);
|
newBackground.Position = new Vector2(player_width, 0);
|
||||||
newBackground.MoveToX(0, 500, Easing.OutCubic);
|
newBackground.MoveToX(0, 500, Easing.OutCubic);
|
||||||
background.MoveToX(-400, 500, Easing.OutCubic);
|
background.MoveToX(-player_width, 500, Easing.OutCubic);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TrackChangeDirection.Prev:
|
case TrackChangeDirection.Prev:
|
||||||
newBackground.Position = new Vector2(-400, 0);
|
newBackground.Position = new Vector2(-player_width, 0);
|
||||||
newBackground.MoveToX(0, 500, Easing.OutCubic);
|
newBackground.MoveToX(0, 500, Easing.OutCubic);
|
||||||
background.MoveToX(400, 500, Easing.OutCubic);
|
background.MoveToX(player_width, 500, Easing.OutCubic);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -469,5 +470,103 @@ namespace osu.Game.Overlays
|
|||||||
base.OnHoverLost(e);
|
base.OnHoverLost(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private partial class ScrollingTextContainer : CompositeDrawable
|
||||||
|
{
|
||||||
|
private const float initial_move_delay = 1000;
|
||||||
|
private const float pixels_per_second = 50;
|
||||||
|
|
||||||
|
private OsuSpriteText mainSpriteText = null!;
|
||||||
|
private OsuSpriteText fillerSpriteText = null!;
|
||||||
|
|
||||||
|
private LocalisableString text;
|
||||||
|
|
||||||
|
public LocalisableString Text
|
||||||
|
{
|
||||||
|
get => text;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
text = value;
|
||||||
|
|
||||||
|
if (IsLoaded)
|
||||||
|
updateText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private FontUsage font = OsuFont.Default;
|
||||||
|
|
||||||
|
public FontUsage Font
|
||||||
|
{
|
||||||
|
get => font;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
font = value;
|
||||||
|
|
||||||
|
if (IsLoaded)
|
||||||
|
updateFontAndText();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScrollingTextContainer()
|
||||||
|
{
|
||||||
|
AutoSizeAxes = Axes.Both;
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
InternalChild = new FillFlowContainer<OsuSpriteText>
|
||||||
|
{
|
||||||
|
AutoSizeAxes = Axes.Both,
|
||||||
|
Direction = FillDirection.Horizontal,
|
||||||
|
Children = new[]
|
||||||
|
{
|
||||||
|
mainSpriteText = new OsuSpriteText { Padding = new MarginPadding { Horizontal = margin } },
|
||||||
|
fillerSpriteText = new OsuSpriteText { Padding = new MarginPadding { Horizontal = margin }, Alpha = 0 },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
|
||||||
|
updateFontAndText();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateFontAndText()
|
||||||
|
{
|
||||||
|
mainSpriteText.Font = font;
|
||||||
|
fillerSpriteText.Font = font;
|
||||||
|
|
||||||
|
updateText();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateText()
|
||||||
|
{
|
||||||
|
mainSpriteText.Text = text;
|
||||||
|
fillerSpriteText.Alpha = 0;
|
||||||
|
|
||||||
|
ClearTransforms();
|
||||||
|
X = 0;
|
||||||
|
|
||||||
|
float textOverflowWidth = mainSpriteText.Width - player_width;
|
||||||
|
|
||||||
|
// apply half margin of tolerance on both sides before the text scrolls
|
||||||
|
if (textOverflowWidth > margin)
|
||||||
|
{
|
||||||
|
fillerSpriteText.Alpha = 1;
|
||||||
|
fillerSpriteText.Text = text;
|
||||||
|
|
||||||
|
float initialX = (textOverflowWidth + mainSpriteText.Width) / 2;
|
||||||
|
float targetX = (textOverflowWidth - mainSpriteText.Width) / 2;
|
||||||
|
|
||||||
|
this.MoveToX(initialX)
|
||||||
|
.Delay(initial_move_delay)
|
||||||
|
.MoveToX(targetX, mainSpriteText.Width * 1000 / pixels_per_second)
|
||||||
|
.Loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user