diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerQueueList.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerQueueList.cs index ef71dfe772..1a646d5e7e 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerQueueList.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerQueueList.cs @@ -6,7 +6,6 @@ using System.Linq; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Audio; -using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Platform; @@ -26,8 +25,6 @@ namespace osu.Game.Tests.Visual.Multiplayer { public class TestSceneMultiplayerQueueList : MultiplayerTestScene { - private readonly Bindable selectedItem = new Bindable(); - [Cached(typeof(UserLookupCache))] private readonly TestUserLookupCache userLookupCache = new TestUserLookupCache(); @@ -50,14 +47,11 @@ namespace osu.Game.Tests.Visual.Multiplayer AddStep("create playlist", () => { - selectedItem.Value = null; - Child = playlist = new MultiplayerQueueList { Anchor = Anchor.Centre, Origin = Anchor.Centre, Size = new Vector2(500, 300), - SelectedItem = { BindTarget = selectedItem }, Items = { BindTarget = Client.APIRoom!.Playlist } }; }); @@ -111,12 +105,14 @@ namespace osu.Game.Tests.Visual.Multiplayer addPlaylistItem(() => API.LocalUser.Value.OnlineID); - AddStep("select item 0", () => selectedItem.Value = playlist.ChildrenOfType>().ElementAt(0).Model); assertDeleteButtonVisibility(0, false); assertDeleteButtonVisibility(1, true); - AddStep("select item 1", () => selectedItem.Value = playlist.ChildrenOfType>().ElementAt(1).Model); - assertDeleteButtonVisibility(0, true); + AddStep("finish current item", () => Client.FinishCurrentItem()); + AddUntilStep("wait for next item to be selected", () => Client.Room?.Settings.PlaylistItemId == 2); + AddUntilStep("wait for two items in playlist", () => playlist.ChildrenOfType().Count() == 2); + + assertDeleteButtonVisibility(0, false); assertDeleteButtonVisibility(1, false); } @@ -141,7 +137,10 @@ namespace osu.Game.Tests.Visual.Multiplayer } private void assertDeleteButtonVisibility(int index, bool visible) - => AddUntilStep($"delete button {index} {(visible ? "is" : "is not")} visible", - () => (playlist.ChildrenOfType().ElementAt(index).Alpha > 0) == visible); + => AddUntilStep($"delete button {index} {(visible ? "is" : "is not")} visible", () => + { + var button = playlist.ChildrenOfType().ElementAtOrDefault(index); + return (button?.Alpha > 0) == visible; + }); } } diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/Playlist/MultiplayerQueueList.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/Playlist/MultiplayerQueueList.cs index 3e0f663d42..1653d416d8 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/Playlist/MultiplayerQueueList.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/Playlist/MultiplayerQueueList.cs @@ -8,7 +8,6 @@ using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Online.API; -using osu.Game.Online.API.Requests.Responses; using osu.Game.Online.Multiplayer; using osu.Game.Online.Rooms; using osuTK; @@ -54,12 +53,6 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match.Playlist [Resolved] private MultiplayerClient multiplayerClient { get; set; } - [Resolved(typeof(Room), nameof(Room.Host))] - private Bindable host { get; set; } - - [Resolved(typeof(Room), nameof(Room.QueueMode))] - private Bindable queueMode { get; set; } - public QueuePlaylistItem(PlaylistItem item) : base(item) { @@ -71,17 +64,29 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match.Playlist RequestDeletion = item => multiplayerClient.RemovePlaylistItem(item.ID); - host.BindValueChanged(_ => updateDeleteButtonVisibility()); - queueMode.BindValueChanged(_ => updateDeleteButtonVisibility()); - SelectedItem.BindValueChanged(_ => updateDeleteButtonVisibility(), true); + multiplayerClient.RoomUpdated += onRoomUpdated; + onRoomUpdated(); } + private void onRoomUpdated() => Scheduler.AddOnce(updateDeleteButtonVisibility); + private void updateDeleteButtonVisibility() { + if (multiplayerClient.Room == null) + return; + bool isItemOwner = Item.OwnerID == api.LocalUser.Value.OnlineID || multiplayerClient.IsHost; - AllowDeletion = isItemOwner && SelectedItem.Value != Item; - AllowEditing = isItemOwner; + AllowDeletion = isItemOwner && !Item.Expired && Item.ID != multiplayerClient.Room.Settings.PlaylistItemId; + AllowEditing = isItemOwner && !Item.Expired; + } + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + + if (multiplayerClient != null) + multiplayerClient.RoomUpdated -= onRoomUpdated; } } }