mirror of
https://github.com/osukey/osukey.git
synced 2025-08-03 06:36:31 +09:00
Add initial game-wide beatmap flow.
This commit is contained in:
@ -16,8 +16,11 @@ using OpenTK;
|
||||
using OpenTK.Graphics;
|
||||
using osu.Framework.Graphics.UserInterface;
|
||||
using System.Threading.Tasks;
|
||||
using osu.Framework.Audio.Track;
|
||||
using osu.Game.Beatmaps.Drawable;
|
||||
using osu.Framework.Extensions.IEnumerableExtensions;
|
||||
using osu.Game.Beatmaps;
|
||||
using osu.Framework.GameModes;
|
||||
|
||||
namespace osu.Game.GameModes.Play
|
||||
{
|
||||
@ -26,10 +29,12 @@ namespace osu.Game.GameModes.Play
|
||||
private Bindable<PlayMode> playMode;
|
||||
private BeatmapDatabase database;
|
||||
private BeatmapGroup selectedBeatmapGroup;
|
||||
private BeatmapInfo selectedBeatmapInfo;
|
||||
// TODO: use currently selected track as bg
|
||||
protected override BackgroundMode CreateBackground() => new BackgroundModeCustom(@"Backgrounds/bg4");
|
||||
private ScrollContainer scrollContainer;
|
||||
private FlowContainer setList;
|
||||
private FlowContainer beatmapSetFlow;
|
||||
private TrackManager trackManager;
|
||||
|
||||
/// <param name="database">Optionally provide a database to use instead of the OsuGame one.</param>
|
||||
public PlaySongSelect(BeatmapDatabase database = null)
|
||||
@ -73,7 +78,7 @@ namespace osu.Game.GameModes.Play
|
||||
Origin = Anchor.CentreRight,
|
||||
Children = new Drawable[]
|
||||
{
|
||||
setList = new FlowContainer
|
||||
beatmapSetFlow = new FlowContainer
|
||||
{
|
||||
Padding = new MarginPadding { Left = 25, Top = 25, Bottom = 25 + bottomToolHeight },
|
||||
RelativeSizeAxes = Axes.X,
|
||||
@ -123,7 +128,7 @@ namespace osu.Game.GameModes.Play
|
||||
if (osuGame != null)
|
||||
{
|
||||
playMode = osuGame.PlayMode;
|
||||
playMode.ValueChanged += PlayMode_ValueChanged;
|
||||
playMode.ValueChanged += playMode_ValueChanged;
|
||||
// Temporary:
|
||||
scrollContainer.Padding = new MarginPadding { Top = osuGame.Toolbar.Height };
|
||||
}
|
||||
@ -133,22 +138,68 @@ namespace osu.Game.GameModes.Play
|
||||
|
||||
database.BeatmapSetAdded += s => Schedule(() => addBeatmapSet(s));
|
||||
|
||||
trackManager = game.Audio.Track;
|
||||
|
||||
Task.Factory.StartNew(addBeatmapSets);
|
||||
}
|
||||
|
||||
protected override void OnEntering(GameMode last)
|
||||
{
|
||||
base.OnEntering(last);
|
||||
ensurePlayingSelected();
|
||||
}
|
||||
|
||||
protected override void OnResuming(GameMode last)
|
||||
{
|
||||
ensurePlayingSelected();
|
||||
|
||||
base.OnResuming(last);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool isDisposing)
|
||||
{
|
||||
base.Dispose(isDisposing);
|
||||
if (playMode != null)
|
||||
playMode.ValueChanged -= PlayMode_ValueChanged;
|
||||
playMode.ValueChanged -= playMode_ValueChanged;
|
||||
}
|
||||
|
||||
private void PlayMode_ValueChanged(object sender, EventArgs e)
|
||||
private void playMode_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
}
|
||||
|
||||
private void selectBeatmap(BeatmapGroup group, BeatmapInfo beatmap)
|
||||
protected override void OnBeatmapChanged(WorkingBeatmap beatmap)
|
||||
{
|
||||
base.OnBeatmapChanged(beatmap);
|
||||
selectBeatmap(beatmap.Beatmap.BeatmapInfo);
|
||||
}
|
||||
|
||||
private void selectBeatmap(BeatmapInfo beatmap)
|
||||
{
|
||||
if (beatmap.Equals(selectedBeatmapInfo))
|
||||
return;
|
||||
|
||||
beatmapSetFlow.Children.Cast<BeatmapGroup>().First(b =>
|
||||
{
|
||||
var panel = b.BeatmapPanels.FirstOrDefault(p => p.Beatmap.Equals(beatmap));
|
||||
panel?.TriggerClick();
|
||||
return panel != null;
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// selection has been changed as the result of interaction with the carousel.
|
||||
/// </summary>
|
||||
private void selectionChanged(BeatmapGroup group, BeatmapInfo beatmap)
|
||||
{
|
||||
selectedBeatmapInfo = beatmap;
|
||||
|
||||
if (!beatmap.Equals(Beatmap?.Beatmap?.BeatmapInfo))
|
||||
{
|
||||
Beatmap = database.GetWorkingBeatmap(beatmap);
|
||||
}
|
||||
|
||||
ensurePlayingSelected();
|
||||
|
||||
if (selectedBeatmapGroup == group)
|
||||
return;
|
||||
|
||||
@ -158,6 +209,17 @@ namespace osu.Game.GameModes.Play
|
||||
selectedBeatmapGroup = group;
|
||||
}
|
||||
|
||||
private void ensurePlayingSelected()
|
||||
{
|
||||
var track = Beatmap?.Track;
|
||||
|
||||
if (track != null)
|
||||
{
|
||||
trackManager.SetExclusive(track);
|
||||
track.Start();
|
||||
}
|
||||
}
|
||||
|
||||
private void addBeatmapSet(BeatmapSetInfo beatmapSet)
|
||||
{
|
||||
beatmapSet = database.GetWithChildren<BeatmapSetInfo>(beatmapSet.BeatmapSetID);
|
||||
@ -165,9 +227,9 @@ namespace osu.Game.GameModes.Play
|
||||
beatmapSet.Beatmaps = beatmapSet.Beatmaps.OrderBy(b => b.BaseDifficulty.OverallDifficulty).ToList();
|
||||
Schedule(() =>
|
||||
{
|
||||
var group = new BeatmapGroup(beatmapSet) { SelectionChanged = selectBeatmap };
|
||||
setList.Add(group);
|
||||
if (setList.Children.Count() == 1)
|
||||
var group = new BeatmapGroup(beatmapSet) { SelectionChanged = selectionChanged };
|
||||
beatmapSetFlow.Add(group);
|
||||
if (beatmapSetFlow.Children.Count() == 1)
|
||||
group.State = BeatmapGroupState.Expanded;
|
||||
});
|
||||
}
|
||||
|
Reference in New Issue
Block a user