Refactor LoadingLayer to avoid applying effects to external drawables

In theory this seemed like a good idea (and an optimisation in some
cases, due to lower fill rate), but in practice this leads to weird edge
cases.

This aims to do away with the operations on external drawables by
applying a dim to the area behind the `LoadingLayer` when required.
I went over each usage and ensured they look as good or better than
previously.

The specific bad usage here was the restoration of the colour on dispose
(if the `LoadingLayer` was disposed in a still-visible state).

I'm aware that the `BeatmapListingOverlay` will now dim completely during
load. I think this is fine for the time being.
This commit is contained in:
Dean Herbert 2021-01-04 22:42:39 +09:00
parent a86a7b08df
commit 54982dcdd7
18 changed files with 389 additions and 389 deletions

View File

@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. // 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. // See the LICENCE file in the repository root for full licence text.
using System.Linq;
using NUnit.Framework; using NUnit.Framework;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
@ -14,11 +15,12 @@ namespace osu.Game.Tests.Visual.UserInterface
{ {
public class TestSceneLoadingLayer : OsuTestScene public class TestSceneLoadingLayer : OsuTestScene
{ {
private Drawable dimContent;
private LoadingLayer overlay; private LoadingLayer overlay;
private Container content; private Container content;
private Drawable dimContent => overlay.Children.OfType<Box>().First();
[SetUp] [SetUp]
public void SetUp() => Schedule(() => public void SetUp() => Schedule(() =>
{ {
@ -29,14 +31,14 @@ namespace osu.Game.Tests.Visual.UserInterface
Size = new Vector2(300), Size = new Vector2(300),
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
Children = new[] Children = new Drawable[]
{ {
new Box new Box
{ {
Colour = Color4.SlateGray, Colour = Color4.SlateGray,
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
}, },
dimContent = new FillFlowContainer new FillFlowContainer
{ {
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
@ -51,7 +53,7 @@ namespace osu.Game.Tests.Visual.UserInterface
new TriangleButton { Text = "puush me", Width = 200, Action = () => { } }, new TriangleButton { Text = "puush me", Width = 200, Action = () => { } },
} }
}, },
overlay = new LoadingLayer(dimContent), overlay = new LoadingLayer(true),
} }
}, },
}; };

View File

@ -4,6 +4,7 @@
using System; using System;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Input.Events; using osu.Framework.Input.Events;
using osuTK; using osuTK;
using osuTK.Graphics; using osuTK.Graphics;
@ -17,22 +18,31 @@ namespace osu.Game.Graphics.UserInterface
/// </summary> /// </summary>
public class LoadingLayer : LoadingSpinner public class LoadingLayer : LoadingSpinner
{ {
private readonly Drawable dimTarget; private readonly Box backgroundDimLayer;
/// <summary> /// <summary>
/// Constuct a new loading spinner. /// Construct a new loading spinner.
/// </summary> /// </summary>
/// <param name="dimTarget">An optional target to dim when displayed.</param> /// <param name="dimBackground">Whether the full background area should be dimmed while loading.</param>
/// <param name="withBox">Whether the spinner should have a surrounding black box for visibility.</param> /// <param name="withBox">Whether the spinner should have a surrounding black box for visibility.</param>
public LoadingLayer(Drawable dimTarget = null, bool withBox = true) public LoadingLayer(bool dimBackground = false, bool withBox = true)
: base(withBox) : base(withBox)
{ {
RelativeSizeAxes = Axes.Both; RelativeSizeAxes = Axes.Both;
Size = new Vector2(1); Size = new Vector2(1);
this.dimTarget = dimTarget;
MainContents.RelativeSizeAxes = Axes.None; MainContents.RelativeSizeAxes = Axes.None;
if (dimBackground)
{
AddInternal(backgroundDimLayer = new Box
{
Depth = float.MaxValue,
Colour = Color4.Black,
Alpha = 0,
RelativeSizeAxes = Axes.Both,
});
}
} }
public override bool HandleNonPositionalInput => false; public override bool HandleNonPositionalInput => false;
@ -56,19 +66,20 @@ namespace osu.Game.Graphics.UserInterface
protected override void PopIn() protected override void PopIn()
{ {
dimTarget?.FadeColour(OsuColour.Gray(0.5f), TRANSITION_DURATION, Easing.OutQuint); backgroundDimLayer?.FadeTo(0.5f, TRANSITION_DURATION * 2, Easing.OutQuint);
base.PopIn(); base.PopIn();
} }
protected override void PopOut() protected override void PopOut()
{ {
dimTarget?.FadeColour(Color4.White, TRANSITION_DURATION, Easing.OutQuint); backgroundDimLayer?.FadeOut(TRANSITION_DURATION, Easing.OutQuint);
base.PopOut(); base.PopOut();
} }
protected override void Update() protected override void Update()
{ {
base.Update(); base.Update();
MainContents.Size = new Vector2(Math.Clamp(Math.Min(DrawWidth, DrawHeight) * 0.25f, 30, 100)); MainContents.Size = new Vector2(Math.Clamp(Math.Min(DrawWidth, DrawHeight) * 0.25f, 30, 100));
} }
@ -79,7 +90,7 @@ namespace osu.Game.Graphics.UserInterface
if (State.Value == Visibility.Visible) if (State.Value == Visibility.Visible)
{ {
// ensure we don't leave the target in a bad state. // ensure we don't leave the target in a bad state.
dimTarget?.FadeColour(Color4.White, TRANSITION_DURATION, Easing.OutQuint); // dimTarget?.FadeColour(Color4.White, TRANSITION_DURATION, Easing.OutQuint);
} }
} }
} }

View File

@ -124,7 +124,7 @@ namespace osu.Game.Overlays.AccountCreation
}, },
}, },
}, },
loadingLayer = new LoadingLayer(mainContent) loadingLayer = new LoadingLayer(true)
}; };
textboxes = new[] { usernameTextBox, emailTextBox, passwordTextBox }; textboxes = new[] { usernameTextBox, emailTextBox, passwordTextBox };

View File

@ -92,14 +92,14 @@ namespace osu.Game.Overlays
{ {
foundContent = new FillFlowContainer<BeatmapPanel>(), foundContent = new FillFlowContainer<BeatmapPanel>(),
notFoundContent = new NotFoundDrawable(), notFoundContent = new NotFoundDrawable(),
loadingLayer = new LoadingLayer(panelTarget)
} }
} }
} },
}, },
} }
} },
} },
loadingLayer = new LoadingLayer(true)
}; };
} }

View File

@ -53,7 +53,7 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
Size = new Vector2(18), Size = new Vector2(18),
Shadow = false, Shadow = false,
}, },
loading = new LoadingLayer(icon, false), loading = new LoadingLayer(true, false),
}); });
Action = () => Action = () =>

View File

@ -157,11 +157,11 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
} }
} }
}, },
loading = new LoadingLayer()
} }
} }
} },
} },
loading = new LoadingLayer()
}); });
} }
@ -228,7 +228,9 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{ {
Scores = null; Scores = null;
notSupporterPlaceholder.Show(); notSupporterPlaceholder.Show();
loading.Hide(); loading.Hide();
loading.FinishTransforms();
return; return;
} }
@ -241,6 +243,8 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
getScoresRequest.Success += scores => getScoresRequest.Success += scores =>
{ {
loading.Hide(); loading.Hide();
loading.FinishTransforms();
Scores = scores; Scores = scores;
if (!scores.Scores.Any()) if (!scores.Scores.Any())

View File

@ -128,7 +128,7 @@ namespace osu.Game.Overlays.Dashboard.Friends
AutoSizeAxes = Axes.Y, AutoSizeAxes = Axes.Y,
Padding = new MarginPadding { Horizontal = 50 } Padding = new MarginPadding { Horizontal = 50 }
}, },
loading = new LoadingLayer(itemsPlaceholder) loading = new LoadingLayer(true)
} }
} }
} }

View File

@ -68,7 +68,7 @@ namespace osu.Game.Overlays
} }
} }
}, },
loading = new LoadingLayer(content), loading = new LoadingLayer(true),
}; };
} }

View File

@ -59,7 +59,7 @@ namespace osu.Game.Overlays
}, },
}, },
}, },
loading = new LoadingLayer(content), loading = new LoadingLayer(true),
}; };
} }

View File

@ -45,6 +45,7 @@ namespace osu.Game.Overlays.Rankings
{ {
RelativeSizeAxes = Axes.X; RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y; AutoSizeAxes = Axes.Y;
InternalChild = new ReverseChildIDFillFlowContainer<Drawable> InternalChild = new ReverseChildIDFillFlowContainer<Drawable>
{ {
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
@ -68,7 +69,7 @@ namespace osu.Game.Overlays.Rankings
AutoSizeAxes = Axes.Y, AutoSizeAxes = Axes.Y,
Margin = new MarginPadding { Vertical = 10 } Margin = new MarginPadding { Vertical = 10 }
}, },
loading = new LoadingLayer(content) loading = new LoadingLayer(true)
} }
} }
} }

View File

@ -42,6 +42,8 @@ namespace osu.Game.Overlays
Depth = -float.MaxValue Depth = -float.MaxValue
}) })
{ {
loading = new LoadingLayer(true);
Children = new Drawable[] Children = new Drawable[]
{ {
background = new Box background = new Box
@ -74,12 +76,12 @@ namespace osu.Game.Overlays
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
Margin = new MarginPadding { Bottom = 10 } Margin = new MarginPadding { Bottom = 10 }
}, },
loading = new LoadingLayer(contentContainer),
} }
} }
} }
} }
} },
loading
}; };
} }

View File

@ -65,7 +65,7 @@ namespace osu.Game.Screens.OnlinePlay.Lounge
Padding = new MarginPadding(10), Padding = new MarginPadding(10),
Child = roomsContainer = new RoomsContainer { JoinRequested = joinRequested } Child = roomsContainer = new RoomsContainer { JoinRequested = joinRequested }
}, },
loadingLayer = new LoadingLayer(roomsContainer), loadingLayer = new LoadingLayer(true),
} }
}, },
new RoomInspector new RoomInspector

View File

@ -71,201 +71,192 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(OsuColour colours) private void load(OsuColour colours)
{ {
Container dimContent;
InternalChildren = new Drawable[] InternalChildren = new Drawable[]
{ {
dimContent = new Container new Box
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Children = new Drawable[] Colour = Color4Extensions.FromHex(@"28242d"),
},
new GridContainer
{
RelativeSizeAxes = Axes.Both,
RowDimensions = new[]
{ {
new Box new Dimension(GridSizeMode.Distributed),
new Dimension(GridSizeMode.AutoSize),
},
Content = new[]
{
new Drawable[]
{ {
RelativeSizeAxes = Axes.Both, new OsuScrollContainer
Colour = Color4Extensions.FromHex(@"28242d"),
},
new GridContainer
{
RelativeSizeAxes = Axes.Both,
RowDimensions = new[]
{ {
new Dimension(GridSizeMode.Distributed), Padding = new MarginPadding
new Dimension(GridSizeMode.AutoSize),
},
Content = new[]
{
new Drawable[]
{ {
new OsuScrollContainer Horizontal = OsuScreen.HORIZONTAL_OVERFLOW_PADDING,
Vertical = 10
},
RelativeSizeAxes = Axes.Both,
Children = new[]
{
new FillFlowContainer
{ {
Padding = new MarginPadding RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 10),
Children = new Drawable[]
{ {
Horizontal = OsuScreen.HORIZONTAL_OVERFLOW_PADDING, new Container
Vertical = 10
},
RelativeSizeAxes = Axes.Both,
Children = new[]
{
new FillFlowContainer
{ {
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
Padding = new MarginPadding { Horizontal = WaveOverlayContainer.WIDTH_PADDING },
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y, AutoSizeAxes = Axes.Y,
Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 10),
Children = new Drawable[] Children = new Drawable[]
{ {
new Container new SectionContainer
{ {
Anchor = Anchor.TopCentre, Padding = new MarginPadding { Right = FIELD_PADDING / 2 },
Origin = Anchor.TopCentre, Children = new[]
Padding = new MarginPadding { Horizontal = WaveOverlayContainer.WIDTH_PADDING },
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Children = new Drawable[]
{ {
new SectionContainer new Section("Room name")
{ {
Padding = new MarginPadding { Right = FIELD_PADDING / 2 }, Child = NameField = new SettingsTextBox
Children = new[]
{ {
new Section("Room name") RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
},
},
new Section("Room visibility")
{
Alpha = disabled_alpha,
Child = AvailabilityPicker = new RoomAvailabilityPicker
{
Enabled = { Value = false }
},
},
new Section("Game type")
{
Alpha = disabled_alpha,
Child = new FillFlowContainer
{
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.X,
Direction = FillDirection.Vertical,
Spacing = new Vector2(7),
Children = new Drawable[]
{ {
Child = NameField = new SettingsTextBox TypePicker = new GameTypePicker
{ {
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
},
},
new Section("Room visibility")
{
Alpha = disabled_alpha,
Child = AvailabilityPicker = new RoomAvailabilityPicker
{
Enabled = { Value = false } Enabled = { Value = false }
}, },
}, typeLabel = new OsuSpriteText
new Section("Game type")
{
Alpha = disabled_alpha,
Child = new FillFlowContainer
{ {
AutoSizeAxes = Axes.Y, Font = OsuFont.GetFont(size: 14),
RelativeSizeAxes = Axes.X, Colour = colours.Yellow
Direction = FillDirection.Vertical,
Spacing = new Vector2(7),
Children = new Drawable[]
{
TypePicker = new GameTypePicker
{
RelativeSizeAxes = Axes.X,
Enabled = { Value = false }
},
typeLabel = new OsuSpriteText
{
Font = OsuFont.GetFont(size: 14),
Colour = colours.Yellow
},
},
}, },
}, },
}, },
}, },
new SectionContainer
{
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
Padding = new MarginPadding { Left = FIELD_PADDING / 2 },
Children = new[]
{
new Section("Max participants")
{
Alpha = disabled_alpha,
Child = MaxParticipantsField = new SettingsNumberTextBox
{
RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
ReadOnly = true,
},
},
new Section("Password (optional)")
{
Alpha = disabled_alpha,
Child = new SettingsPasswordTextBox
{
RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
ReadOnly = true,
},
},
}
}
}, },
}, },
initialBeatmapControl = new BeatmapSelectionControl new SectionContainer
{ {
Anchor = Anchor.TopCentre, Anchor = Anchor.TopRight,
Origin = Anchor.TopCentre, Origin = Anchor.TopRight,
RelativeSizeAxes = Axes.X, Padding = new MarginPadding { Left = FIELD_PADDING / 2 },
Width = 0.5f Children = new[]
{
new Section("Max participants")
{
Alpha = disabled_alpha,
Child = MaxParticipantsField = new SettingsNumberTextBox
{
RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
ReadOnly = true,
},
},
new Section("Password (optional)")
{
Alpha = disabled_alpha,
Child = new SettingsPasswordTextBox
{
RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
ReadOnly = true,
},
},
}
} }
} },
},
initialBeatmapControl = new BeatmapSelectionControl
{
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
RelativeSizeAxes = Axes.X,
Width = 0.5f
} }
}, }
}, }
}, },
new Drawable[] },
},
new Drawable[]
{
new Container
{
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
Y = 2,
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Children = new Drawable[]
{ {
new Container new Box
{
RelativeSizeAxes = Axes.Both,
Colour = Color4Extensions.FromHex(@"28242d").Darken(0.5f).Opacity(1f),
},
new FillFlowContainer
{ {
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
Y = 2,
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y, AutoSizeAxes = Axes.Y,
Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 20),
Margin = new MarginPadding { Vertical = 20 },
Padding = new MarginPadding { Horizontal = OsuScreen.HORIZONTAL_OVERFLOW_PADDING },
Children = new Drawable[] Children = new Drawable[]
{ {
new Box ApplyButton = new CreateOrUpdateButton
{ {
RelativeSizeAxes = Axes.Both, Anchor = Anchor.BottomCentre,
Colour = Color4Extensions.FromHex(@"28242d").Darken(0.5f).Opacity(1f), Origin = Anchor.BottomCentre,
Size = new Vector2(230, 55),
Enabled = { Value = false },
Action = apply,
}, },
new FillFlowContainer ErrorText = new OsuSpriteText
{ {
RelativeSizeAxes = Axes.X, Anchor = Anchor.BottomCentre,
AutoSizeAxes = Axes.Y, Origin = Anchor.BottomCentre,
Direction = FillDirection.Vertical, Alpha = 0,
Spacing = new Vector2(0, 20), Depth = 1,
Margin = new MarginPadding { Vertical = 20 }, Colour = colours.RedDark
Padding = new MarginPadding { Horizontal = OsuScreen.HORIZONTAL_OVERFLOW_PADDING },
Children = new Drawable[]
{
ApplyButton = new CreateOrUpdateButton
{
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
Size = new Vector2(230, 55),
Enabled = { Value = false },
Action = apply,
},
ErrorText = new OsuSpriteText
{
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
Alpha = 0,
Depth = 1,
Colour = colours.RedDark
}
}
} }
} }
} }
} }
} }
}, }
} }
}, },
loadingLayer = new LoadingLayer(dimContent) loadingLayer = new LoadingLayer(true)
}; };
TypePicker.Current.BindValueChanged(type => typeLabel.Text = type.NewValue?.Name ?? string.Empty, true); TypePicker.Current.BindValueChanged(type => typeLabel.Text = type.NewValue?.Name ?? string.Empty, true);

View File

@ -47,7 +47,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
{ {
AddInternal(loadingLayer = new LoadingLayer(Carousel)); AddInternal(loadingLayer = new LoadingLayer(true));
initialBeatmap = Beatmap.Value; initialBeatmap = Beatmap.Value;
initialRuleset = Ruleset.Value; initialRuleset = Ruleset.Value;
initialMods = Mods.Value.ToList(); initialMods = Mods.Value.ToList();

View File

@ -62,7 +62,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
// todo: this should be implemented via a custom HUD implementation, and correctly masked to the main content area. // todo: this should be implemented via a custom HUD implementation, and correctly masked to the main content area.
LoadComponentAsync(leaderboard = new MultiplayerGameplayLeaderboard(ScoreProcessor, userIds), HUDOverlay.Add); LoadComponentAsync(leaderboard = new MultiplayerGameplayLeaderboard(ScoreProcessor, userIds), HUDOverlay.Add);
HUDOverlay.Add(loadingDisplay = new LoadingLayer(DrawableRuleset) { Depth = float.MaxValue }); HUDOverlay.Add(loadingDisplay = new LoadingLayer(true) { Depth = float.MaxValue });
if (Token == null) if (Token == null)
return; // Todo: Somehow handle token retrieval failure. return; // Todo: Somehow handle token retrieval failure.

View File

@ -64,243 +64,234 @@ namespace osu.Game.Screens.OnlinePlay.Playlists
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(OsuColour colours) private void load(OsuColour colours)
{ {
Container dimContent;
InternalChildren = new Drawable[] InternalChildren = new Drawable[]
{ {
dimContent = new Container new Box
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Children = new Drawable[] Colour = Color4Extensions.FromHex(@"28242d"),
},
new GridContainer
{
RelativeSizeAxes = Axes.Both,
RowDimensions = new[]
{ {
new Box new Dimension(GridSizeMode.Distributed),
new Dimension(GridSizeMode.AutoSize),
},
Content = new[]
{
new Drawable[]
{ {
RelativeSizeAxes = Axes.Both, new OsuScrollContainer
Colour = Color4Extensions.FromHex(@"28242d"),
},
new GridContainer
{
RelativeSizeAxes = Axes.Both,
RowDimensions = new[]
{ {
new Dimension(GridSizeMode.Distributed), Padding = new MarginPadding
new Dimension(GridSizeMode.AutoSize),
},
Content = new[]
{
new Drawable[]
{ {
new OsuScrollContainer Horizontal = OsuScreen.HORIZONTAL_OVERFLOW_PADDING,
{ Vertical = 10
Padding = new MarginPadding
{
Horizontal = OsuScreen.HORIZONTAL_OVERFLOW_PADDING,
Vertical = 10
},
RelativeSizeAxes = Axes.Both,
Children = new[]
{
new Container
{
Padding = new MarginPadding { Horizontal = WaveOverlayContainer.WIDTH_PADDING },
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Children = new Drawable[]
{
new SectionContainer
{
Padding = new MarginPadding { Right = FIELD_PADDING / 2 },
Children = new[]
{
new Section("Room name")
{
Child = NameField = new SettingsTextBox
{
RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
LengthLimit = 100
},
},
new Section("Duration")
{
Child = DurationField = new DurationDropdown
{
RelativeSizeAxes = Axes.X,
Items = new[]
{
TimeSpan.FromMinutes(30),
TimeSpan.FromHours(1),
TimeSpan.FromHours(2),
TimeSpan.FromHours(4),
TimeSpan.FromHours(8),
TimeSpan.FromHours(12),
//TimeSpan.FromHours(16),
TimeSpan.FromHours(24),
TimeSpan.FromDays(3),
TimeSpan.FromDays(7)
}
}
},
new Section("Room visibility")
{
Alpha = disabled_alpha,
Child = AvailabilityPicker = new RoomAvailabilityPicker
{
Enabled = { Value = false }
},
},
new Section("Game type")
{
Alpha = disabled_alpha,
Child = new FillFlowContainer
{
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.X,
Direction = FillDirection.Vertical,
Spacing = new Vector2(7),
Children = new Drawable[]
{
TypePicker = new GameTypePicker
{
RelativeSizeAxes = Axes.X,
Enabled = { Value = false }
},
typeLabel = new OsuSpriteText
{
Font = OsuFont.GetFont(size: 14),
Colour = colours.Yellow
},
},
},
},
new Section("Max participants")
{
Alpha = disabled_alpha,
Child = MaxParticipantsField = new SettingsNumberTextBox
{
RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
ReadOnly = true,
},
},
new Section("Password (optional)")
{
Alpha = disabled_alpha,
Child = new SettingsPasswordTextBox
{
RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
ReadOnly = true,
},
},
},
},
new SectionContainer
{
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
Padding = new MarginPadding { Left = FIELD_PADDING / 2 },
Children = new[]
{
new Section("Playlist")
{
Child = new GridContainer
{
RelativeSizeAxes = Axes.X,
Height = 300,
Content = new[]
{
new Drawable[]
{
playlist = new DrawableRoomPlaylist(true, true) { RelativeSizeAxes = Axes.Both }
},
new Drawable[]
{
playlistLength = new OsuSpriteText
{
Margin = new MarginPadding { Vertical = 5 },
Colour = colours.Yellow,
Font = OsuFont.GetFont(size: 12),
}
},
new Drawable[]
{
new PurpleTriangleButton
{
RelativeSizeAxes = Axes.X,
Height = 40,
Text = "Edit playlist",
Action = () => EditPlaylist?.Invoke()
}
}
},
RowDimensions = new[]
{
new Dimension(),
new Dimension(GridSizeMode.AutoSize),
new Dimension(GridSizeMode.AutoSize),
}
}
},
},
},
},
}
},
},
}, },
new Drawable[] RelativeSizeAxes = Axes.Both,
Children = new[]
{ {
new Container new Container
{ {
Anchor = Anchor.BottomLeft, Padding = new MarginPadding { Horizontal = WaveOverlayContainer.WIDTH_PADDING },
Origin = Anchor.BottomLeft,
Y = 2,
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y, AutoSizeAxes = Axes.Y,
Children = new Drawable[] Children = new Drawable[]
{ {
new Box new SectionContainer
{ {
RelativeSizeAxes = Axes.Both, Padding = new MarginPadding { Right = FIELD_PADDING / 2 },
Colour = Color4Extensions.FromHex(@"28242d").Darken(0.5f).Opacity(1f), Children = new[]
},
new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 20),
Margin = new MarginPadding { Vertical = 20 },
Padding = new MarginPadding { Horizontal = OsuScreen.HORIZONTAL_OVERFLOW_PADDING },
Children = new Drawable[]
{ {
ApplyButton = new CreateRoomButton new Section("Room name")
{ {
Anchor = Anchor.BottomCentre, Child = NameField = new SettingsTextBox
Origin = Anchor.BottomCentre, {
Size = new Vector2(230, 55), RelativeSizeAxes = Axes.X,
Enabled = { Value = false }, TabbableContentContainer = this,
Action = apply, LengthLimit = 100
},
}, },
ErrorText = new OsuSpriteText new Section("Duration")
{ {
Anchor = Anchor.BottomCentre, Child = DurationField = new DurationDropdown
Origin = Anchor.BottomCentre, {
Alpha = 0, RelativeSizeAxes = Axes.X,
Depth = 1, Items = new[]
Colour = colours.RedDark {
} TimeSpan.FromMinutes(30),
} TimeSpan.FromHours(1),
TimeSpan.FromHours(2),
TimeSpan.FromHours(4),
TimeSpan.FromHours(8),
TimeSpan.FromHours(12),
//TimeSpan.FromHours(16),
TimeSpan.FromHours(24),
TimeSpan.FromDays(3),
TimeSpan.FromDays(7)
}
}
},
new Section("Room visibility")
{
Alpha = disabled_alpha,
Child = AvailabilityPicker = new RoomAvailabilityPicker
{
Enabled = { Value = false }
},
},
new Section("Game type")
{
Alpha = disabled_alpha,
Child = new FillFlowContainer
{
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.X,
Direction = FillDirection.Vertical,
Spacing = new Vector2(7),
Children = new Drawable[]
{
TypePicker = new GameTypePicker
{
RelativeSizeAxes = Axes.X,
Enabled = { Value = false }
},
typeLabel = new OsuSpriteText
{
Font = OsuFont.GetFont(size: 14),
Colour = colours.Yellow
},
},
},
},
new Section("Max participants")
{
Alpha = disabled_alpha,
Child = MaxParticipantsField = new SettingsNumberTextBox
{
RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
ReadOnly = true,
},
},
new Section("Password (optional)")
{
Alpha = disabled_alpha,
Child = new SettingsPasswordTextBox
{
RelativeSizeAxes = Axes.X,
TabbableContentContainer = this,
ReadOnly = true,
},
},
},
},
new SectionContainer
{
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
Padding = new MarginPadding { Left = FIELD_PADDING / 2 },
Children = new[]
{
new Section("Playlist")
{
Child = new GridContainer
{
RelativeSizeAxes = Axes.X,
Height = 300,
Content = new[]
{
new Drawable[]
{
playlist = new DrawableRoomPlaylist(true, true) { RelativeSizeAxes = Axes.Both }
},
new Drawable[]
{
playlistLength = new OsuSpriteText
{
Margin = new MarginPadding { Vertical = 5 },
Colour = colours.Yellow,
Font = OsuFont.GetFont(size: 12),
}
},
new Drawable[]
{
new PurpleTriangleButton
{
RelativeSizeAxes = Axes.X,
Height = 40,
Text = "Edit playlist",
Action = () => EditPlaylist?.Invoke()
}
}
},
RowDimensions = new[]
{
new Dimension(),
new Dimension(GridSizeMode.AutoSize),
new Dimension(GridSizeMode.AutoSize),
}
}
},
},
},
},
}
},
},
},
new Drawable[]
{
new Container
{
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
Y = 2,
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Children = new Drawable[]
{
new Box
{
RelativeSizeAxes = Axes.Both,
Colour = Color4Extensions.FromHex(@"28242d").Darken(0.5f).Opacity(1f),
},
new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 20),
Margin = new MarginPadding { Vertical = 20 },
Padding = new MarginPadding { Horizontal = OsuScreen.HORIZONTAL_OVERFLOW_PADDING },
Children = new Drawable[]
{
ApplyButton = new CreateRoomButton
{
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
Size = new Vector2(230, 55),
Enabled = { Value = false },
Action = apply,
},
ErrorText = new OsuSpriteText
{
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
Alpha = 0,
Depth = 1,
Colour = colours.RedDark
} }
} }
} }
} }
} }
}, }
} }
}, },
loadingLayer = new LoadingLayer(dimContent) loadingLayer = new LoadingLayer(true)
}; };
TypePicker.Current.BindValueChanged(type => typeLabel.Text = type.NewValue?.Name ?? string.Empty, true); TypePicker.Current.BindValueChanged(type => typeLabel.Text = type.NewValue?.Name ?? string.Empty, true);

View File

@ -131,7 +131,7 @@ namespace osu.Game.Screens.Play
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
FillMode = FillMode.Fill, FillMode = FillMode.Fill,
}, },
loading = new LoadingLayer(backgroundSprite) loading = new LoadingLayer(true)
} }
}, },
new OsuSpriteText new OsuSpriteText

View File

@ -63,8 +63,6 @@ namespace osu.Game.Screens.Select
public BeatmapDetails() public BeatmapDetails()
{ {
Container content;
Children = new Drawable[] Children = new Drawable[]
{ {
new Box new Box
@ -72,7 +70,7 @@ namespace osu.Game.Screens.Select
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Colour = Color4.Black.Opacity(0.5f), Colour = Color4.Black.Opacity(0.5f),
}, },
content = new Container new Container
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Padding = new MarginPadding { Horizontal = spacing }, Padding = new MarginPadding { Horizontal = spacing },
@ -159,7 +157,7 @@ namespace osu.Game.Screens.Select
}, },
}, },
}, },
loading = new LoadingLayer(content), loading = new LoadingLayer(true),
}; };
} }