From a42c67ee9787f0336b8a2f40d27e0217c488c56c Mon Sep 17 00:00:00 2001 From: EVAST9919 Date: Thu, 1 Jun 2017 20:54:42 +0300 Subject: [PATCH] Cancel beatmap random selection --- osu.Game/Screens/Select/BeatmapCarousel.cs | 42 ++++++++++++++++++++-- osu.Game/Screens/Select/Footer.cs | 4 ++- osu.Game/Screens/Select/FooterButton.cs | 16 +++++++-- osu.Game/Screens/Select/PlaySongSelect.cs | 2 +- osu.Game/Screens/Select/SongSelect.cs | 9 ++++- 5 files changed, 65 insertions(+), 8 deletions(-) diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 26820fc388..07f6a7e5fd 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -77,8 +77,9 @@ namespace osu.Game.Screens.Select private readonly List panels = new List(); - private BeatmapGroup selectedGroup; + private readonly Stack randomSelectedBeatmaps = new Stack(); + private BeatmapGroup selectedGroup; private BeatmapPanel selectedPanel; public BeatmapCarousel() @@ -172,14 +173,17 @@ namespace osu.Game.Screens.Select public void SelectRandom() { - IEnumerable visibleGroups = groups.Where(selectGroup => selectGroup.State != BeatmapGroupState.Hidden); + randomSelectedBeatmaps.Push(selectedGroup); + + var visibleGroups = getVisibleGroups(); if (!visibleGroups.Any()) return; BeatmapGroup group; + if (randomType == SelectionRandomType.RandomPermutation) { - IEnumerable notSeenGroups = visibleGroups.Except(seenGroups); + var notSeenGroups = visibleGroups.Except(seenGroups); if (!notSeenGroups.Any()) { seenGroups.Clear(); @@ -197,6 +201,38 @@ namespace osu.Game.Screens.Select selectGroup(group, panel); } + public void CancelRandom() + { + if (!randomSelectedBeatmaps.Any()) + return; + + var visibleGroups = getVisibleGroups(); + if (!visibleGroups.Any()) + return; + + // we can avoid selecting deleted beatmaps or beatmaps selected in another gamemode + while (true) + { + if (!randomSelectedBeatmaps.Any()) break; + + if (!visibleGroups.Contains(randomSelectedBeatmaps.FirstOrDefault())) + { + randomSelectedBeatmaps.Pop(); + } + else + { + BeatmapGroup beatmapGroup = randomSelectedBeatmaps.Pop(); + selectGroup(beatmapGroup, beatmapGroup.SelectedPanel); + break; + } + } + } + + private IEnumerable getVisibleGroups() + { + return groups.Where(selectGroup => selectGroup.State != BeatmapGroupState.Hidden); + } + private FilterCriteria criteria = new FilterCriteria(); private ScheduledDelegate filterTask; diff --git a/osu.Game/Screens/Select/Footer.cs b/osu.Game/Screens/Select/Footer.cs index 32e09a5f28..0aa86f4d0d 100644 --- a/osu.Game/Screens/Select/Footer.cs +++ b/osu.Game/Screens/Select/Footer.cs @@ -38,12 +38,13 @@ namespace osu.Game.Screens.Select /// Text on the button. /// Colour of the button. /// Hotkey of the button. + /// Forbid you to use hotkey with shift pressed. /// Action the button does. /// /// Higher depth to be put on the left, and lower to be put on the right. /// Notice this is different to ! /// - public void AddButton(string text, Color4 colour, Action action, Key? hotkey = null, float depth = 0) + public void AddButton(string text, Color4 colour, Action action, Key? hotkey = null, bool excludePressWithShift = false, float depth = 0) { var button = new FooterButton { @@ -54,6 +55,7 @@ namespace osu.Game.Screens.Select SelectedColour = colour, DeselectedColour = colour.Opacity(0.5f), Hotkey = hotkey, + ExcludePressWithShift = excludePressWithShift, }; button.Hovered = () => updateModeLight(button); diff --git a/osu.Game/Screens/Select/FooterButton.cs b/osu.Game/Screens/Select/FooterButton.cs index 58df409ca1..98a0b41543 100644 --- a/osu.Game/Screens/Select/FooterButton.cs +++ b/osu.Game/Screens/Select/FooterButton.cs @@ -84,6 +84,7 @@ namespace osu.Game.Screens.Select public Action Hovered; public Action HoverLost; public Key? Hotkey; + public bool ExcludePressWithShift; protected override bool OnHover(InputState state) { @@ -124,8 +125,19 @@ namespace osu.Game.Screens.Select { if (!args.Repeat && args.Key == Hotkey) { - OnClick(state); - return true; + if (ExcludePressWithShift) + { + if (!state.Keyboard.ShiftPressed) + { + OnClick(state); + return true; + } + } + else + { + OnClick(state); + return true; + } } return base.OnKeyDown(state, args); diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index f96fbb87cb..0903184b40 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -42,7 +42,7 @@ namespace osu.Game.Screens.Select [BackgroundDependencyLoader] private void load(OsuColour colours) { - Footer.AddButton(@"mods", colours.Yellow, modSelect.ToggleVisibility, Key.F1, float.MaxValue); + Footer.AddButton(@"mods", colours.Yellow, modSelect.ToggleVisibility, Key.F1, false, float.MaxValue); BeatmapOptions.AddButton(@"Remove", @"from unplayed", FontAwesome.fa_times_circle_o, colours.Purple, null, Key.Number1); BeatmapOptions.AddButton(@"Clear", @"local scores", FontAwesome.fa_eraser, colours.Purple, null, Key.Number2); diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index 41fa53e8a3..1451d2e4fd 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -158,7 +158,7 @@ namespace osu.Game.Screens.Select { if (Footer != null) { - Footer.AddButton(@"random", colours.Green, SelectRandom, Key.F2); + Footer.AddButton(@"random", colours.Green, SelectRandom, Key.F2, true); Footer.AddButton(@"options", colours.Blue, BeatmapOptions.ToggleVisibility, Key.F3); BeatmapOptions.AddButton(@"Delete", @"Beatmap", FontAwesome.fa_trash, colours.Pink, promptDelete, Key.Number4, float.MaxValue); @@ -381,6 +381,13 @@ namespace osu.Game.Screens.Select return true; } break; + case Key.F2: + if (state.Keyboard.ShiftPressed) + { + carousel.CancelRandom(); + return true; + } + break; } return base.OnKeyDown(state, args);