Add initial game-wide beatmap flow.

This commit is contained in:
Dean Herbert
2016-10-28 19:55:48 +09:00
parent 0f5614ffa2
commit 74f1a9622f
10 changed files with 197 additions and 51 deletions

View File

@ -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;
});
}