1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-28 05:22:54 +08:00

Disable create room button after triggering join

This commit is contained in:
Bartłomiej Dach 2020-12-28 21:39:11 +01:00
parent 47ab7c9fd6
commit af66e45311
4 changed files with 83 additions and 13 deletions

View File

@ -0,0 +1,52 @@
// 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.
using NUnit.Framework;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Game.Screens.OnlinePlay;
using osu.Game.Screens.OnlinePlay.Multiplayer;
namespace osu.Game.Tests.Visual.Multiplayer
{
public class TestSceneCreateMultiplayerMatchButton : MultiplayerTestScene
{
[Cached]
private OngoingOperationTracker joiningRoomTracker = new OngoingOperationTracker();
private CreateMultiplayerMatchButton button;
public override void SetUpSteps()
{
base.SetUpSteps();
AddStep("create button", () => Child = button = new CreateMultiplayerMatchButton
{
Width = 200,
Height = 100,
Anchor = Anchor.Centre,
Origin = Anchor.Centre
});
}
[Test]
public void TestButtonEnableStateChanges()
{
assertButtonEnableState(true);
AddStep("begin joining room", () => joiningRoomTracker.BeginOperation());
assertButtonEnableState(false);
AddStep("end joining room", () => joiningRoomTracker.EndOperation());
assertButtonEnableState(true);
AddStep("disconnect client", () => Client.Disconnect());
assertButtonEnableState(false);
AddStep("re-connect client", () => Client.Connect());
assertButtonEnableState(true);
}
private void assertButtonEnableState(bool enabled)
=> AddAssert($"button {(enabled ? "enabled" : "disabled")}", () => button.Enabled.Value == enabled);
}
}

View File

@ -26,6 +26,7 @@ namespace osu.Game.Screens.OnlinePlay.Lounge
protected override UserActivity InitialActivity => new UserActivity.SearchingForLobby(); protected override UserActivity InitialActivity => new UserActivity.SearchingForLobby();
private readonly IBindable<bool> initialRoomsReceived = new Bindable<bool>(); private readonly IBindable<bool> initialRoomsReceived = new Bindable<bool>();
private readonly IBindable<bool> joiningRoom = new Bindable<bool>();
private FilterControl filter; private FilterControl filter;
private Container content; private Container content;
@ -37,7 +38,8 @@ namespace osu.Game.Screens.OnlinePlay.Lounge
[Resolved] [Resolved]
private MusicController music { get; set; } private MusicController music { get; set; }
private bool joiningRoom; [Resolved]
private OngoingOperationTracker joiningRoomTracker { get; set; }
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
@ -98,7 +100,10 @@ namespace osu.Game.Screens.OnlinePlay.Lounge
base.LoadComplete(); base.LoadComplete();
initialRoomsReceived.BindTo(RoomManager.InitialRoomsReceived); initialRoomsReceived.BindTo(RoomManager.InitialRoomsReceived);
initialRoomsReceived.BindValueChanged(onInitialRoomsReceivedChanged, true); initialRoomsReceived.BindValueChanged(_ => updateLoadingLayer());
joiningRoom.BindTo(joiningRoomTracker.InProgress);
joiningRoom.BindValueChanged(_ => updateLoadingLayer(), true);
} }
protected override void UpdateAfterChildren() protected override void UpdateAfterChildren()
@ -156,26 +161,21 @@ namespace osu.Game.Screens.OnlinePlay.Lounge
private void joinRequested(Room room) private void joinRequested(Room room)
{ {
joiningRoom = true; joiningRoomTracker.BeginOperation();
updateLoadingLayer();
RoomManager?.JoinRoom(room, r => RoomManager?.JoinRoom(room, r =>
{ {
Open(room); Open(room);
joiningRoom = false; joiningRoomTracker.EndOperation();
updateLoadingLayer();
}, _ => }, _ =>
{ {
joiningRoom = false; joiningRoomTracker.EndOperation();
updateLoadingLayer();
}); });
} }
private void onInitialRoomsReceivedChanged(ValueChangedEvent<bool> received) => updateLoadingLayer();
private void updateLoadingLayer() private void updateLoadingLayer()
{ {
if (joiningRoom || !initialRoomsReceived.Value) if (joiningRoom.Value || !initialRoomsReceived.Value)
loadingLayer.Show(); loadingLayer.Show();
else else
loadingLayer.Hide(); loadingLayer.Hide();

View File

@ -10,14 +10,29 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
{ {
public class CreateMultiplayerMatchButton : PurpleTriangleButton public class CreateMultiplayerMatchButton : PurpleTriangleButton
{ {
private IBindable<bool> isConnected;
private IBindable<bool> joiningRoom;
[Resolved]
private StatefulMultiplayerClient multiplayerClient { get; set; }
[Resolved]
private OngoingOperationTracker joiningRoomTracker { get; set; }
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(StatefulMultiplayerClient multiplayerClient) private void load()
{ {
Triangles.TriangleScale = 1.5f; Triangles.TriangleScale = 1.5f;
Text = "Create room"; Text = "Create room";
((IBindable<bool>)Enabled).BindTo(multiplayerClient.IsConnected); isConnected = multiplayerClient.IsConnected.GetBoundCopy();
isConnected.BindValueChanged(_ => updateState());
joiningRoom = joiningRoomTracker.InProgress.GetBoundCopy();
joiningRoom.BindValueChanged(_ => updateState(), true);
} }
private void updateState() => Enabled.Value = isConnected.Value && !joiningRoom.Value;
} }
} }

View File

@ -52,6 +52,9 @@ namespace osu.Game.Screens.OnlinePlay
[Cached] [Cached]
private readonly Bindable<FilterCriteria> currentFilter = new Bindable<FilterCriteria>(new FilterCriteria()); private readonly Bindable<FilterCriteria> currentFilter = new Bindable<FilterCriteria>(new FilterCriteria());
[Cached]
private readonly OngoingOperationTracker joiningRoomTracker = new OngoingOperationTracker();
[Resolved(CanBeNull = true)] [Resolved(CanBeNull = true)]
private MusicController music { get; set; } private MusicController music { get; set; }