1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-13 14:12:56 +08:00

Merge remote-tracking branch 'smoogipoo/timeshift-wip' into timeshift-wip

# Conflicts:
#	osu.Game.Tests/Visual/TestCaseLoungeRoomsContainer.cs
#	osu.Game.Tests/Visual/TestCaseMatchSettingsOverlay.cs
#	osu.Game/Screens/Multi/IRoomManager.cs
#	osu.Game/Screens/Multi/Lounge/LoungeSubScreen.cs
#	osu.Game/Screens/Multi/Match/Components/MatchSettingsOverlay.cs
#	osu.Game/Screens/Multi/RoomManager.cs
This commit is contained in:
Dean Herbert 2018-12-26 21:32:12 +09:00
commit bf9954aede
6 changed files with 67 additions and 48 deletions

View File

@ -71,14 +71,14 @@ namespace osu.Game.Tests.Visual
private class TestRoomManager : IRoomManager
{
public event Action<Room> RoomJoined;
public readonly BindableCollection<Room> Rooms = new BindableCollection<Room>();
IBindableCollection<Room> IRoomManager.Rooms => Rooms;
public void CreateRoom(Room room, 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()
{

View File

@ -136,20 +136,20 @@ namespace osu.Game.Tests.Visual
public Func<Room, bool> CreateRequested;
public event Action<Room> RoomJoined;
public IBindableCollection<Room> Rooms { get; } = null;
public void CreateRoom(Room room, Action<string> onError = null)
public void CreateRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null)
{
if (CreateRequested == null)
return;
if (!CreateRequested.Invoke(room))
onError?.Invoke(FAILED_TEXT);
else
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();

View File

@ -10,11 +10,6 @@ namespace osu.Game.Screens.Multi
{
public interface IRoomManager
{
/// <summary>
/// Invoked when a room is joined.
/// </summary>
event Action<Room> RoomJoined;
/// <summary>
/// All the active <see cref="Room"/>s.
/// </summary>
@ -24,14 +19,17 @@ namespace osu.Game.Screens.Multi
/// Creates a new <see cref="Room"/>.
/// </summary>
/// <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="onError">An action to be invoked if an error occurred.</param>
void CreateRoom(Room room, Action<string> onError = null);
void CreateRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null);
/// <summary>
/// Joins a <see cref="Room"/>.
/// </summary>
/// <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>
/// 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.Input.Events;
using osu.Framework.Screens;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.Multiplayer;
using osu.Game.Overlays.SearchableList;
using osu.Game.Screens.Multi.Lounge.Components;
@ -21,6 +22,7 @@ namespace osu.Game.Screens.Multi.Lounge
private readonly Container content;
private readonly RoomsContainer rooms;
private readonly Action<Screen> pushGameplayScreen;
private readonly ProcessingOverlay processingOverlay;
[Resolved(CanBeNull = true)]
private IRoomManager roomManager { get; set; }
@ -43,18 +45,26 @@ namespace osu.Game.Screens.Multi.Lounge
RelativeSizeAxes = Axes.Both,
Children = new Drawable[]
{
new ScrollContainer
new Container
{
RelativeSizeAxes = Axes.Both,
Width = 0.55f,
ScrollbarOverlapsContent = false,
Padding = new MarginPadding(10),
Child = new SearchContainer
Children = new Drawable[]
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Child = rooms = new RoomsContainer { JoinRequested = r => roomManager?.JoinRoom(r) }
},
new ScrollContainer
{
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
{
@ -74,13 +84,6 @@ namespace osu.Game.Screens.Multi.Lounge
Filter.Search.Exit += Exit;
}
[BackgroundDependencyLoader]
private void load()
{
if (roomManager != null)
roomManager.RoomJoined += Push;
}
protected override void UpdateAfterChildren()
{
base.UpdateAfterChildren();
@ -123,6 +126,16 @@ namespace osu.Game.Screens.Multi.Lounge
roomManager?.Filter(Filter.CreateCriteria());
}
private void joinRequested(Room room)
{
processingOverlay.Show();
roomManager?.JoinRoom(room, r =>
{
Push(room);
processingOverlay.Hide();
}, _ => processingOverlay.Hide());
}
/// <summary>
/// Push a room as a new subscreen.
/// </summary>
@ -134,13 +147,5 @@ namespace osu.Game.Screens.Multi.Lounge
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

@ -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,22 @@ 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(Room room) => processingOverlay.Hide();
private void onError(string text)
{
ErrorText.Text = text;
ErrorText.FadeIn(50);
processingOverlay.Hide();
}
private class SettingsTextBox : OsuTextBox

View File

@ -19,8 +19,6 @@ namespace osu.Game.Screens.Multi
{
public class RoomManager : PollingComponent, IRoomManager
{
public event Action<Room> RoomJoined;
private readonly BindableCollection<Room> rooms = new BindableCollection<Room>();
public IBindableCollection<Room> Rooms => rooms;
@ -42,21 +40,25 @@ namespace osu.Game.Screens.Multi
TimeBetweenPolls = 5000;
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
PartRoom();
}
public void CreateRoom(Room room, Action<string> onError = null)
public void CreateRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null)
{
room.Host.Value = api.LocalUser;
var req = new CreateRoomRequest(room);
req.Success += result =>
{
update(room, result);
addRoom(room);
onSuccess?.Invoke(room);
};
req.Failure += exception =>
@ -72,7 +74,7 @@ namespace osu.Game.Screens.Multi
private JoinRoomRequest currentJoinRoomRequest;
public void JoinRoom(Room room)
public void JoinRoom(Room room, Action<Room> onSuccess = null, Action<string> onError = null)
{
currentJoinRoomRequest?.Cancel();
currentJoinRoomRequest = null;
@ -81,10 +83,14 @@ namespace osu.Game.Screens.Multi
currentJoinRoomRequest.Success += () =>
{
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);
}