From af1c54d995f10429fff030f1393511a95304fc28 Mon Sep 17 00:00:00 2001 From: jorolf Date: Fri, 8 Mar 2019 23:44:01 +0100 Subject: [PATCH 1/7] add ScreenTitle class --- .../Graphics/UserInterface/ScreenTitle.cs | 73 +++++++++++++++++++ osu.Game/Screens/Multi/Header.cs | 41 ++--------- 2 files changed, 79 insertions(+), 35 deletions(-) create mode 100644 osu.Game/Graphics/UserInterface/ScreenTitle.cs diff --git a/osu.Game/Graphics/UserInterface/ScreenTitle.cs b/osu.Game/Graphics/UserInterface/ScreenTitle.cs new file mode 100644 index 0000000000..d931d2561a --- /dev/null +++ b/osu.Game/Graphics/UserInterface/ScreenTitle.cs @@ -0,0 +1,73 @@ +// Copyright (c) ppy Pty Ltd . 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 osu.Game.Graphics.Sprites; +using osuTK; +using osuTK.Graphics; + +namespace osu.Game.Graphics.UserInterface +{ + public class ScreenTitle : CompositeDrawable, IHasAccentColour + { + private readonly SpriteIcon iconSprite; + private readonly OsuSpriteText titleText, pageText; + + public FontAwesome Icon + { + get => iconSprite.Icon; + set => iconSprite.Icon = value; + } + + public string Title + { + get => titleText.Text; + set => titleText.Text = value; + } + + public string Page + { + get => pageText.Text; + set => pageText.Text = value; + } + + public Color4 AccentColour + { + get => pageText.Colour; + set => pageText.Colour = value; + } + + public ScreenTitle() + { + AutoSizeAxes = Axes.Both; + + InternalChildren = new Drawable[] + { + iconSprite = new SpriteIcon + { + Size = new Vector2(25), + Anchor = Anchor.TopLeft, + Origin = Anchor.TopRight, + Margin = new MarginPadding { Right = 10 }, + }, + new FillFlowContainer + { + AutoSizeAxes = Axes.Both, + Direction = FillDirection.Horizontal, + Children = new[] + { + titleText = new OsuSpriteText + { + Font = OsuFont.GetFont(size: 25), + }, + pageText = new OsuSpriteText + { + Font = OsuFont.GetFont(size: 25), + } + } + } + }; + } + } +} diff --git a/osu.Game/Screens/Multi/Header.cs b/osu.Game/Screens/Multi/Header.cs index 0e958bf523..668b2f5995 100644 --- a/osu.Game/Screens/Multi/Header.cs +++ b/osu.Game/Screens/Multi/Header.cs @@ -7,10 +7,8 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osu.Framework.Screens; using osu.Game.Graphics; -using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; using osu.Game.Overlays.SearchableList; -using osuTK; using osuTK.Graphics; namespace osu.Game.Screens.Multi @@ -19,7 +17,7 @@ namespace osu.Game.Screens.Multi { public const float HEIGHT = 121; - private readonly OsuSpriteText screenType; + private readonly ScreenTitle title; private readonly HeaderBreadcrumbControl breadcrumbs; public Header(ScreenStack stack) @@ -40,39 +38,12 @@ namespace osu.Game.Screens.Multi Padding = new MarginPadding { Horizontal = SearchableListOverlay.WIDTH_PADDING + OsuScreen.HORIZONTAL_OVERFLOW_PADDING }, Children = new Drawable[] { - new FillFlowContainer + title = new ScreenTitle { Anchor = Anchor.CentreLeft, Origin = Anchor.BottomLeft, - Position = new Vector2(-35f, 5f), - AutoSizeAxes = Axes.Both, - Direction = FillDirection.Horizontal, - Spacing = new Vector2(10f, 0f), - Children = new Drawable[] - { - new SpriteIcon - { - Size = new Vector2(25), - Icon = FontAwesome.fa_osu_multi, - }, - new FillFlowContainer - { - AutoSizeAxes = Axes.Both, - Direction = FillDirection.Horizontal, - Children = new[] - { - new OsuSpriteText - { - Text = "multiplayer ", - Font = OsuFont.GetFont(size: 25) - }, - screenType = new OsuSpriteText - { - Font = OsuFont.GetFont(weight: FontWeight.Light, size: 25) - }, - }, - }, - }, + Icon = FontAwesome.fa_osu_multi, + Title = "multiplayer ", }, breadcrumbs = new HeaderBreadcrumbControl(stack) { @@ -87,7 +58,7 @@ namespace osu.Game.Screens.Multi breadcrumbs.Current.ValueChanged += scren => { if (scren.NewValue is IMultiplayerSubScreen multiScreen) - screenType.Text = multiScreen.ShortTitle.ToLowerInvariant(); + title.Page = multiScreen.ShortTitle.ToLowerInvariant(); }; breadcrumbs.Current.TriggerChange(); @@ -96,7 +67,7 @@ namespace osu.Game.Screens.Multi [BackgroundDependencyLoader] private void load(OsuColour colours) { - screenType.Colour = colours.Yellow; + title.AccentColour = colours.Yellow; breadcrumbs.StripColour = colours.Green; } From f3ab5070b97e1845c8af1a7270f30058f081c790 Mon Sep 17 00:00:00 2001 From: jorolf Date: Mon, 11 Mar 2019 18:37:36 +0100 Subject: [PATCH 2/7] apply suggestions --- .../Graphics/UserInterface/ScreenTitle.cs | 3 ++- osu.Game/Screens/Multi/Header.cs | 22 +++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/ScreenTitle.cs b/osu.Game/Graphics/UserInterface/ScreenTitle.cs index d931d2561a..d7cba06d9d 100644 --- a/osu.Game/Graphics/UserInterface/ScreenTitle.cs +++ b/osu.Game/Graphics/UserInterface/ScreenTitle.cs @@ -26,7 +26,7 @@ namespace osu.Game.Graphics.UserInterface set => titleText.Text = value; } - public string Page + public string Section { get => pageText.Text; set => pageText.Text = value; @@ -55,6 +55,7 @@ namespace osu.Game.Graphics.UserInterface { AutoSizeAxes = Axes.Both, Direction = FillDirection.Horizontal, + Spacing = new Vector2(6, 0), Children = new[] { titleText = new OsuSpriteText diff --git a/osu.Game/Screens/Multi/Header.cs b/osu.Game/Screens/Multi/Header.cs index 668b2f5995..bb4acc6007 100644 --- a/osu.Game/Screens/Multi/Header.cs +++ b/osu.Game/Screens/Multi/Header.cs @@ -17,11 +17,11 @@ namespace osu.Game.Screens.Multi { public const float HEIGHT = 121; - private readonly ScreenTitle title; private readonly HeaderBreadcrumbControl breadcrumbs; public Header(ScreenStack stack) { + ScreenTitle title; RelativeSizeAxes = Axes.X; Height = HEIGHT; @@ -38,12 +38,12 @@ namespace osu.Game.Screens.Multi Padding = new MarginPadding { Horizontal = SearchableListOverlay.WIDTH_PADDING + OsuScreen.HORIZONTAL_OVERFLOW_PADDING }, Children = new Drawable[] { - title = new ScreenTitle + title = new MultiHeaderTitle { Anchor = Anchor.CentreLeft, Origin = Anchor.BottomLeft, Icon = FontAwesome.fa_osu_multi, - Title = "multiplayer ", + Title = "multiplayer", }, breadcrumbs = new HeaderBreadcrumbControl(stack) { @@ -55,10 +55,10 @@ namespace osu.Game.Screens.Multi }, }; - breadcrumbs.Current.ValueChanged += scren => + breadcrumbs.Current.ValueChanged += screen => { - if (scren.NewValue is IMultiplayerSubScreen multiScreen) - title.Page = multiScreen.ShortTitle.ToLowerInvariant(); + if (screen.NewValue is IMultiplayerSubScreen multiScreen) + title.Section = multiScreen.ShortTitle.ToLowerInvariant(); }; breadcrumbs.Current.TriggerChange(); @@ -67,10 +67,18 @@ namespace osu.Game.Screens.Multi [BackgroundDependencyLoader] private void load(OsuColour colours) { - title.AccentColour = colours.Yellow; breadcrumbs.StripColour = colours.Green; } + private class MultiHeaderTitle : ScreenTitle + { + [BackgroundDependencyLoader] + private void load(OsuColour colours) + { + AccentColour = colours.Yellow; + } + } + private class HeaderBreadcrumbControl : ScreenBreadcrumbControl { public HeaderBreadcrumbControl(ScreenStack stack) From f91e4a1fdd0783976594915228b5f9bc49c48d4e Mon Sep 17 00:00:00 2001 From: jorolf Date: Mon, 11 Mar 2019 19:10:37 +0100 Subject: [PATCH 3/7] make ScreenTitle abstract and properties protected --- osu.Game/Graphics/UserInterface/ScreenTitle.cs | 10 +++++----- osu.Game/Screens/Multi/Header.cs | 13 +++++++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/ScreenTitle.cs b/osu.Game/Graphics/UserInterface/ScreenTitle.cs index d7cba06d9d..14c87bb59d 100644 --- a/osu.Game/Graphics/UserInterface/ScreenTitle.cs +++ b/osu.Game/Graphics/UserInterface/ScreenTitle.cs @@ -9,24 +9,24 @@ using osuTK.Graphics; namespace osu.Game.Graphics.UserInterface { - public class ScreenTitle : CompositeDrawable, IHasAccentColour + public abstract class ScreenTitle : CompositeDrawable, IHasAccentColour { private readonly SpriteIcon iconSprite; private readonly OsuSpriteText titleText, pageText; - public FontAwesome Icon + protected FontAwesome Icon { get => iconSprite.Icon; set => iconSprite.Icon = value; } - public string Title + protected string Title { get => titleText.Text; set => titleText.Text = value; } - public string Section + protected string Section { get => pageText.Text; set => pageText.Text = value; @@ -38,7 +38,7 @@ namespace osu.Game.Graphics.UserInterface set => pageText.Colour = value; } - public ScreenTitle() + protected ScreenTitle() { AutoSizeAxes = Axes.Both; diff --git a/osu.Game/Screens/Multi/Header.cs b/osu.Game/Screens/Multi/Header.cs index bb4acc6007..0f945d107f 100644 --- a/osu.Game/Screens/Multi/Header.cs +++ b/osu.Game/Screens/Multi/Header.cs @@ -21,7 +21,7 @@ namespace osu.Game.Screens.Multi public Header(ScreenStack stack) { - ScreenTitle title; + MultiHeaderTitle title; RelativeSizeAxes = Axes.X; Height = HEIGHT; @@ -42,8 +42,6 @@ namespace osu.Game.Screens.Multi { Anchor = Anchor.CentreLeft, Origin = Anchor.BottomLeft, - Icon = FontAwesome.fa_osu_multi, - Title = "multiplayer", }, breadcrumbs = new HeaderBreadcrumbControl(stack) { @@ -58,7 +56,7 @@ namespace osu.Game.Screens.Multi breadcrumbs.Current.ValueChanged += screen => { if (screen.NewValue is IMultiplayerSubScreen multiScreen) - title.Section = multiScreen.ShortTitle.ToLowerInvariant(); + title.Screen = multiScreen; }; breadcrumbs.Current.TriggerChange(); @@ -72,9 +70,16 @@ namespace osu.Game.Screens.Multi private class MultiHeaderTitle : ScreenTitle { + public IMultiplayerSubScreen Screen + { + set => Section = value.ShortTitle.ToLowerInvariant(); + } + [BackgroundDependencyLoader] private void load(OsuColour colours) { + Title = "multiplayer"; + Icon = FontAwesome.fa_osu_multi; AccentColour = colours.Yellow; } } From 454c82c49eb77c228f50c60182ae87b24ec819b2 Mon Sep 17 00:00:00 2001 From: jorolf Date: Thu, 21 Mar 2019 22:18:45 +0100 Subject: [PATCH 4/7] Don't go outside of the container bounds --- .../Graphics/UserInterface/ScreenTitle.cs | 35 +++++++++++-------- osu.Game/Screens/Multi/Header.cs | 1 + 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/ScreenTitle.cs b/osu.Game/Graphics/UserInterface/ScreenTitle.cs index 14c87bb59d..dd0b06f969 100644 --- a/osu.Game/Graphics/UserInterface/ScreenTitle.cs +++ b/osu.Game/Graphics/UserInterface/ScreenTitle.cs @@ -44,30 +44,35 @@ namespace osu.Game.Graphics.UserInterface InternalChildren = new Drawable[] { - iconSprite = new SpriteIcon - { - Size = new Vector2(25), - Anchor = Anchor.TopLeft, - Origin = Anchor.TopRight, - Margin = new MarginPadding { Right = 10 }, - }, new FillFlowContainer { AutoSizeAxes = Axes.Both, - Direction = FillDirection.Horizontal, - Spacing = new Vector2(6, 0), - Children = new[] + Spacing = new Vector2(10, 0), + Children = new Drawable[] { - titleText = new OsuSpriteText + iconSprite = new SpriteIcon { - Font = OsuFont.GetFont(size: 25), + Size = new Vector2(25), }, - pageText = new OsuSpriteText + new FillFlowContainer { - Font = OsuFont.GetFont(size: 25), + AutoSizeAxes = Axes.Both, + Direction = FillDirection.Horizontal, + Spacing = new Vector2(6, 0), + Children = new[] + { + titleText = new OsuSpriteText + { + Font = OsuFont.GetFont(size: 25), + }, + pageText = new OsuSpriteText + { + Font = OsuFont.GetFont(size: 25), + } + } } } - } + }, }; } } diff --git a/osu.Game/Screens/Multi/Header.cs b/osu.Game/Screens/Multi/Header.cs index 0f945d107f..3b9bd7ca4a 100644 --- a/osu.Game/Screens/Multi/Header.cs +++ b/osu.Game/Screens/Multi/Header.cs @@ -42,6 +42,7 @@ namespace osu.Game.Screens.Multi { Anchor = Anchor.CentreLeft, Origin = Anchor.BottomLeft, + X = -35, }, breadcrumbs = new HeaderBreadcrumbControl(stack) { From 3e28c4ae0acb1777ad0d36c483456fe3c8b4bcdf Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Mar 2019 14:03:00 +0900 Subject: [PATCH 5/7] Fix remaining IconUsage changes --- osu.Game/Graphics/UserInterface/ScreenTitle.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game/Graphics/UserInterface/ScreenTitle.cs b/osu.Game/Graphics/UserInterface/ScreenTitle.cs index dd0b06f969..1574023068 100644 --- a/osu.Game/Graphics/UserInterface/ScreenTitle.cs +++ b/osu.Game/Graphics/UserInterface/ScreenTitle.cs @@ -3,6 +3,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; using osu.Game.Graphics.Sprites; using osuTK; using osuTK.Graphics; @@ -14,7 +15,7 @@ namespace osu.Game.Graphics.UserInterface private readonly SpriteIcon iconSprite; private readonly OsuSpriteText titleText, pageText; - protected FontAwesome Icon + protected IconUsage Icon { get => iconSprite.Icon; set => iconSprite.Icon = value; From cabec85544de138ac493dd00bd447e67956cdb59 Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Fri, 29 Mar 2019 14:15:57 +0900 Subject: [PATCH 6/7] Rework TestCaseLoaderAnimation to avoid timing issues --- .../Visual/Menus/TestCaseLoaderAnimation.cs | 87 +++++++++++-------- 1 file changed, 51 insertions(+), 36 deletions(-) diff --git a/osu.Game.Tests/Visual/Menus/TestCaseLoaderAnimation.cs b/osu.Game.Tests/Visual/Menus/TestCaseLoaderAnimation.cs index 1686436924..df12e14891 100644 --- a/osu.Game.Tests/Visual/Menus/TestCaseLoaderAnimation.cs +++ b/osu.Game.Tests/Visual/Menus/TestCaseLoaderAnimation.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Threading; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Graphics; @@ -22,55 +23,76 @@ namespace osu.Game.Tests.Visual.Menus public TestCaseLoaderAnimation() { - Add(logo = new OsuLogo { Depth = float.MinValue }); + Child = logo = new OsuLogo { Depth = float.MinValue }; } - protected override void LoadComplete() + [Test] + public void TestInstantLoad() { - base.LoadComplete(); - bool logoVisible = false; - AddStep("almost instant display", () => LoadScreen(loader = new TestLoader(250))); - AddUntilStep("loaded", () => - { - logoVisible = loader.Logo?.Alpha > 0; - return loader.Logo != null && loader.ScreenLoaded; - }); - AddAssert("logo not visible", () => !logoVisible); - AddStep("short load", () => LoadScreen(loader = new TestLoader(800))); - AddUntilStep("loaded", () => + AddStep("begin loading", () => + { + loader = new TestLoader(); + loader.AllowLoad.Set(); + + LoadScreen(loader); + }); + + AddAssert("loaded", () => { logoVisible = loader.Logo?.Alpha > 0; return loader.Logo != null && loader.ScreenLoaded; }); - AddAssert("logo visible", () => logoVisible); + + AddAssert("logo was not visible", () => !logoVisible); + } + + [Test] + public void TestShortLoad() + { + bool logoVisible = false; + + AddStep("begin loading", () => LoadScreen(loader = new TestLoader())); + AddWaitStep("wait", 2); + AddStep("finish loading", () => + { + logoVisible = loader.Logo?.Alpha > 0; + loader.AllowLoad.Set(); + }); + + AddAssert("loaded", () => loader.Logo != null && loader.ScreenLoaded); + AddAssert("logo was visible", () => logoVisible); AddUntilStep("logo gone", () => loader.Logo?.Alpha == 0); + } - AddStep("longer load", () => LoadScreen(loader = new TestLoader(1400))); - AddUntilStep("loaded", () => + [Test] + public void TestLongLoad() + { + bool logoVisible = false; + + AddStep("begin loading", () => LoadScreen(loader = new TestLoader())); + AddWaitStep("wait", 10); + AddStep("finish loading", () => { logoVisible = loader.Logo?.Alpha > 0; - return loader.Logo != null && loader.ScreenLoaded; + loader.AllowLoad.Set(); }); - AddAssert("logo visible", () => logoVisible); + + AddAssert("loaded", () => loader.Logo != null && loader.ScreenLoaded); + AddAssert("logo was visible", () => logoVisible); AddUntilStep("logo gone", () => loader.Logo?.Alpha == 0); } private class TestLoader : Loader { - private readonly double delay; + public readonly ManualResetEventSlim AllowLoad = new ManualResetEventSlim(); public OsuLogo Logo; private TestScreen screen; public bool ScreenLoaded => screen.IsCurrentScreen(); - public TestLoader(double delay) - { - this.delay = delay; - } - protected override void LogoArriving(OsuLogo logo, bool resuming) { Logo = logo; @@ -78,25 +100,18 @@ namespace osu.Game.Tests.Visual.Menus } protected override OsuScreen CreateLoadableScreen() => screen = new TestScreen(); - protected override ShaderPrecompiler CreateShaderPrecompiler() => new TestShaderPrecompiler(delay); + protected override ShaderPrecompiler CreateShaderPrecompiler() => new TestShaderPrecompiler(AllowLoad); private class TestShaderPrecompiler : ShaderPrecompiler { - private readonly double delay; - private double startTime; + private readonly ManualResetEventSlim allowLoad; - public TestShaderPrecompiler(double delay) + public TestShaderPrecompiler(ManualResetEventSlim allowLoad) { - this.delay = delay; + this.allowLoad = allowLoad; } - protected override void LoadComplete() - { - base.LoadComplete(); - startTime = Time.Current; - } - - protected override bool AllLoaded => Time.Current > startTime + delay; + protected override bool AllLoaded => allowLoad.IsSet; } private class TestScreen : OsuScreen From 5495a0a70fd1c2320c801a0e9ba6c72e6f64f7a0 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Mar 2019 14:34:58 +0900 Subject: [PATCH 7/7] Add content to ScreenTestCase as protection against overwriting --- osu.Game/Tests/Visual/ScreenTestCase.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/osu.Game/Tests/Visual/ScreenTestCase.cs b/osu.Game/Tests/Visual/ScreenTestCase.cs index d10779349b..4fd4c7c207 100644 --- a/osu.Game/Tests/Visual/ScreenTestCase.cs +++ b/osu.Game/Tests/Visual/ScreenTestCase.cs @@ -1,8 +1,8 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.Allocation; using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; using osu.Game.Screens; namespace osu.Game.Tests.Visual @@ -12,12 +12,19 @@ namespace osu.Game.Tests.Visual /// public abstract class ScreenTestCase : ManualInputManagerTestCase { - private OsuScreenStack stack; + private readonly OsuScreenStack stack; - [BackgroundDependencyLoader] - private void load() + private readonly Container content; + + protected override Container Content => content; + + protected ScreenTestCase() { - Add(stack = new OsuScreenStack { RelativeSizeAxes = Axes.Both }); + base.Content.AddRange(new Drawable[] + { + stack = new OsuScreenStack { RelativeSizeAxes = Axes.Both }, + content = new Container { RelativeSizeAxes = Axes.Both } + }); } protected void LoadScreen(OsuScreen screen)