diff --git a/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs b/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs index 585b024623..9fee739048 100644 --- a/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs +++ b/osu.Game/Screens/OnlinePlay/DrawableRoomPlaylistItem.cs @@ -34,6 +34,8 @@ namespace osu.Game.Screens.OnlinePlay { public class DrawableRoomPlaylistItem : OsuRearrangeableListItem { + public const float HEIGHT = 50; + public Action RequestDeletion; public readonly Bindable SelectedItem = new Bindable(); @@ -135,7 +137,7 @@ namespace osu.Game.Screens.OnlinePlay return maskingContainer = new Container { RelativeSizeAxes = Axes.X, - Height = 50, + Height = HEIGHT, Masking = true, CornerRadius = 10, Children = new Drawable[] diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/BeatmapSelectionControl.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/BeatmapSelectionControl.cs deleted file mode 100644 index 35f30edf65..0000000000 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/BeatmapSelectionControl.cs +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using osu.Framework.Allocation; -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.UserInterface; -using osu.Framework.Screens; -using osu.Game.Online.API; -using osu.Game.Screens.OnlinePlay.Match.Components; -using osuTK; - -namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match -{ - public class BeatmapSelectionControl : OnlinePlayComposite - { - [Resolved] - private MultiplayerMatchSubScreen matchSubScreen { get; set; } - - [Resolved] - private IAPIProvider api { get; set; } - - private Container beatmapPanelContainer; - private Button selectButton; - - public BeatmapSelectionControl() - { - AutoSizeAxes = Axes.Y; - } - - [BackgroundDependencyLoader] - private void load() - { - InternalChild = new FillFlowContainer - { - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y, - Direction = FillDirection.Vertical, - Spacing = new Vector2(5), - Children = new Drawable[] - { - beatmapPanelContainer = new Container - { - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y - }, - selectButton = new PurpleTriangleButton - { - RelativeSizeAxes = Axes.X, - Height = 40, - Text = "Select beatmap", - Action = () => - { - if (matchSubScreen.IsCurrentScreen()) - matchSubScreen.Push(new MultiplayerMatchSongSelect(matchSubScreen.Room)); - }, - Alpha = 0 - } - } - }; - } - - protected override void LoadComplete() - { - base.LoadComplete(); - - SelectedItem.BindValueChanged(_ => updateBeatmap(), true); - Host.BindValueChanged(host => - { - if (RoomID.Value == null || host.NewValue?.Equals(api.LocalUser.Value) == true) - selectButton.Show(); - else - selectButton.Hide(); - }, true); - } - - public void BeginSelection() => selectButton.TriggerClick(); - - private void updateBeatmap() - { - if (SelectedItem.Value == null) - beatmapPanelContainer.Clear(); - else - beatmapPanelContainer.Child = new DrawableRoomPlaylistItem(SelectedItem.Value, false, false); - } - } -} diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerMatchSettingsOverlay.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerMatchSettingsOverlay.cs index 4231aeae87..b5079fd2f2 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerMatchSettingsOverlay.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerMatchSettingsOverlay.cs @@ -11,6 +11,7 @@ using osu.Framework.Extensions.ExceptionExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; +using osu.Framework.Screens; using osu.Game.Beatmaps; using osu.Game.Graphics; using osu.Game.Graphics.Containers; @@ -68,9 +69,15 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match private OsuSpriteText typeLabel; private LoadingLayer loadingLayer; - private BeatmapSelectionControl initialBeatmapControl; - public void SelectBeatmap() => initialBeatmapControl.BeginSelection(); + public void SelectBeatmap() + { + if (matchSubScreen.IsCurrentScreen()) + matchSubScreen.Push(new MultiplayerMatchSongSelect(matchSubScreen.Room)); + } + + [Resolved] + private MultiplayerMatchSubScreen matchSubScreen { get; set; } [Resolved] private IRoomManager manager { get; set; } @@ -94,6 +101,8 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match private readonly Room room; + private Drawable playlistContainer; + public MatchSettings(Room room) { this.room = room; @@ -137,7 +146,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match AutoSizeAxes = Axes.Y, Direction = FillDirection.Vertical, Spacing = new Vector2(0, 10), - Children = new Drawable[] + Children = new[] { new Container { @@ -236,13 +245,32 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match } }, }, - initialBeatmapControl = new BeatmapSelectionControl + playlistContainer = new FillFlowContainer { Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, Width = 0.5f, - Depth = float.MaxValue + Depth = float.MaxValue, + Spacing = new Vector2(5), + Children = new Drawable[] + { + new DrawableRoomPlaylist(false, false) + { + RelativeSizeAxes = Axes.X, + Height = DrawableRoomPlaylistItem.HEIGHT, + Items = { BindTarget = Playlist }, + SelectedItem = { BindTarget = SelectedItem } + }, + new PurpleTriangleButton + { + RelativeSizeAxes = Axes.X, + Height = 40, + Text = "Select beatmap", + Action = SelectBeatmap + } + } } } } @@ -306,7 +334,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match Availability.BindValueChanged(availability => AvailabilityPicker.Current.Value = availability.NewValue, true); Type.BindValueChanged(type => TypePicker.Current.Value = type.NewValue, true); MaxParticipants.BindValueChanged(count => MaxParticipantsField.Text = count.NewValue?.ToString(), true); - RoomID.BindValueChanged(roomId => initialBeatmapControl.Alpha = roomId.NewValue == null ? 1 : 0, true); + RoomID.BindValueChanged(roomId => playlistContainer.Alpha = roomId.NewValue == null ? 1 : 0, true); Password.BindValueChanged(password => PasswordTextBox.Text = password.NewValue ?? string.Empty, true); operationInProgress.BindTo(ongoingOperationTracker.InProgress); diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs index 33df9fe2fa..ba6d3f354a 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerMatchSubScreen.cs @@ -14,8 +14,10 @@ using osu.Framework.Screens; using osu.Framework.Threading; using osu.Game.Beatmaps; using osu.Game.Configuration; +using osu.Game.Graphics.UserInterface; using osu.Game.Online; using osu.Game.Online.Multiplayer; +using osu.Game.Online.Multiplayer.Queueing; using osu.Game.Online.Rooms; using osu.Game.Overlays; using osu.Game.Overlays.Dialog; @@ -53,6 +55,8 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer [CanBeNull] private IDisposable readyClickOperation; + private OsuButton addOrEditPlaylistButton; + public MultiplayerMatchSubScreen(Room room) : base(room) { @@ -128,7 +132,35 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer Content = new[] { new Drawable[] { new OverlinedHeader("Beatmap") }, - new Drawable[] { new BeatmapSelectionControl { RelativeSizeAxes = Axes.X } }, + new Drawable[] + { + new FillFlowContainer + { + RelativeSizeAxes = Axes.Both, + Direction = FillDirection.Vertical, + Spacing = new Vector2(5), + Children = new Drawable[] + { + addOrEditPlaylistButton = new PurpleTriangleButton + { + RelativeSizeAxes = Axes.X, + Height = 40, + Action = () => + { + if (this.IsCurrentScreen()) + this.Push(new MultiplayerMatchSongSelect(Room)); + }, + Alpha = 0 + }, + new DrawableRoomPlaylist(false, false) + { + RelativeSizeAxes = Axes.Both, + Items = { BindTarget = Room.Playlist }, + SelectedItem = { BindTarget = SelectedItem } + }, + } + } + }, new[] { UserModsSection = new FillFlowContainer @@ -171,7 +203,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize), - new Dimension(GridSizeMode.AutoSize), + new Dimension(), new Dimension(GridSizeMode.AutoSize), } }, @@ -354,6 +386,24 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer return; } + switch (client.Room.Settings.QueueMode) + { + case QueueModes.HostOnly: + addOrEditPlaylistButton.Text = "Edit beatmap"; + addOrEditPlaylistButton.Alpha = client.Room.Host?.User?.Equals(client.LocalUser?.User) == true ? 1 : 0; + break; + + case QueueModes.FreeForAll: + case QueueModes.FairRotate: + addOrEditPlaylistButton.Text = "Add beatmap"; + addOrEditPlaylistButton.Alpha = 1; + break; + + default: + addOrEditPlaylistButton.Alpha = 0; + break; + } + Scheduler.AddOnce(UpdateMods); }