Add processing overlay to lounge screen

This commit is contained in:
smoogipoo 2018-12-26 21:10:31 +09:00
parent 0c384417f1
commit 152f3b1da3
6 changed files with 49 additions and 47 deletions

View File

@ -71,14 +71,14 @@ namespace osu.Game.Tests.Visual
private class TestRoomManager : IRoomManager private class TestRoomManager : IRoomManager
{ {
public event Action<Room> RoomJoined;
public readonly BindableCollection<Room> Rooms = new BindableCollection<Room>(); public readonly BindableCollection<Room> Rooms = new BindableCollection<Room>();
IBindableCollection<Room> IRoomManager.Rooms => Rooms; IBindableCollection<Room> IRoomManager.Rooms => Rooms;
public void CreateRoom(Room room, Action onSuccess = null, Action<string> onError = null) => Rooms.Add(room); public void CreateRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null) => Rooms.Add(room);
public void JoinRoom(Room room) => RoomJoined?.Invoke(room); public void JoinRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null)
{
}
public void PartRoom() public void PartRoom()
{ {

View File

@ -136,11 +136,9 @@ namespace osu.Game.Tests.Visual
public Func<Room, bool> CreateRequested; public Func<Room, bool> CreateRequested;
public event Action<Room> RoomJoined;
public IBindableCollection<Room> Rooms { get; } = null; public IBindableCollection<Room> Rooms { get; } = null;
public void CreateRoom(Room room, Action onSuccess = null, Action<string> onError = null) public void CreateRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null)
{ {
if (CreateRequested == null) if (CreateRequested == null)
return; return;
@ -148,10 +146,10 @@ namespace osu.Game.Tests.Visual
if (!CreateRequested.Invoke(room)) if (!CreateRequested.Invoke(room))
onError?.Invoke(FAILED_TEXT); onError?.Invoke(FAILED_TEXT);
else else
onSuccess?.Invoke(); onSuccess?.Invoke(room);
} }
public void JoinRoom(Room room) => throw new NotImplementedException(); public void JoinRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null) => throw new NotImplementedException();
public void PartRoom() => throw new NotImplementedException(); public void PartRoom() => throw new NotImplementedException();

View File

@ -10,11 +10,6 @@ namespace osu.Game.Screens.Multi
{ {
public interface IRoomManager public interface IRoomManager
{ {
/// <summary>
/// Invoked when a room is joined.
/// </summary>
event Action<Room> RoomJoined;
/// <summary> /// <summary>
/// All the active <see cref="Room"/>s. /// All the active <see cref="Room"/>s.
/// </summary> /// </summary>
@ -26,13 +21,15 @@ namespace osu.Game.Screens.Multi
/// <param name="room">The <see cref="Room"/> to create.</param> /// <param name="room">The <see cref="Room"/> to create.</param>
/// <param name="onSuccess">An action to be invoked if the creation succeeds.</param> /// <param name="onSuccess">An action to be invoked if the creation succeeds.</param>
/// <param name="onError">An action to be invoked if an error occurred.</param> /// <param name="onError">An action to be invoked if an error occurred.</param>
void CreateRoom(Room room, Action onSuccess = null, Action<string> onError = null); void CreateRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null);
/// <summary> /// <summary>
/// Joins a <see cref="Room"/>. /// Joins a <see cref="Room"/>.
/// </summary> /// </summary>
/// <param name="room">The <see cref="Room"/> to join. <see cref="Room.RoomID"/> must be populated.</param> /// <param name="room">The <see cref="Room"/> to join. <see cref="Room.RoomID"/> must be populated.</param>
void JoinRoom(Room room); /// <param name="onSuccess"></param>
/// <param name="onError"></param>
void JoinRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null);
/// <summary> /// <summary>
/// Parts the currently-joined <see cref="Room"/>. /// Parts the currently-joined <see cref="Room"/>.

View File

@ -7,6 +7,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Input.Events; using osu.Framework.Input.Events;
using osu.Framework.Screens; using osu.Framework.Screens;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.Multiplayer; using osu.Game.Online.Multiplayer;
using osu.Game.Overlays.SearchableList; using osu.Game.Overlays.SearchableList;
using osu.Game.Screens.Multi.Lounge.Components; using osu.Game.Screens.Multi.Lounge.Components;
@ -21,6 +22,7 @@ namespace osu.Game.Screens.Multi.Lounge
private readonly Container content; private readonly Container content;
private readonly RoomsContainer rooms; private readonly RoomsContainer rooms;
private readonly Action<Screen> pushGameplayScreen; private readonly Action<Screen> pushGameplayScreen;
private readonly ProcessingOverlay processingOverlay;
[Resolved(CanBeNull = true)] [Resolved(CanBeNull = true)]
private IRoomManager roomManager { get; set; } private IRoomManager roomManager { get; set; }
@ -43,18 +45,26 @@ namespace osu.Game.Screens.Multi.Lounge
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Children = new Drawable[] Children = new Drawable[]
{ {
new ScrollContainer new Container
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Width = 0.55f, Width = 0.55f,
ScrollbarOverlapsContent = false, Children = new Drawable[]
Padding = new MarginPadding(10),
Child = new SearchContainer
{ {
RelativeSizeAxes = Axes.X, new ScrollContainer
AutoSizeAxes = Axes.Y, {
Child = rooms = new RoomsContainer { JoinRequested = r => roomManager?.JoinRoom(r) } RelativeSizeAxes = Axes.Both,
}, ScrollbarOverlapsContent = false,
Padding = new MarginPadding(10),
Child = new SearchContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Child = rooms = new RoomsContainer { JoinRequested = joinRequested }
},
},
processingOverlay = new ProcessingOverlay { Alpha = 0 }
}
}, },
inspector = new RoomInspector inspector = new RoomInspector
{ {
@ -74,13 +84,6 @@ namespace osu.Game.Screens.Multi.Lounge
Filter.Search.Exit += Exit; Filter.Search.Exit += Exit;
} }
[BackgroundDependencyLoader]
private void load()
{
if (roomManager != null)
roomManager.RoomJoined += Push;
}
protected override void UpdateAfterChildren() protected override void UpdateAfterChildren()
{ {
base.UpdateAfterChildren(); base.UpdateAfterChildren();
@ -123,6 +126,16 @@ namespace osu.Game.Screens.Multi.Lounge
roomManager?.Filter(Filter.CreateCriteria()); roomManager?.Filter(Filter.CreateCriteria());
} }
private void joinRequested(Room room)
{
processingOverlay.Show();
roomManager?.JoinRoom(room, r =>
{
Open(room);
processingOverlay.Hide();
}, _ => processingOverlay.Hide());
}
/// <summary> /// <summary>
/// Push a room as a new subscreen. /// Push a room as a new subscreen.
/// </summary> /// </summary>
@ -134,13 +147,5 @@ namespace osu.Game.Screens.Multi.Lounge
Push(new MatchSubScreen(room, s => pushGameplayScreen?.Invoke(s))); Push(new MatchSubScreen(room, s => pushGameplayScreen?.Invoke(s)));
} }
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
if (roomManager != null)
roomManager.RoomJoined -= Push;
}
} }
} }

View File

@ -301,7 +301,7 @@ namespace osu.Game.Screens.Multi.Match.Components
private void hideError() => ErrorText.FadeOut(50); private void hideError() => ErrorText.FadeOut(50);
private void onSuccess() => processingOverlay.Hide(); private void onSuccess(Room room) => processingOverlay.Hide();
private void onError(string text) private void onError(string text)
{ {

View File

@ -19,8 +19,6 @@ namespace osu.Game.Screens.Multi
{ {
public class RoomManager : PollingComponent, IRoomManager public class RoomManager : PollingComponent, IRoomManager
{ {
public event Action<Room> RoomJoined;
private readonly BindableCollection<Room> rooms = new BindableCollection<Room>(); private readonly BindableCollection<Room> rooms = new BindableCollection<Room>();
public IBindableCollection<Room> Rooms => rooms; public IBindableCollection<Room> Rooms => rooms;
@ -48,7 +46,7 @@ namespace osu.Game.Screens.Multi
PartRoom(); PartRoom();
} }
public void CreateRoom(Room room, Action onSuccess = null, Action<string> onError = null) public void CreateRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null)
{ {
room.Host.Value = api.LocalUser; room.Host.Value = api.LocalUser;
@ -58,7 +56,7 @@ namespace osu.Game.Screens.Multi
update(room, result); update(room, result);
addRoom(room); addRoom(room);
onSuccess?.Invoke(); onSuccess?.Invoke(room);
}; };
req.Failure += exception => req.Failure += exception =>
@ -74,7 +72,7 @@ namespace osu.Game.Screens.Multi
private JoinRoomRequest currentJoinRoomRequest; private JoinRoomRequest currentJoinRoomRequest;
public void JoinRoom(Room room) public void JoinRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null)
{ {
currentJoinRoomRequest?.Cancel(); currentJoinRoomRequest?.Cancel();
currentJoinRoomRequest = null; currentJoinRoomRequest = null;
@ -83,10 +81,14 @@ namespace osu.Game.Screens.Multi
currentJoinRoomRequest.Success += () => currentJoinRoomRequest.Success += () =>
{ {
currentRoom = room; currentRoom = room;
RoomJoined?.Invoke(room); onSuccess?.Invoke(room);
}; };
currentJoinRoomRequest.Failure += exception => Logger.Log($"Failed to join room: {exception}", level: LogLevel.Important); currentJoinRoomRequest.Failure += exception =>
{
Logger.Log($"Failed to join room: {exception}", level: LogLevel.Important);
onError?.Invoke(exception.ToString());
};
api.Queue(currentJoinRoomRequest); api.Queue(currentJoinRoomRequest);
} }