diff --git a/osu.Game.Tests/Visual/TestCaseLoungeRoomsContainer.cs b/osu.Game.Tests/Visual/TestCaseLoungeRoomsContainer.cs index e42781849d..5ecd09e885 100644 --- a/osu.Game.Tests/Visual/TestCaseLoungeRoomsContainer.cs +++ b/osu.Game.Tests/Visual/TestCaseLoungeRoomsContainer.cs @@ -76,7 +76,7 @@ namespace osu.Game.Tests.Visual public readonly BindableCollection Rooms = new BindableCollection(); IBindableCollection IRoomManager.Rooms => Rooms; - public void CreateRoom(Room room, Action onError = null) => Rooms.Add(room); + public void CreateRoom(Room room, Action onSuccess = null, Action onError = null) => Rooms.Add(room); public void JoinRoom(Room room) => RoomJoined?.Invoke(room); diff --git a/osu.Game.Tests/Visual/TestCaseMatchSettingsOverlay.cs b/osu.Game.Tests/Visual/TestCaseMatchSettingsOverlay.cs index f93d1b3069..086e6fbefe 100644 --- a/osu.Game.Tests/Visual/TestCaseMatchSettingsOverlay.cs +++ b/osu.Game.Tests/Visual/TestCaseMatchSettingsOverlay.cs @@ -140,13 +140,15 @@ namespace osu.Game.Tests.Visual public IBindableCollection Rooms { get; } = null; - public void CreateRoom(Room room, Action onError = null) + public void CreateRoom(Room room, Action onSuccess = null, Action onError = null) { if (CreateRequested == null) return; if (!CreateRequested.Invoke(room)) onError?.Invoke(FAILED_TEXT); + else + onSuccess?.Invoke(); } public void JoinRoom(Room room) => throw new NotImplementedException(); diff --git a/osu.Game/Screens/Multi/IRoomManager.cs b/osu.Game/Screens/Multi/IRoomManager.cs index bb996f0b5c..0e051802e3 100644 --- a/osu.Game/Screens/Multi/IRoomManager.cs +++ b/osu.Game/Screens/Multi/IRoomManager.cs @@ -24,8 +24,9 @@ namespace osu.Game.Screens.Multi /// Creates a new . /// /// The to create. + /// An action to be invoked if the creation succeeds. /// An action to be invoked if an error occurred. - void CreateRoom(Room room, Action onError = null); + void CreateRoom(Room room, Action onSuccess = null, Action onError = null); /// /// Joins a . diff --git a/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs b/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs index d6228b106b..916a21fb71 100644 --- a/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs +++ b/osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs @@ -39,6 +39,8 @@ namespace osu.Game.Screens.Multi.Match.Components protected readonly OsuSpriteText ErrorText; + private readonly ProcessingOverlay processingOverlay; + private readonly Room room; [Resolved(CanBeNull = true)] @@ -231,7 +233,8 @@ namespace osu.Game.Screens.Multi.Match.Components } } } - } + }, + processingOverlay = new ProcessingOverlay { Alpha = 0 } }, }; @@ -264,7 +267,7 @@ namespace osu.Game.Screens.Multi.Match.Components ApplyButton.Enabled.Value = hasValidSettings; } - private bool hasValidSettings => NameField.Text.Length > 0 && bindings.Playlist.Count > 0; + private bool hasValidSettings => bindings.Room.RoomID.Value == null && NameField.Text.Length > 0 && bindings.Playlist.Count > 0; protected override void PopIn() { @@ -291,15 +294,21 @@ namespace osu.Game.Screens.Multi.Match.Components bindings.Duration.Value = DurationField.Current.Value; - manager?.CreateRoom(room, showError); + manager?.CreateRoom(room, onSuccess, onError); + + processingOverlay.Show(); } private void hideError() => ErrorText.FadeOut(50); - private void showError(string text) + private void onSuccess() => processingOverlay.Hide(); + + private void onError(string text) { ErrorText.Text = text; ErrorText.FadeIn(50); + + processingOverlay.Hide(); } private class SettingsTextBox : OsuTextBox diff --git a/osu.Game/Screens/Multi/RoomManager.cs b/osu.Game/Screens/Multi/RoomManager.cs index d91c05f79f..642084547c 100644 --- a/osu.Game/Screens/Multi/RoomManager.cs +++ b/osu.Game/Screens/Multi/RoomManager.cs @@ -48,7 +48,7 @@ namespace osu.Game.Screens.Multi PartRoom(); } - public void CreateRoom(Room room, Action onError = null) + public void CreateRoom(Room room, Action onSuccess = null, Action onError = null) { room.Host.Value = api.LocalUser; @@ -57,6 +57,8 @@ namespace osu.Game.Screens.Multi { update(room, result); addRoom(room); + + onSuccess?.Invoke(); }; req.Failure += exception =>