mirror of
https://github.com/ppy/osu.git
synced 2024-11-13 20:07:25 +08:00
Add support for traversing playlist items using next/previous bindings
Addresses https://github.com/ppy/osu/discussions/18061.
This commit is contained in:
parent
2f12c7d9e1
commit
df1f4aecdc
@ -6,7 +6,10 @@ using System.Linq;
|
|||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Input.Bindings;
|
||||||
|
using osu.Framework.Input.Events;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
|
using osu.Game.Input.Bindings;
|
||||||
using osu.Game.Online.Rooms;
|
using osu.Game.Online.Rooms;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
@ -15,7 +18,7 @@ namespace osu.Game.Screens.OnlinePlay
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// A scrollable list which displays the <see cref="PlaylistItem"/>s in a <see cref="Room"/>.
|
/// A scrollable list which displays the <see cref="PlaylistItem"/>s in a <see cref="Room"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DrawableRoomPlaylist : OsuRearrangeableListContainer<PlaylistItem>
|
public class DrawableRoomPlaylist : OsuRearrangeableListContainer<PlaylistItem>, IKeyBindingHandler<GlobalAction>
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The currently-selected item. Selection is visually represented with a border.
|
/// The currently-selected item. Selection is visually represented with a border.
|
||||||
@ -169,5 +172,53 @@ namespace osu.Game.Screens.OnlinePlay
|
|||||||
});
|
});
|
||||||
|
|
||||||
protected virtual DrawableRoomPlaylistItem CreateDrawablePlaylistItem(PlaylistItem item) => new DrawableRoomPlaylistItem(item);
|
protected virtual DrawableRoomPlaylistItem CreateDrawablePlaylistItem(PlaylistItem item) => new DrawableRoomPlaylistItem(item);
|
||||||
|
|
||||||
|
#region Key selection logic (shared with BeatmapCarousel and RoomsContainer)
|
||||||
|
|
||||||
|
public bool OnPressed(KeyBindingPressEvent<GlobalAction> e)
|
||||||
|
{
|
||||||
|
switch (e.Action)
|
||||||
|
{
|
||||||
|
case GlobalAction.SelectNext:
|
||||||
|
selectNext(1);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case GlobalAction.SelectPrevious:
|
||||||
|
selectNext(-1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnReleased(KeyBindingReleaseEvent<GlobalAction> e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private void selectNext(int direction)
|
||||||
|
{
|
||||||
|
if (SelectedItem.Disabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var visibleRooms = ListContainer.AsEnumerable().Where(r => r.IsPresent);
|
||||||
|
|
||||||
|
PlaylistItem item;
|
||||||
|
|
||||||
|
if (SelectedItem.Value == null)
|
||||||
|
item = visibleRooms.FirstOrDefault()?.Model;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (direction < 0)
|
||||||
|
visibleRooms = visibleRooms.Reverse();
|
||||||
|
|
||||||
|
item = visibleRooms.SkipWhile(r => r.Model != SelectedItem.Value).Skip(1).FirstOrDefault()?.Model;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we already have a valid selection only change selection if we still have a room to switch to.
|
||||||
|
if (item != null)
|
||||||
|
SelectedItem.Value = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,7 +139,7 @@ namespace osu.Game.Screens.OnlinePlay.Lounge.Components
|
|||||||
return base.OnClick(e);
|
return base.OnClick(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Key selection logic (shared with BeatmapCarousel)
|
#region Key selection logic (shared with BeatmapCarousel and RoomsContainer)
|
||||||
|
|
||||||
public bool OnPressed(KeyBindingPressEvent<GlobalAction> e)
|
public bool OnPressed(KeyBindingPressEvent<GlobalAction> e)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user