From 8460e29bcbb8da5e69a9e800816f8baa41da49b3 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 13 Jul 2017 16:26:40 +0900 Subject: [PATCH 1/5] Sidebar now pushes full settings out further --- osu.Game/Overlays/Settings/Sidebar.cs | 6 +++--- osu.Game/Overlays/SettingsOverlay.cs | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sidebar.cs b/osu.Game/Overlays/Settings/Sidebar.cs index 6c91f69fd9..ff2386d11b 100644 --- a/osu.Game/Overlays/Settings/Sidebar.cs +++ b/osu.Game/Overlays/Settings/Sidebar.cs @@ -50,10 +50,10 @@ namespace osu.Game.Overlays.Settings protected override bool OnHover(InputState state) { + expandEvent?.Cancel(); expandEvent = Scheduler.AddDelayed(() => { - expandEvent = null; - ResizeTo(new Vector2(EXPANDED_WIDTH, Height), 150, EasingTypes.OutQuad); + ResizeTo(new Vector2(EXPANDED_WIDTH, Height), 500, EasingTypes.OutQuint); }, 750); return true; } @@ -61,7 +61,7 @@ namespace osu.Game.Overlays.Settings protected override void OnHoverLost(InputState state) { expandEvent?.Cancel(); - ResizeTo(new Vector2(DEFAULT_WIDTH, Height), 150, EasingTypes.OutQuad); + ResizeTo(new Vector2(DEFAULT_WIDTH, Height), 500, EasingTypes.OutQuint); base.OnHoverLost(state); } diff --git a/osu.Game/Overlays/SettingsOverlay.cs b/osu.Game/Overlays/SettingsOverlay.cs index 4a5a0de890..fa55134c1f 100644 --- a/osu.Game/Overlays/SettingsOverlay.cs +++ b/osu.Game/Overlays/SettingsOverlay.cs @@ -148,6 +148,13 @@ namespace osu.Game.Overlays base.OnFocus(state); } + protected override void UpdateAfterChildren() + { + base.UpdateAfterChildren(); + + sectionsContainer.Margin = new MarginPadding { Left = sidebar.DrawWidth }; + } + private class SettingsSectionsContainer : SectionsContainer { public SearchContainer SearchContainer; From f4fd263671f8fab8a4d1b943dbac586fd71d3f3d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 13 Jul 2017 16:28:31 +0900 Subject: [PATCH 2/5] Fix settings not offsetting scroll operations by fixed header content --- osu.Game/Graphics/Containers/SectionsContainer.cs | 2 ++ osu.Game/Overlays/SettingsOverlay.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/osu.Game/Graphics/Containers/SectionsContainer.cs b/osu.Game/Graphics/Containers/SectionsContainer.cs index 90cfa9046a..b43f6da8d7 100644 --- a/osu.Game/Graphics/Containers/SectionsContainer.cs +++ b/osu.Game/Graphics/Containers/SectionsContainer.cs @@ -123,6 +123,8 @@ namespace osu.Game.Graphics.Containers originalSectionsMargin = sectionsContainer.Margin; } + public void ScrollTo(Drawable section) => ScrollContainer.ScrollTo(ScrollContainer.GetChildPosInContent(section) - FixedHeader.BoundingBox.Height); + private float lastKnownScroll; protected override void UpdateAfterChildren() { diff --git a/osu.Game/Overlays/SettingsOverlay.cs b/osu.Game/Overlays/SettingsOverlay.cs index fa55134c1f..82dffbb3f7 100644 --- a/osu.Game/Overlays/SettingsOverlay.cs +++ b/osu.Game/Overlays/SettingsOverlay.cs @@ -93,7 +93,7 @@ namespace osu.Game.Overlays new SidebarButton { Section = section, - Action = b => sectionsContainer.ScrollContainer.ScrollTo(b), + Action = s => sectionsContainer.ScrollTo(s), } ).ToArray() } From 939e167d6a61623cdf400e4e0cc16e556c41547e Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 13 Jul 2017 16:39:27 +0900 Subject: [PATCH 3/5] Correct offset settings vertically based on toolbar visibility --- osu.Game/OsuGame.cs | 4 +++- osu.Game/Overlays/SettingsOverlay.cs | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index 961e296050..843861c0da 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -56,6 +56,8 @@ namespace osu.Game } } + public float ToolbarOffset => Toolbar.Position.Y + Toolbar.DrawHeight; + private OsuScreen screenStack; private VolumeControl volume; @@ -360,7 +362,7 @@ namespace osu.Game { base.UpdateAfterChildren(); - mainContent.Padding = new MarginPadding { Top = Toolbar.Position.Y + Toolbar.DrawHeight }; + mainContent.Padding = new MarginPadding { Top = ToolbarOffset }; Cursor.State = currentScreen?.HasLocalCursorDisplayed == false ? Visibility.Visible : Visibility.Hidden; } diff --git a/osu.Game/Overlays/SettingsOverlay.cs b/osu.Game/Overlays/SettingsOverlay.cs index 82dffbb3f7..2a5aa0390c 100644 --- a/osu.Game/Overlays/SettingsOverlay.cs +++ b/osu.Game/Overlays/SettingsOverlay.cs @@ -1,6 +1,7 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System; using System.Linq; using OpenTK.Graphics; using osu.Framework.Allocation; @@ -35,6 +36,8 @@ namespace osu.Game.Overlays private SearchTextBox searchTextBox; + private Func getToolbarHeight; + public SettingsOverlay() { RelativeSizeAxes = Axes.Y; @@ -111,7 +114,7 @@ namespace osu.Game.Overlays searchTextBox.Current.ValueChanged += newValue => sectionsContainer.SearchContainer.SearchTerm = newValue; - sectionsContainer.Padding = new MarginPadding { Top = game?.Toolbar.DrawHeight ?? 0 }; + getToolbarHeight = () => game?.ToolbarOffset ?? 0; } protected override void PopIn() @@ -153,6 +156,7 @@ namespace osu.Game.Overlays base.UpdateAfterChildren(); sectionsContainer.Margin = new MarginPadding { Left = sidebar.DrawWidth }; + sectionsContainer.Padding = new MarginPadding { Top = getToolbarHeight() }; } private class SettingsSectionsContainer : SectionsContainer From 2ff92ac25a4fd0b172762f683b018becf87eef36 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 13 Jul 2017 16:55:48 +0900 Subject: [PATCH 4/5] Contract sidebar on click Also makes queueing of expand more correct. --- osu.Game/Overlays/Settings/Sidebar.cs | 51 +++++++++++++++++++++++---- osu.Game/Overlays/SettingsOverlay.cs | 6 +++- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sidebar.cs b/osu.Game/Overlays/Settings/Sidebar.cs index ff2386d11b..d7ad212902 100644 --- a/osu.Game/Overlays/Settings/Sidebar.cs +++ b/osu.Game/Overlays/Settings/Sidebar.cs @@ -1,6 +1,7 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using osu.Framework; using OpenTK; using OpenTK.Graphics; using osu.Framework.Graphics; @@ -12,7 +13,7 @@ using osu.Game.Overlays.Toolbar; namespace osu.Game.Overlays.Settings { - public class Sidebar : Container + public class Sidebar : Container, IStateful { private readonly FillFlowContainer content; internal const float DEFAULT_WIDTH = ToolbarButton.WIDTH; @@ -47,21 +48,18 @@ namespace osu.Game.Overlays.Settings } private ScheduledDelegate expandEvent; + private ExpandedState state; protected override bool OnHover(InputState state) { - expandEvent?.Cancel(); - expandEvent = Scheduler.AddDelayed(() => - { - ResizeTo(new Vector2(EXPANDED_WIDTH, Height), 500, EasingTypes.OutQuint); - }, 750); + queueExpandIfHovering(); return true; } protected override void OnHoverLost(InputState state) { expandEvent?.Cancel(); - ResizeTo(new Vector2(DEFAULT_WIDTH, Height), 500, EasingTypes.OutQuint); + State = ExpandedState.Contracted; base.OnHoverLost(state); } @@ -74,5 +72,44 @@ namespace osu.Game.Overlays.Settings RelativeSizeAxes = Axes.Both; } } + + public ExpandedState State + { + get { return state; } + set + { + // if the state is changed externally, we want to re-queue a delayed expand. + queueExpandIfHovering(); + + if (state == value) return; + + state = value; + + switch (state) + { + default: + ResizeTo(new Vector2(DEFAULT_WIDTH, Height), 500, EasingTypes.OutQuint); + break; + case ExpandedState.Expanded: + ResizeTo(new Vector2(EXPANDED_WIDTH, Height), 500, EasingTypes.OutQuint); + break; + } + } + } + + private void queueExpandIfHovering() + { + if (IsHovered) + { + expandEvent?.Cancel(); + expandEvent = Scheduler.AddDelayed(() => State = ExpandedState.Expanded, 750); + } + } + } + + public enum ExpandedState + { + Contracted, + Expanded, } } \ No newline at end of file diff --git a/osu.Game/Overlays/SettingsOverlay.cs b/osu.Game/Overlays/SettingsOverlay.cs index 2a5aa0390c..66b15234c3 100644 --- a/osu.Game/Overlays/SettingsOverlay.cs +++ b/osu.Game/Overlays/SettingsOverlay.cs @@ -96,7 +96,11 @@ namespace osu.Game.Overlays new SidebarButton { Section = section, - Action = s => sectionsContainer.ScrollTo(s), + Action = s => + { + sectionsContainer.ScrollTo(s); + sidebar.State = ExpandedState.Contracted; + }, } ).ToArray() } From 9dba363b0888b32bbe155dedb587ed68bec18697 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 14 Jul 2017 17:57:01 +0900 Subject: [PATCH 5/5] Use button boundaries to decide when to expand sidebar --- osu.Game/Overlays/Settings/Sidebar.cs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sidebar.cs b/osu.Game/Overlays/Settings/Sidebar.cs index d7ad212902..44d296a079 100644 --- a/osu.Game/Overlays/Settings/Sidebar.cs +++ b/osu.Game/Overlays/Settings/Sidebar.cs @@ -1,6 +1,7 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System.Linq; using osu.Framework; using OpenTK; using OpenTK.Graphics; @@ -59,10 +60,18 @@ namespace osu.Game.Overlays.Settings protected override void OnHoverLost(InputState state) { expandEvent?.Cancel(); + lastHoveredButton = null; State = ExpandedState.Contracted; + base.OnHoverLost(state); } + protected override bool OnMouseMove(InputState state) + { + queueExpandIfHovering(); + return base.OnMouseMove(state); + } + private class SidebarScrollContainer : ScrollContainer { public SidebarScrollContainer() @@ -78,9 +87,6 @@ namespace osu.Game.Overlays.Settings get { return state; } set { - // if the state is changed externally, we want to re-queue a delayed expand. - queueExpandIfHovering(); - if (state == value) return; state = value; @@ -97,13 +103,24 @@ namespace osu.Game.Overlays.Settings } } + private Drawable lastHoveredButton; + + private Drawable hoveredButton => content.Children.FirstOrDefault(c => c.IsHovered); + private void queueExpandIfHovering() { - if (IsHovered) + // only expand when we hover a different button. + if (lastHoveredButton == hoveredButton) return; + + if (!IsHovered) return; + + if (State != ExpandedState.Expanded) { expandEvent?.Cancel(); expandEvent = Scheduler.AddDelayed(() => State = ExpandedState.Expanded, 750); } + + lastHoveredButton = hoveredButton; } }