From b10240d7ef41f1a41edbfa6d0717a907823be6ff Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 11 Dec 2017 21:31:26 +0900 Subject: [PATCH] Handle the case where the selected panel is no longer a valid selection better --- osu.Game/Beatmaps/Drawables/BeatmapGroup.cs | 45 +++++++++++---------- osu.Game/Screens/Select/BeatmapCarousel.cs | 10 +++-- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs index 59ff7b06e5..e0536584bd 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs @@ -47,31 +47,34 @@ namespace osu.Game.Beatmaps.Drawables set { state = value; - - switch (value) - { - case BeatmapGroupState.Expanded: - Header.State = PanelSelectedState.Selected; - foreach (BeatmapPanel panel in BeatmapPanels) - panel.State = panel == SelectedPanel ? PanelSelectedState.Selected : - !panel.Filtered ? PanelSelectedState.NotSelected : PanelSelectedState.Hidden; - break; - case BeatmapGroupState.Collapsed: - Header.State = PanelSelectedState.NotSelected; - foreach (BeatmapPanel panel in BeatmapPanels) - panel.State = PanelSelectedState.Hidden; - break; - case BeatmapGroupState.Hidden: - Header.State = PanelSelectedState.Hidden; - foreach (BeatmapPanel panel in BeatmapPanels) - panel.State = PanelSelectedState.Hidden; - break; - } - + UpdateState(); StateChanged?.Invoke(state); } } + public void UpdateState() + { + switch (state) + { + case BeatmapGroupState.Expanded: + Header.State = PanelSelectedState.Selected; + foreach (BeatmapPanel panel in BeatmapPanels) + panel.State = panel == SelectedPanel ? PanelSelectedState.Selected : + !panel.Filtered ? PanelSelectedState.NotSelected : PanelSelectedState.Hidden; + break; + case BeatmapGroupState.Collapsed: + Header.State = PanelSelectedState.NotSelected; + foreach (BeatmapPanel panel in BeatmapPanels) + panel.State = PanelSelectedState.Hidden; + break; + case BeatmapGroupState.Hidden: + Header.State = PanelSelectedState.Hidden; + foreach (BeatmapPanel panel in BeatmapPanels) + panel.State = PanelSelectedState.Hidden; + break; + } + } + public BeatmapGroup(BeatmapSetInfo beatmapSet, BeatmapManager manager) { if (beatmapSet == null) diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index aa41cad67e..f6b832d0f7 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -327,6 +327,8 @@ namespace osu.Game.Screens.Select computeYPositions(); + selectedGroup?.UpdateState(); + if (selectedGroup == null || selectedGroup.State == BeatmapGroupState.Hidden) SelectNext(); else @@ -441,11 +443,13 @@ namespace osu.Game.Screens.Select panel.MoveToX(-50, 500, Easing.OutExpo); + bool isHidden = panel.State == PanelSelectedState.Hidden; + //on first display we want to begin hidden under our group's header. - if (panel.Filtered || panel.Alpha == 0) + if (isHidden || panel.Alpha == 0) panel.MoveToY(headerY); - movePanel(panel, !panel.Filtered, animated, ref currentY); + movePanel(panel, !isHidden, animated, ref currentY); } } else @@ -479,7 +483,7 @@ namespace osu.Game.Screens.Select { try { - if (panel == null) + if (panel == null || panel.Filtered == true) panel = group.BeatmapPanels.First(p => !p.Filtered); if (selectedPanel == panel) return;