From 1c47773e0dac8fbd7f1d855fc59f88c03a044059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sat, 12 Nov 2016 13:08:34 +0100 Subject: [PATCH] Make sidebar behaviour feel a bit nicer. --- osu.Game/Overlays/OptionsOverlay.cs | 37 ++++++++++++++++------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/osu.Game/Overlays/OptionsOverlay.cs b/osu.Game/Overlays/OptionsOverlay.cs index d29580adfa..6f79fedf88 100644 --- a/osu.Game/Overlays/OptionsOverlay.cs +++ b/osu.Game/Overlays/OptionsOverlay.cs @@ -22,6 +22,7 @@ using osu.Game.Overlays.Options.Graphics; using osu.Game.Overlays.Options.Input; using osu.Game.Overlays.Options.Online; +using System; namespace osu.Game.Overlays { @@ -112,8 +113,7 @@ public OptionsOverlay() { Selected = sections[0] == section, Section = section, - Action = () => scrollContainer.ScrollTo( - scrollContainer.GetChildYInContent(section) - scrollContainer.DrawSize.Y / 2), + Action = () => scrollContainer.ScrollIntoView(section), } ).ToArray() } @@ -130,26 +130,31 @@ protected override void Update() { base.Update(); - if (scrollContainer.Current != lastKnownScroll) + float currentScroll = scrollContainer.Current; + if (currentScroll != lastKnownScroll) { - lastKnownScroll = scrollContainer.Current; + lastKnownScroll = currentScroll; - for (int i = sections.Length - 1; i >= 0; i--) + OptionsSection bestCandidate = null; + float bestDistance = float.MaxValue; + + foreach (OptionsSection section in sections) { - var section = sections[i]; - float y = scrollContainer.GetChildYInContent(section) - scrollContainer.Current; - if (y <= scrollContainer.DrawSize.Y / 2 + 25) + float distance = Math.Abs(scrollContainer.GetChildYInContent(section) - currentScroll); + if (distance < bestDistance) { - var previous = sidebarButtons.SingleOrDefault(sb => sb.Selected); - var next = sidebarButtons.SingleOrDefault(sb => sb.Section == section); - if (next != null) - { - previous.Selected = false; - next.Selected = true; - } - break; + bestDistance = distance; + bestCandidate = section; } } + + var previous = sidebarButtons.SingleOrDefault(sb => sb.Selected); + var next = sidebarButtons.SingleOrDefault(sb => sb.Section == bestCandidate); + if (next != null) + { + previous.Selected = false; + next.Selected = true; + } } }