From f6e0e0bc38197ba9086b0e44a89e9da7f015dd42 Mon Sep 17 00:00:00 2001 From: Jorolf Date: Sat, 3 Jun 2017 19:21:21 +0200 Subject: [PATCH 01/44] add caps lock warning --- .../UserInterface/OsuPasswordTextBox.cs | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs index 904aa14aa7..8ad3febf19 100644 --- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs +++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs @@ -1,11 +1,14 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Sprites; using OpenTK; using OpenTK.Graphics; +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Cursor; +using osu.Framework.Graphics.Sprites; +using System; namespace osu.Game.Graphics.UserInterface { @@ -15,6 +18,14 @@ namespace osu.Game.Graphics.UserInterface public override bool AllowClipboardExport => false; + public OsuPasswordTextBox() + { + Add(new CapsWarning + { + TextSize = 20, + }); + } + public class PasswordMaskChar : Container { private readonly CircularContainer circle; @@ -51,5 +62,36 @@ namespace osu.Game.Graphics.UserInterface circle.ResizeTo(new Vector2(0.8f), 500, EasingTypes.OutQuint); } } + + private class CapsWarning : TextAwesome, IHasTooltip + { + public string TooltipText => Console.CapsLock ? @"Caps lock is active" : string.Empty; + + public override bool HandleInput => true; + + public CapsWarning() + { + Icon = FontAwesome.fa_warning; + Origin = Anchor.CentreRight; + Anchor = Anchor.CentreRight; + Margin = new MarginPadding { Right = 10 }; + AlwaysPresent = true; + Alpha = 0; + } + + [BackgroundDependencyLoader] + private void load(OsuColour colour) + { + Colour = colour.YellowLight; + } + + protected override void Update() + { + base.Update(); + updateVisibility(); + } + + private void updateVisibility() => FadeTo(Console.CapsLock ? 1 : 0, 250, EasingTypes.OutQuint); + } } } From c29d3437ba7e4f14f7e218a4effb5232be419c41 Mon Sep 17 00:00:00 2001 From: Jorolf Date: Tue, 22 Aug 2017 13:35:30 +0200 Subject: [PATCH 02/44] fix merge changes --- osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs index 70879006e9..3b0a1bda99 100644 --- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs +++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs @@ -22,7 +22,7 @@ namespace osu.Game.Graphics.UserInterface { Add(new CapsWarning { - TextSize = 20, + Size = new Vector2(20), }); } @@ -63,7 +63,7 @@ namespace osu.Game.Graphics.UserInterface } } - private class CapsWarning : TextAwesome, IHasTooltip + private class CapsWarning : SpriteIcon, IHasTooltip { public string TooltipText => Console.CapsLock ? @"Caps lock is active" : string.Empty; @@ -91,7 +91,7 @@ namespace osu.Game.Graphics.UserInterface updateVisibility(); } - private void updateVisibility() => FadeTo(Console.CapsLock ? 1 : 0, 250, EasingTypes.OutQuint); + private void updateVisibility() => this.FadeTo(Console.CapsLock ? 1 : 0, 250, Easing.OutQuint); } } } From d81956e9741b7dbfdfae35d514e1a1eba002fe5e Mon Sep 17 00:00:00 2001 From: Jorolf Date: Tue, 22 Aug 2017 15:43:45 +0200 Subject: [PATCH 03/44] use GameHost to check if caps lock is enabled --- osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs index 3b0a1bda99..2b175b9eed 100644 --- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs +++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs @@ -9,6 +9,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Cursor; using System; using osu.Framework.Graphics.Shapes; +using osu.Framework.Platform; namespace osu.Game.Graphics.UserInterface { @@ -65,10 +66,12 @@ namespace osu.Game.Graphics.UserInterface private class CapsWarning : SpriteIcon, IHasTooltip { - public string TooltipText => Console.CapsLock ? @"Caps lock is active" : string.Empty; + public string TooltipText => host.CapsLockEnabled ? @"Caps lock is active" : string.Empty; public override bool HandleInput => true; + private GameHost host; + public CapsWarning() { Icon = FontAwesome.fa_warning; @@ -80,9 +83,10 @@ namespace osu.Game.Graphics.UserInterface } [BackgroundDependencyLoader] - private void load(OsuColour colour) + private void load(OsuColour colour, GameHost host) { Colour = colour.YellowLight; + this.host = host; } protected override void Update() @@ -91,7 +95,7 @@ namespace osu.Game.Graphics.UserInterface updateVisibility(); } - private void updateVisibility() => this.FadeTo(Console.CapsLock ? 1 : 0, 250, Easing.OutQuint); + private void updateVisibility() => this.FadeTo(host.CapsLockEnabled ? 1 : 0, 250, Easing.OutQuint); } } } From f8cc4238ffa88e96e42a8744986e1adfe65b3288 Mon Sep 17 00:00:00 2001 From: Jorolf Date: Thu, 24 Aug 2017 22:13:20 +0200 Subject: [PATCH 04/44] cleanup code --- .../UserInterface/OsuPasswordTextBox.cs | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs index 2b175b9eed..2fdbf64d08 100644 --- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs +++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs @@ -7,8 +7,8 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Cursor; -using System; using osu.Framework.Graphics.Shapes; +using osu.Framework.Input; using osu.Framework.Platform; namespace osu.Game.Graphics.UserInterface @@ -19,14 +19,35 @@ namespace osu.Game.Graphics.UserInterface public override bool AllowClipboardExport => false; + private readonly CapsWarning warning; + + private GameHost host; + public OsuPasswordTextBox() { - Add(new CapsWarning + Add(warning = new CapsWarning { Size = new Vector2(20), + Origin = Anchor.CentreRight, + Anchor = Anchor.CentreRight, + Margin = new MarginPadding { Right = 10 }, + Alpha = 0, }); } + [BackgroundDependencyLoader] + private void load(GameHost host) + { + this.host = host; + } + + protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) + { + if (args.Key == OpenTK.Input.Key.CapsLock) + warning.FadeTo(host.CapsLockEnabled ? 1 : 0, 250, Easing.OutQuint); + return base.OnKeyDown(state, args); + } + public class PasswordMaskChar : Container { private readonly CircularContainer circle; @@ -66,36 +87,18 @@ namespace osu.Game.Graphics.UserInterface private class CapsWarning : SpriteIcon, IHasTooltip { - public string TooltipText => host.CapsLockEnabled ? @"Caps lock is active" : string.Empty; - - public override bool HandleInput => true; - - private GameHost host; + public string TooltipText => @"Caps lock is active"; public CapsWarning() { Icon = FontAwesome.fa_warning; - Origin = Anchor.CentreRight; - Anchor = Anchor.CentreRight; - Margin = new MarginPadding { Right = 10 }; - AlwaysPresent = true; - Alpha = 0; } [BackgroundDependencyLoader] - private void load(OsuColour colour, GameHost host) + private void load(OsuColour colour) { Colour = colour.YellowLight; - this.host = host; } - - protected override void Update() - { - base.Update(); - updateVisibility(); - } - - private void updateVisibility() => this.FadeTo(host.CapsLockEnabled ? 1 : 0, 250, Easing.OutQuint); } } } From 06c392d6f2690a4f34d895b775c61f2326dde344 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Fri, 25 Aug 2017 15:09:07 +0900 Subject: [PATCH 05/44] Update OsuMenu in line with framework. --- osu-framework | 2 +- osu.Game/Graphics/UserInterface/OsuMenu.cs | 23 ++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/osu-framework b/osu-framework index da5fbf8c58..5a189d1050 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit da5fbf8c580b079671298f6da54be10a00bf434c +Subproject commit 5a189d1050579b217bfe6b6c17c3ee6d6ef9c839 diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs index e597bc44b5..79519e26a0 100644 --- a/osu.Game/Graphics/UserInterface/OsuMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs @@ -5,28 +5,39 @@ using OpenTK; using OpenTK.Graphics; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.UserInterface; namespace osu.Game.Graphics.UserInterface { - public class OsuMenu : Menu + public class OsuMenu : Menu + where TItem : MenuItem { public OsuMenu() { CornerRadius = 4; - Background.Colour = Color4.Black.Opacity(0.5f); - - ItemsContainer.Padding = new MarginPadding(5); + BackgroundColour = Color4.Black.Opacity(0.5f); } protected override void AnimateOpen() => this.FadeIn(300, Easing.OutQuint); - protected override void AnimateClose() => this.FadeOut(300, Easing.OutQuint); - protected override void UpdateContentHeight() + protected override void UpdateMenuHeight() { var actualHeight = (RelativeSizeAxes & Axes.Y) > 0 ? 1 : ContentHeight; this.ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, Easing.OutQuint); } + + protected override FlowContainer CreateItemsFlow() + { + var flow = base.CreateItemsFlow(); + flow.Padding = new MarginPadding(5); + + return flow; + } + } + + public class OsuMenu : OsuMenu + { } } From 7467d24d35849fa9dbfe9b69530f5ca7a91d6447 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Fri, 25 Aug 2017 15:10:12 +0900 Subject: [PATCH 06/44] Update OsuContextMenu in line with framework. --- .../Graphics/UserInterface/OsuContextMenu.cs | 149 +++++++++++++++--- .../UserInterface/OsuContextMenuItem.cs | 107 ++----------- 2 files changed, 133 insertions(+), 123 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs index d4882cce1e..ddb91d42a1 100644 --- a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs @@ -1,52 +1,151 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using OpenTK; using OpenTK.Graphics; using osu.Framework.Allocation; +using osu.Framework.Audio; +using osu.Framework.Audio.Sample; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.UserInterface; +using osu.Framework.Input; +using osu.Game.Graphics.Sprites; namespace osu.Game.Graphics.UserInterface { - public class OsuContextMenu : ContextMenu - where TItem : ContextMenuItem + public class OsuContextMenu : OsuMenu + where TItem : OsuContextMenuItem { - protected override Menu CreateMenu() => new CustomMenu(); + private const int fade_duration = 250; - public class CustomMenu : Menu + public OsuContextMenu() { - private const int fade_duration = 250; - - public CustomMenu() + CornerRadius = 5; + EdgeEffect = new EdgeEffectParameters + { + Type = EdgeEffectType.Shadow, + Colour = Color4.Black.Opacity(0.1f), + Radius = 4, + }; + } + + [BackgroundDependencyLoader] + private void load(OsuColour colours) + { + BackgroundColour = colours.ContextMenuGray; + } + + protected override void AnimateOpen() => this.FadeIn(fade_duration, Easing.OutQuint); + protected override void AnimateClose() => this.FadeOut(fade_duration, Easing.OutQuint); + + protected override FlowContainer CreateItemsFlow() + { + var flow = base.CreateItemsFlow(); + flow.Padding = new MarginPadding { Vertical = OsuContextMenuItemRepresentation.MARGIN_VERTICAL }; + + return flow; + } + + protected override MenuItemRepresentation CreateMenuItemRepresentation(TItem model) => new OsuContextMenuItemRepresentation(this, model); + + #region OsuContextMenuItemRepresentation + private class OsuContextMenuItemRepresentation : MenuItemRepresentation + { + private const int margin_horizontal = 17; + private const int text_size = 17; + private const int transition_length = 80; + public const int MARGIN_VERTICAL = 4; + + private SampleChannel sampleClick; + private SampleChannel sampleHover; + + private OsuSpriteText text; + private OsuSpriteText textBold; + + public OsuContextMenuItemRepresentation(Menu menu, TItem model) + : base(menu, model) { - CornerRadius = 5; - ItemsContainer.Padding = new MarginPadding { Vertical = OsuContextMenuItem.MARGIN_VERTICAL }; - Masking = true; - EdgeEffect = new EdgeEffectParameters - { - Type = EdgeEffectType.Shadow, - Colour = Color4.Black.Opacity(0.1f), - Radius = 4, - }; } [BackgroundDependencyLoader] - private void load(OsuColour colours) + private void load(AudioManager audio) { - Background.Colour = colours.ContextMenuGray; + sampleHover = audio.Sample.Get(@"UI/generic-hover"); + sampleClick = audio.Sample.Get(@"UI/generic-click"); + + BackgroundColour = Color4.Transparent; + BackgroundColourHover = OsuColour.FromHex(@"172023"); + + updateTextColour(); } - protected override void AnimateOpen() => this.FadeIn(fade_duration, Easing.OutQuint); - protected override void AnimateClose() => this.FadeOut(fade_duration, Easing.OutQuint); - - protected override void UpdateContentHeight() + private void updateTextColour() { - var actualHeight = (RelativeSizeAxes & Axes.Y) > 0 ? 1 : ContentHeight; - this.ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, Easing.OutQuint); + switch (Model.Type) + { + case MenuItemType.Standard: + textBold.Colour = text.Colour = Color4.White; + break; + case MenuItemType.Destructive: + textBold.Colour = text.Colour = Color4.Red; + break; + case MenuItemType.Highlighted: + textBold.Colour = text.Colour = OsuColour.FromHex(@"ffcc22"); + break; + } } + + protected override bool OnHover(InputState state) + { + sampleHover.Play(); + textBold.FadeIn(transition_length, Easing.OutQuint); + text.FadeOut(transition_length, Easing.OutQuint); + return base.OnHover(state); + } + + protected override void OnHoverLost(InputState state) + { + textBold.FadeOut(transition_length, Easing.OutQuint); + text.FadeIn(transition_length, Easing.OutQuint); + base.OnHoverLost(state); + } + + protected override bool OnClick(InputState state) + { + sampleClick.Play(); + return base.OnClick(state); + } + + protected override Drawable CreateText(string title) => new Container + { + AutoSizeAxes = Axes.Both, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + Children = new Drawable[] + { + text = new OsuSpriteText + { + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + TextSize = text_size, + Text = title, + Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, + }, + textBold = new OsuSpriteText + { + AlwaysPresent = true, + Alpha = 0, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + TextSize = text_size, + Text = title, + Font = @"Exo2.0-Bold", + Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, + } + } + }; } + #endregion } } \ No newline at end of file diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs b/osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs index 196e905bdc..bf00208b88 100644 --- a/osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs +++ b/osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs @@ -1,114 +1,25 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using OpenTK.Graphics; -using osu.Framework.Allocation; -using osu.Framework.Audio; -using osu.Framework.Audio.Sample; -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; +using System; using osu.Framework.Graphics.UserInterface; -using osu.Framework.Input; -using osu.Game.Graphics.Sprites; namespace osu.Game.Graphics.UserInterface { - public class OsuContextMenuItem : ContextMenuItem + public class OsuContextMenuItem : MenuItem { - private const int transition_length = 80; - private const int margin_horizontal = 17; - public const int MARGIN_VERTICAL = 4; - private const int text_size = 17; + public readonly MenuItemType Type; - private OsuSpriteText text; - private OsuSpriteText textBold; - - private SampleChannel sampleClick; - private SampleChannel sampleHover; - - private readonly MenuItemType type; - - protected override Container CreateTextContainer(string title) => new Container + public OsuContextMenuItem(string text, MenuItemType type = MenuItemType.Standard) + : base(text) { - AutoSizeAxes = Axes.Both, - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - Children = new Drawable[] - { - text = new OsuSpriteText - { - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - TextSize = text_size, - Text = title, - Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, - }, - textBold = new OsuSpriteText - { - AlwaysPresent = true, - Alpha = 0, - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - TextSize = text_size, - Text = title, - Font = @"Exo2.0-Bold", - Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, - } - } - }; - - public OsuContextMenuItem(string title, MenuItemType type = MenuItemType.Standard) : base(title) - { - this.type = type; + Type = type; } - [BackgroundDependencyLoader] - private void load(AudioManager audio) + public OsuContextMenuItem(string text, MenuItemType type, Action action) + : base(text, action) { - sampleHover = audio.Sample.Get(@"UI/generic-hover"); - sampleClick = audio.Sample.Get(@"UI/generic-click"); - - BackgroundColour = Color4.Transparent; - BackgroundColourHover = OsuColour.FromHex(@"172023"); - - updateTextColour(); - } - - private void updateTextColour() - { - switch (type) - { - case MenuItemType.Standard: - textBold.Colour = text.Colour = Color4.White; - break; - case MenuItemType.Destructive: - textBold.Colour = text.Colour = Color4.Red; - break; - case MenuItemType.Highlighted: - textBold.Colour = text.Colour = OsuColour.FromHex(@"ffcc22"); - break; - } - } - - protected override bool OnHover(InputState state) - { - sampleHover.Play(); - textBold.FadeIn(transition_length, Easing.OutQuint); - text.FadeOut(transition_length, Easing.OutQuint); - return base.OnHover(state); - } - - protected override void OnHoverLost(InputState state) - { - textBold.FadeOut(transition_length, Easing.OutQuint); - text.FadeIn(transition_length, Easing.OutQuint); - base.OnHoverLost(state); - } - - protected override bool OnClick(InputState state) - { - sampleClick.Play(); - return base.OnClick(state); + Type = type; } } } \ No newline at end of file From 4fb95706184c4b5310daf96b3c6c76bfeb28dfbc Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Fri, 25 Aug 2017 15:10:29 +0900 Subject: [PATCH 07/44] Create IHasOsuContextMenu and update OsuContextMenuContainer in line with framework. --- .../Visual/TestCaseContextMenu.cs | 19 +++++++++---------- .../Graphics/Cursor/IHasOsuContextMenu.cs | 9 +++++++++ .../Cursor/OsuContextMenuContainer.cs | 4 ++-- osu.Game/osu.Game.csproj | 1 + 4 files changed, 21 insertions(+), 12 deletions(-) create mode 100644 osu.Game/Graphics/Cursor/IHasOsuContextMenu.cs diff --git a/osu.Desktop.Tests/Visual/TestCaseContextMenu.cs b/osu.Desktop.Tests/Visual/TestCaseContextMenu.cs index f0894f794a..2ac3a28bd4 100644 --- a/osu.Desktop.Tests/Visual/TestCaseContextMenu.cs +++ b/osu.Desktop.Tests/Visual/TestCaseContextMenu.cs @@ -3,9 +3,8 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Shapes; -using osu.Framework.Graphics.UserInterface; +using osu.Game.Graphics.Cursor; using osu.Game.Graphics.UserInterface; using OpenTK; using OpenTK.Graphics; @@ -67,9 +66,9 @@ namespace osu.Desktop.Tests.Visual ); } - private class MyContextMenuContainer : Container, IHasContextMenu + private class MyContextMenuContainer : Container, IHasOsuContextMenu { - public ContextMenuItem[] ContextMenuItems => new ContextMenuItem[] + public OsuContextMenuItem[] ContextMenuItems => new[] { new OsuContextMenuItem(@"Some option"), new OsuContextMenuItem(@"Highlighted option", MenuItemType.Highlighted), @@ -81,16 +80,16 @@ namespace osu.Desktop.Tests.Visual }; } - private class AnotherContextMenuContainer : Container, IHasContextMenu + private class AnotherContextMenuContainer : Container, IHasOsuContextMenu { - public ContextMenuItem[] ContextMenuItems => new ContextMenuItem[] + public OsuContextMenuItem[] ContextMenuItems => new[] { new OsuContextMenuItem(@"Simple option"), new OsuContextMenuItem(@"Simple very very long option"), - new OsuContextMenuItem(@"Change width", MenuItemType.Highlighted) { Action = () => this.ResizeWidthTo(Width * 2, 100, Easing.OutQuint) }, - new OsuContextMenuItem(@"Change height", MenuItemType.Highlighted) { Action = () => this.ResizeHeightTo(Height * 2, 100, Easing.OutQuint) }, - new OsuContextMenuItem(@"Change width back", MenuItemType.Destructive) { Action = () => this.ResizeWidthTo(Width / 2, 100, Easing.OutQuint) }, - new OsuContextMenuItem(@"Change height back", MenuItemType.Destructive) { Action = () => this.ResizeHeightTo(Height / 2, 100, Easing.OutQuint) }, + new OsuContextMenuItem(@"Change width", MenuItemType.Highlighted, () => this.ResizeWidthTo(Width * 2, 100, Easing.OutQuint)), + new OsuContextMenuItem(@"Change height", MenuItemType.Highlighted, () => this.ResizeHeightTo(Height * 2, 100, Easing.OutQuint)), + new OsuContextMenuItem(@"Change width back", MenuItemType.Destructive, () => this.ResizeWidthTo(Width / 2, 100, Easing.OutQuint)), + new OsuContextMenuItem(@"Change height back", MenuItemType.Destructive, () => this.ResizeHeightTo(Height / 2, 100, Easing.OutQuint)), }; } } diff --git a/osu.Game/Graphics/Cursor/IHasOsuContextMenu.cs b/osu.Game/Graphics/Cursor/IHasOsuContextMenu.cs new file mode 100644 index 0000000000..6fb1a3d31f --- /dev/null +++ b/osu.Game/Graphics/Cursor/IHasOsuContextMenu.cs @@ -0,0 +1,9 @@ +using osu.Framework.Graphics.Cursor; +using osu.Game.Graphics.UserInterface; + +namespace osu.Game.Graphics.Cursor +{ + public interface IHasOsuContextMenu : IHasContextMenu + { + } +} diff --git a/osu.Game/Graphics/Cursor/OsuContextMenuContainer.cs b/osu.Game/Graphics/Cursor/OsuContextMenuContainer.cs index 9162fd6893..4ee3e31707 100644 --- a/osu.Game/Graphics/Cursor/OsuContextMenuContainer.cs +++ b/osu.Game/Graphics/Cursor/OsuContextMenuContainer.cs @@ -7,8 +7,8 @@ using osu.Game.Graphics.UserInterface; namespace osu.Game.Graphics.Cursor { - public class OsuContextMenuContainer : ContextMenuContainer + public class OsuContextMenuContainer : ContextMenuContainer { - protected override ContextMenu CreateContextMenu() => new OsuContextMenu(); + protected override Menu CreateMenu() => new OsuContextMenu(); } } \ No newline at end of file diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 97cf1db803..0c710fd242 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -84,6 +84,7 @@ + From b42c9d21fe6922c5733366d43aec415f9a0206ff Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Fri, 25 Aug 2017 15:57:43 +0900 Subject: [PATCH 08/44] Update LoginSettings in line with framework. --- osu-framework | 2 +- .../Sections/General/LoginSettings.cs | 90 ++++++++++++------- 2 files changed, 57 insertions(+), 35 deletions(-) diff --git a/osu-framework b/osu-framework index 5a189d1050..2f0674792a 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 5a189d1050579b217bfe6b6c17c3ee6d6ef9c839 +Subproject commit 2f0674792adaf123dcf44ea0099c5707df4a6d60 diff --git a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs index 7ae45159d9..111dba7151 100644 --- a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs @@ -257,9 +257,15 @@ namespace osu.Game.Overlays.Settings.Sections.General private class UserDropdown : OsuEnumDropdown { - protected override DropdownHeader CreateHeader() => new UserDropdownHeader { AccentColour = AccentColour }; - protected override Menu CreateMenu() => new UserDropdownMenu(); - protected override DropdownMenuItem CreateMenuItem(string text, UserAction value) => new UserDropdownMenuItem(text, value) { AccentColour = AccentColour }; + protected override DropdownHeader CreateHeader() + { + var newHeader = new UserDropdownHeader(); + newHeader.AccentColour.BindTo(AccentColour); + + return newHeader; + } + + protected override DropdownMenu CreateMenu() => new UserDropdownMenu(); public Color4 StatusColour { @@ -274,7 +280,52 @@ namespace osu.Game.Overlays.Settings.Sections.General [BackgroundDependencyLoader] private void load(OsuColour colours) { - AccentColour = colours.Gray5; + AccentColour.Value = colours.Gray5; + } + + private class UserDropdownMenu : OsuDropdownMenu + { + public UserDropdownMenu() + { + Masking = true; + CornerRadius = 5; + + Margin = new MarginPadding { Bottom = 5 }; + + EdgeEffect = new EdgeEffectParameters + { + Type = EdgeEffectType.Shadow, + Colour = Color4.Black.Opacity(0.25f), + Radius = 4, + }; + } + + [BackgroundDependencyLoader] + private void load(OsuColour colours) + { + BackgroundColour = colours.Gray3; + } + + protected override FlowContainer CreateItemsFlow() + { + var flow = base.CreateItemsFlow(); + flow.Padding = new MarginPadding(0); + + return flow; + } + + protected override MenuItemRepresentation CreateMenuItemRepresentation(DropdownMenuItem model) => new UserDropdownMenuItem(this, model); + + private class UserDropdownMenuItem : OsuDropdownMenuItemRepresentation + { + public UserDropdownMenuItem(Menu> menu, DropdownMenuItem model) + : base(menu, model) + { + Foreground.Padding = new MarginPadding { Top = 5, Bottom = 5, Left = 10, Right = 5 }; + Label.Margin = new MarginPadding { Left = UserDropdownHeader.LABEL_LEFT_MARGIN - 11 }; + CornerRadius = 5; + } + } } private class UserDropdownHeader : OsuDropdownHeader @@ -324,38 +375,9 @@ namespace osu.Game.Overlays.Settings.Sections.General } } - private class UserDropdownMenu : OsuMenu - { - public UserDropdownMenu() - { - Margin = new MarginPadding { Bottom = 5 }; - CornerRadius = 5; - ItemsContainer.Padding = new MarginPadding(0); - Masking = true; - EdgeEffect = new EdgeEffectParameters - { - Type = EdgeEffectType.Shadow, - Colour = Color4.Black.Opacity(0.25f), - Radius = 4, - }; - } - [BackgroundDependencyLoader] - private void load(OsuColour colours) - { - Background.Colour = colours.Gray3; - } - } - private class UserDropdownMenuItem : OsuDropdownMenuItem - { - public UserDropdownMenuItem(string text, UserAction current) : base(text, current) - { - Foreground.Padding = new MarginPadding { Top = 5, Bottom = 5, Left = 10, Right = 5 }; - Label.Margin = new MarginPadding { Left = UserDropdownHeader.LABEL_LEFT_MARGIN - 11 }; - CornerRadius = 5; - } - } + } private enum UserAction From 923ffae42c3cbd6403380756474f78cccc2c4e34 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Fri, 25 Aug 2017 15:57:55 +0900 Subject: [PATCH 09/44] Update SlimEnumDropdown in line with framework --- .../Overlays/SearchableList/SlimEnumDropdown.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/osu.Game/Overlays/SearchableList/SlimEnumDropdown.cs b/osu.Game/Overlays/SearchableList/SlimEnumDropdown.cs index 38e3e44911..e68cddb293 100644 --- a/osu.Game/Overlays/SearchableList/SlimEnumDropdown.cs +++ b/osu.Game/Overlays/SearchableList/SlimEnumDropdown.cs @@ -12,8 +12,15 @@ namespace osu.Game.Overlays.SearchableList { public class SlimEnumDropdown : OsuEnumDropdown { - protected override DropdownHeader CreateHeader() => new SlimDropdownHeader { AccentColour = AccentColour }; - protected override Menu CreateMenu() => new SlimMenu(); + protected override DropdownHeader CreateHeader() + { + var newHeader = new SlimDropdownHeader(); + newHeader.AccentColour.BindTo(AccentColour); + + return newHeader; + } + + protected override DropdownMenu CreateMenu() => new SlimMenu(); private class SlimDropdownHeader : OsuDropdownHeader { @@ -31,11 +38,11 @@ namespace osu.Game.Overlays.SearchableList } } - private class SlimMenu : OsuMenu + private class SlimMenu : OsuDropdownMenu { public SlimMenu() { - Background.Colour = Color4.Black.Opacity(0.7f); + BackgroundColour = Color4.Black.Opacity(0.7f); } } } From e83a554ffc311f03d73a53551b752395957d47a5 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Fri, 25 Aug 2017 15:58:09 +0900 Subject: [PATCH 10/44] Update CollectionsDropdown in line with framework --- .../Overlays/Music/CollectionsDropdown.cs | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/osu.Game/Overlays/Music/CollectionsDropdown.cs b/osu.Game/Overlays/Music/CollectionsDropdown.cs index 0c0a636be8..be72d4481a 100644 --- a/osu.Game/Overlays/Music/CollectionsDropdown.cs +++ b/osu.Game/Overlays/Music/CollectionsDropdown.cs @@ -15,13 +15,41 @@ namespace osu.Game.Overlays.Music { public class CollectionsDropdown : OsuDropdown { - protected override DropdownHeader CreateHeader() => new CollectionsHeader { AccentColour = AccentColour }; - protected override Menu CreateMenu() => new CollectionsMenu(); - [BackgroundDependencyLoader] private void load(OsuColour colours) { - AccentColour = colours.Gray6; + AccentColour.Value = colours.Gray6; + } + + protected override DropdownHeader CreateHeader() + { + var newHeader = new CollectionsHeader(); + newHeader.AccentColour.BindTo(AccentColour); + + return newHeader; + } + + protected override DropdownMenu CreateMenu() => new CollectionsMenu(); + + private class CollectionsMenu : OsuDropdownMenu + { + public CollectionsMenu() + { + CornerRadius = 5; + EdgeEffect = new EdgeEffectParameters + { + Type = EdgeEffectType.Shadow, + Colour = Color4.Black.Opacity(0.3f), + Radius = 3, + Offset = new Vector2(0f, 1f), + }; + } + + [BackgroundDependencyLoader] + private void load(OsuColour colours) + { + BackgroundColour = colours.Gray4; + } } private class CollectionsHeader : OsuDropdownHeader @@ -48,26 +76,5 @@ namespace osu.Game.Overlays.Music }; } } - - private class CollectionsMenu : OsuMenu - { - [BackgroundDependencyLoader] - private void load(OsuColour colours) - { - Background.Colour = colours.Gray4; - } - - public CollectionsMenu() - { - CornerRadius = 5; - EdgeEffect = new EdgeEffectParameters - { - Type = EdgeEffectType.Shadow, - Colour = Color4.Black.Opacity(0.3f), - Radius = 3, - Offset = new Vector2(0f, 1f), - }; - } - } } } From a3a5a89636d4cf93b3c8872d62d9cb9d2aa674ca Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Fri, 25 Aug 2017 15:58:21 +0900 Subject: [PATCH 11/44] Update OsuDropdown in line with framework --- .../Graphics/UserInterface/OsuDropdown.cs | 165 ++++++++++-------- 1 file changed, 89 insertions(+), 76 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuDropdown.cs b/osu.Game/Graphics/UserInterface/OsuDropdown.cs index f5a4219707..d556c58bdd 100644 --- a/osu.Game/Graphics/UserInterface/OsuDropdown.cs +++ b/osu.Game/Graphics/UserInterface/OsuDropdown.cs @@ -1,9 +1,9 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using System.Linq; using OpenTK.Graphics; using osu.Framework.Allocation; +using osu.Framework.Configuration; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -16,52 +16,96 @@ namespace osu.Game.Graphics.UserInterface { public class OsuDropdown : Dropdown { - protected override DropdownHeader CreateHeader() => new OsuDropdownHeader { AccentColour = AccentColour }; - - protected override Menu CreateMenu() => new OsuMenu(); - - private Color4? accentColour; - public virtual Color4 AccentColour - { - get { return accentColour.GetValueOrDefault(); } - set - { - accentColour = value; - if (Header != null) - ((OsuDropdownHeader)Header).AccentColour = value; - foreach (var item in MenuItems.OfType()) - item.AccentColour = value; - } - } + public readonly Bindable AccentColour = new Bindable(); [BackgroundDependencyLoader] private void load(OsuColour colours) { - if (accentColour == null) - AccentColour = colours.PinkDarker; + if (AccentColour.Value == null) + AccentColour.Value = colours.PinkDarker; } - protected override DropdownMenuItem CreateMenuItem(string text, T value) => new OsuDropdownMenuItem(text, value) { AccentColour = AccentColour }; - - public class OsuDropdownMenuItem : DropdownMenuItem + protected override DropdownHeader CreateHeader() { - public OsuDropdownMenuItem(string text, T current) : base(text, current) + var newHeader = new OsuDropdownHeader(); + newHeader.AccentColour.BindTo(AccentColour); + + return newHeader; + } + + protected override DropdownMenu CreateMenu() + { + var newMenu = new OsuDropdownMenu(); + newMenu.AccentColour.BindTo(AccentColour); + + return newMenu; + } + + #region OsuDropdownMenu + protected class OsuDropdownMenu : DropdownMenu + { + public readonly Bindable AccentColour = new Bindable(); + + protected override MenuItemRepresentation CreateMenuItemRepresentation(DropdownMenuItem model) { - Foreground.Padding = new MarginPadding(2); + var newItem = new OsuDropdownMenuItemRepresentation(this, model); + newItem.AccentColour.BindTo(AccentColour); - Masking = true; - CornerRadius = 6; + return newItem; + } - Children = new[] + #region OsuDropdownMenuItemRepresentation + protected class OsuDropdownMenuItemRepresentation : DropdownMenuItemRepresentation + { + public readonly Bindable AccentColour = new Bindable(); + + private SpriteIcon chevron; + protected OsuSpriteText Label; + + private Color4 nonAccentHoverColour; + private Color4 nonAccentSelectedColour; + + public OsuDropdownMenuItemRepresentation(Menu> menu, DropdownMenuItem model) + : base(menu, model) { - new FillFlowContainer + Foreground.Padding = new MarginPadding(2); + + Masking = true; + CornerRadius = 6; + + AccentColour.ValueChanged += updateAccent; + } + + [BackgroundDependencyLoader] + private void load(OsuColour colours) + { + BackgroundColour = Color4.Transparent; + nonAccentHoverColour = colours.PinkDarker; + nonAccentSelectedColour = Color4.Black.Opacity(0.5f); + } + + private void updateAccent(Color4? newValue) + { + BackgroundColourHover = newValue ?? nonAccentHoverColour; + BackgroundColourSelected = newValue ?? nonAccentSelectedColour; + AnimateBackground(IsHovered); + AnimateForeground(IsHovered); + } + + protected override void AnimateForeground(bool hover) + { + base.AnimateForeground(hover); + chevron.Alpha = hover ? 1 : 0; + } + + protected override Drawable CreateText(string title) => new FillFlowContainer { Direction = FillDirection.Horizontal, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Children = new Drawable[] { - Chevron = new SpriteIcon + chevron = new SpriteIcon { AlwaysPresent = true, Icon = FontAwesome.fa_chevron_right, @@ -72,47 +116,18 @@ namespace osu.Game.Graphics.UserInterface Origin = Anchor.CentreLeft, Anchor = Anchor.CentreLeft, }, - Label = new OsuSpriteText { - Text = text, + Label = new OsuSpriteText + { + Text = title, Origin = Anchor.CentreLeft, Anchor = Anchor.CentreLeft, } } - } - }; - } - - private Color4? accentColour; - - protected readonly SpriteIcon Chevron; - protected readonly OsuSpriteText Label; - - protected override void FormatForeground(bool hover = false) - { - base.FormatForeground(hover); - Chevron.Alpha = hover ? 1 : 0; - } - - public Color4 AccentColour - { - get { return accentColour.GetValueOrDefault(); } - set - { - accentColour = value; - BackgroundColourHover = BackgroundColourSelected = value; - FormatBackground(); - FormatForeground(); - } - } - - [BackgroundDependencyLoader] - private void load(OsuColour colours) - { - BackgroundColour = Color4.Transparent; - BackgroundColourHover = accentColour ?? colours.PinkDarker; - BackgroundColourSelected = Color4.Black.Opacity(0.5f); + }; } + #endregion } + #endregion public class OsuDropdownHeader : DropdownHeader { @@ -125,16 +140,7 @@ namespace osu.Game.Graphics.UserInterface protected readonly SpriteIcon Icon; - private Color4? accentColour; - public virtual Color4 AccentColour - { - get { return accentColour.GetValueOrDefault(); } - set - { - accentColour = value; - BackgroundColourHover = value; - } - } + public readonly Bindable AccentColour = new Bindable(); public OsuDropdownHeader() { @@ -161,13 +167,20 @@ namespace osu.Game.Graphics.UserInterface Size = new Vector2(20), } }; + + AccentColour.ValueChanged += accentColourChanged; } [BackgroundDependencyLoader] private void load(OsuColour colours) { BackgroundColour = Color4.Black.Opacity(0.5f); - BackgroundColourHover = accentColour ?? colours.PinkDarker; + BackgroundColourHover = AccentColour?.Value ?? colours.PinkDarker; + } + + private void accentColourChanged(Color4? newValue) + { + BackgroundColourHover = newValue ?? Color4.White; } } } From ce644138b9f117de9094ffab9cada87a1ebd3df0 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Fri, 25 Aug 2017 15:58:30 +0900 Subject: [PATCH 12/44] Update OsuTabControl in line with framework --- .../Graphics/UserInterface/OsuTabControl.cs | 101 ++++++++++-------- 1 file changed, 59 insertions(+), 42 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs index 5ad412965c..bc673a7af6 100644 --- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs +++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs @@ -50,7 +50,7 @@ namespace osu.Game.Graphics.UserInterface accentColour = value; var dropDown = Dropdown as OsuTabDropdown; if (dropDown != null) - dropDown.AccentColour = value; + dropDown.AccentColour.Value = value; foreach (var item in TabContainer.Children.OfType()) item.AccentColour = value; } @@ -142,55 +142,53 @@ namespace osu.Game.Graphics.UserInterface private class OsuTabDropdown : OsuDropdown { - protected override DropdownHeader CreateHeader() => new OsuTabDropdownHeader - { - AccentColour = AccentColour, - Anchor = Anchor.TopRight, - Origin = Anchor.TopRight, - }; - - protected override DropdownMenuItem CreateMenuItem(string text, T value) - { - var item = base.CreateMenuItem(text, value); - item.ForegroundColourHover = Color4.Black; - return item; - } - public OsuTabDropdown() { - DropdownMenu.Anchor = Anchor.TopRight; - DropdownMenu.Origin = Anchor.TopRight; - RelativeSizeAxes = Axes.X; - DropdownMenu.Background.Colour = Color4.Black.Opacity(0.7f); - DropdownMenu.MaxHeight = 400; + + } + + protected override DropdownMenu CreateMenu() => new OsuTabDropdownMenu(); + + protected override DropdownHeader CreateHeader() + { + var newHeader = new OsuTabDropdownHeader + { + Anchor = Anchor.TopRight, + Origin = Anchor.TopRight + }; + + newHeader.AccentColour.BindTo(AccentColour); + + return newHeader; + } + + private class OsuTabDropdownMenu : OsuDropdownMenu + { + public OsuTabDropdownMenu() + { + Anchor = Anchor.TopRight; + Origin = Anchor.TopRight; + + BackgroundColour = Color4.Black.Opacity(0.7f); + MaxHeight = 400; + } + + protected override MenuItemRepresentation CreateMenuItemRepresentation(DropdownMenuItem model) => new OsuTabDropdownMenuItemRepresentation(this, model); + + private class OsuTabDropdownMenuItemRepresentation : OsuDropdownMenuItemRepresentation + { + public OsuTabDropdownMenuItemRepresentation(Menu> menu, DropdownMenuItem model) + : base(menu, model) + { + ForegroundColourHover = Color4.Black; + } + } } protected class OsuTabDropdownHeader : OsuDropdownHeader { - public override Color4 AccentColour - { - get { return base.AccentColour; } - set - { - base.AccentColour = value; - Foreground.Colour = value; - } - } - - protected override bool OnHover(InputState state) - { - Foreground.Colour = BackgroundColour; - return base.OnHover(state); - } - - protected override void OnHoverLost(InputState state) - { - Foreground.Colour = BackgroundColourHover; - base.OnHoverLost(state); - } - public OsuTabDropdownHeader() { RelativeSizeAxes = Axes.None; @@ -219,6 +217,25 @@ namespace osu.Game.Graphics.UserInterface }; Padding = new MarginPadding { Left = 5, Right = 5 }; + + AccentColour.ValueChanged += accentColourChanged; + } + + private void accentColourChanged(Color4? newValue) + { + Foreground.Colour = newValue ?? Color4.White; + } + + protected override bool OnHover(InputState state) + { + Foreground.Colour = BackgroundColour; + return base.OnHover(state); + } + + protected override void OnHoverLost(InputState state) + { + Foreground.Colour = BackgroundColourHover; + base.OnHoverLost(state); } } } From 9f02000174808c0f99f4d97035305e94a1aaa6d2 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Fri, 25 Aug 2017 15:58:42 +0900 Subject: [PATCH 13/44] Update FilterControl using new AccentColour definition --- osu.Game/Overlays/Direct/FilterControl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Direct/FilterControl.cs b/osu.Game/Overlays/Direct/FilterControl.cs index 28d26d0641..ca9e8667e6 100644 --- a/osu.Game/Overlays/Direct/FilterControl.cs +++ b/osu.Game/Overlays/Direct/FilterControl.cs @@ -36,7 +36,7 @@ namespace osu.Game.Overlays.Direct [BackgroundDependencyLoader(true)] private void load(OsuGame game, RulesetStore rulesets, OsuColour colours) { - DisplayStyleControl.Dropdown.AccentColour = colours.BlueDark; + DisplayStyleControl.Dropdown.AccentColour.Value = colours.BlueDark; Ruleset.BindTo(game?.Ruleset ?? new Bindable { Value = rulesets.GetRuleset(0) }); foreach (var r in rulesets.AllRulesets) From 3ffc46770472e1d91f2a160350f46e521f0147f7 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Fri, 25 Aug 2017 16:27:01 +0900 Subject: [PATCH 14/44] Fix crappy resizing. --- osu-framework | 2 +- osu.Game/Graphics/UserInterface/OsuMenu.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu-framework b/osu-framework index 2f0674792a..56ce220e7f 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 2f0674792adaf123dcf44ea0099c5707df4a6d60 +Subproject commit 56ce220e7f631ce2890597e505d073cdfc0233a1 diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs index 79519e26a0..45bee216ad 100644 --- a/osu.Game/Graphics/UserInterface/OsuMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs @@ -25,7 +25,7 @@ namespace osu.Game.Graphics.UserInterface protected override void UpdateMenuHeight() { var actualHeight = (RelativeSizeAxes & Axes.Y) > 0 ? 1 : ContentHeight; - this.ResizeTo(new Vector2(1, State == MenuState.Opened ? actualHeight : 0), 300, Easing.OutQuint); + this.ResizeHeightTo(State == MenuState.Opened ? actualHeight : 0, 300, Easing.OutQuint); } protected override FlowContainer CreateItemsFlow() From ee85515d951846d1cdd5241c89ec47a77a5efa10 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 25 Aug 2017 18:41:12 +0900 Subject: [PATCH 15/44] Changes in line with framework changes --- osu-framework | 2 +- .../Graphics/UserInterface/OsuContextMenu.cs | 26 ++++------ .../Graphics/UserInterface/OsuDropdown.cs | 48 ++++++++++++++----- osu.Game/Graphics/UserInterface/OsuMenu.cs | 14 +----- .../Graphics/UserInterface/OsuTabControl.cs | 32 ++++++++----- .../Sections/General/LoginSettings.cs | 20 +++----- 6 files changed, 75 insertions(+), 67 deletions(-) diff --git a/osu-framework b/osu-framework index 56ce220e7f..926d7c971d 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 56ce220e7f631ce2890597e505d073cdfc0233a1 +Subproject commit 926d7c971d059c7aeb3ccfb09d06910c46aa3a40 diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs index ddb91d42a1..ad4cd1edbc 100644 --- a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs @@ -39,18 +39,12 @@ namespace osu.Game.Graphics.UserInterface protected override void AnimateOpen() => this.FadeIn(fade_duration, Easing.OutQuint); protected override void AnimateClose() => this.FadeOut(fade_duration, Easing.OutQuint); - protected override FlowContainer CreateItemsFlow() - { - var flow = base.CreateItemsFlow(); - flow.Padding = new MarginPadding { Vertical = OsuContextMenuItemRepresentation.MARGIN_VERTICAL }; + protected override MarginPadding ItemFlowContainerPadding => new MarginPadding { Vertical = DrawableOsuContextMenuItem.MARGIN_VERTICAL }; - return flow; - } + protected override DrawableMenuItem CreateDrawableMenuItem(TItem item) => new DrawableOsuContextMenuItem(this, item); - protected override MenuItemRepresentation CreateMenuItemRepresentation(TItem model) => new OsuContextMenuItemRepresentation(this, model); - - #region OsuContextMenuItemRepresentation - private class OsuContextMenuItemRepresentation : MenuItemRepresentation + #region DrawableOsuContextMenuItem + private class DrawableOsuContextMenuItem : DrawableMenuItem { private const int margin_horizontal = 17; private const int text_size = 17; @@ -63,8 +57,8 @@ namespace osu.Game.Graphics.UserInterface private OsuSpriteText text; private OsuSpriteText textBold; - public OsuContextMenuItemRepresentation(Menu menu, TItem model) - : base(menu, model) + public DrawableOsuContextMenuItem(Menu menu, TItem item) + : base(item) { } @@ -82,7 +76,7 @@ namespace osu.Game.Graphics.UserInterface private void updateTextColour() { - switch (Model.Type) + switch (Item.Type) { case MenuItemType.Standard: textBold.Colour = text.Colour = Color4.White; @@ -117,7 +111,7 @@ namespace osu.Game.Graphics.UserInterface return base.OnClick(state); } - protected override Drawable CreateText(string title) => new Container + protected override Drawable CreateContent() => new Container { AutoSizeAxes = Axes.Both, Anchor = Anchor.CentreLeft, @@ -129,7 +123,7 @@ namespace osu.Game.Graphics.UserInterface Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, TextSize = text_size, - Text = title, + Text = Item.Text, Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, }, textBold = new OsuSpriteText @@ -139,7 +133,7 @@ namespace osu.Game.Graphics.UserInterface Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, TextSize = text_size, - Text = title, + Text = Item.Text, Font = @"Exo2.0-Bold", Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, } diff --git a/osu.Game/Graphics/UserInterface/OsuDropdown.cs b/osu.Game/Graphics/UserInterface/OsuDropdown.cs index d556c58bdd..2c691b7763 100644 --- a/osu.Game/Graphics/UserInterface/OsuDropdown.cs +++ b/osu.Game/Graphics/UserInterface/OsuDropdown.cs @@ -44,18 +44,40 @@ namespace osu.Game.Graphics.UserInterface #region OsuDropdownMenu protected class OsuDropdownMenu : DropdownMenu { + // todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring + public OsuDropdownMenu() + { + CornerRadius = 4; + BackgroundColour = Color4.Black.Opacity(0.5f); + } + + // todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring + protected override void AnimateOpen() => this.FadeIn(300, Easing.OutQuint); + protected override void AnimateClose() => this.FadeOut(300, Easing.OutQuint); + + // todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring + protected override MarginPadding ItemFlowContainerPadding => new MarginPadding(5); + + // todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring + protected override void UpdateMenuHeight() + { + var actualHeight = (RelativeSizeAxes & Axes.Y) > 0 ? 1 : ContentHeight; + this.ResizeHeightTo(State == MenuState.Opened ? actualHeight : 0, 300, Easing.OutQuint); + } + public readonly Bindable AccentColour = new Bindable(); - protected override MenuItemRepresentation CreateMenuItemRepresentation(DropdownMenuItem model) + + protected override DrawableMenuItem CreateDrawableMenuItem(DropdownMenuItem item) { - var newItem = new OsuDropdownMenuItemRepresentation(this, model); + var newItem = new DrawableOsuDropdownMenuItem(item); newItem.AccentColour.BindTo(AccentColour); return newItem; } - #region OsuDropdownMenuItemRepresentation - protected class OsuDropdownMenuItemRepresentation : DropdownMenuItemRepresentation + #region DrawableOsuDropdownMenuItem + protected class DrawableOsuDropdownMenuItem : DrawableDropdownMenuItem { public readonly Bindable AccentColour = new Bindable(); @@ -65,8 +87,8 @@ namespace osu.Game.Graphics.UserInterface private Color4 nonAccentHoverColour; private Color4 nonAccentSelectedColour; - public OsuDropdownMenuItemRepresentation(Menu> menu, DropdownMenuItem model) - : base(menu, model) + public DrawableOsuDropdownMenuItem(DropdownMenuItem item) + : base(item) { Foreground.Padding = new MarginPadding(2); @@ -88,17 +110,17 @@ namespace osu.Game.Graphics.UserInterface { BackgroundColourHover = newValue ?? nonAccentHoverColour; BackgroundColourSelected = newValue ?? nonAccentSelectedColour; - AnimateBackground(IsHovered); - AnimateForeground(IsHovered); + UpdateBackgroundColour(); + UpdateForegroundColour(); } - protected override void AnimateForeground(bool hover) + protected override void UpdateForegroundColour() { - base.AnimateForeground(hover); - chevron.Alpha = hover ? 1 : 0; + base.UpdateForegroundColour(); + chevron.Alpha = IsHovered ? 1 : 0; } - protected override Drawable CreateText(string title) => new FillFlowContainer + protected override Drawable CreateContent() => new FillFlowContainer { Direction = FillDirection.Horizontal, RelativeSizeAxes = Axes.X, @@ -118,7 +140,7 @@ namespace osu.Game.Graphics.UserInterface }, Label = new OsuSpriteText { - Text = title, + Text = Item.Text, Origin = Anchor.CentreLeft, Anchor = Anchor.CentreLeft, } diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs index 45bee216ad..0c5bfa2947 100644 --- a/osu.Game/Graphics/UserInterface/OsuMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs @@ -1,11 +1,9 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using OpenTK; using OpenTK.Graphics; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.UserInterface; namespace osu.Game.Graphics.UserInterface @@ -28,16 +26,6 @@ namespace osu.Game.Graphics.UserInterface this.ResizeHeightTo(State == MenuState.Opened ? actualHeight : 0, 300, Easing.OutQuint); } - protected override FlowContainer CreateItemsFlow() - { - var flow = base.CreateItemsFlow(); - flow.Padding = new MarginPadding(5); - - return flow; - } - } - - public class OsuMenu : OsuMenu - { + protected override MarginPadding ItemFlowContainerPadding => new MarginPadding(5); } } diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs index bc673a7af6..58d853d97e 100644 --- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs +++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs @@ -48,9 +48,9 @@ namespace osu.Game.Graphics.UserInterface set { accentColour = value; - var dropDown = Dropdown as OsuTabDropdown; - if (dropDown != null) - dropDown.AccentColour.Value = value; + var dropdown = Dropdown as OsuTabDropdown; + if (dropdown != null) + dropdown.AccentColour.Value = value; foreach (var item in TabContainer.Children.OfType()) item.AccentColour = value; } @@ -140,16 +140,20 @@ namespace osu.Game.Graphics.UserInterface protected override void OnDeactivated() => fadeInactive(); } + // todo: this needs to go private class OsuTabDropdown : OsuDropdown { public OsuTabDropdown() { RelativeSizeAxes = Axes.X; - - } - protected override DropdownMenu CreateMenu() => new OsuTabDropdownMenu(); + protected override DropdownMenu CreateMenu() + { + var menu = new OsuTabDropdownMenu(); + menu.AccentColour.BindTo(AccentColour); + return menu; + } protected override DropdownHeader CreateHeader() { @@ -175,18 +179,24 @@ namespace osu.Game.Graphics.UserInterface MaxHeight = 400; } - protected override MenuItemRepresentation CreateMenuItemRepresentation(DropdownMenuItem model) => new OsuTabDropdownMenuItemRepresentation(this, model); - - private class OsuTabDropdownMenuItemRepresentation : OsuDropdownMenuItemRepresentation + protected override DrawableMenuItem CreateDrawableMenuItem(DropdownMenuItem item) { - public OsuTabDropdownMenuItemRepresentation(Menu> menu, DropdownMenuItem model) - : base(menu, model) + var poop = new DrawableOsuTabDropdownMenuItem(this, item); + poop.AccentColour.BindTo(AccentColour); + return poop; + } + + private class DrawableOsuTabDropdownMenuItem : DrawableOsuDropdownMenuItem + { + public DrawableOsuTabDropdownMenuItem(Menu> menu, DropdownMenuItem item) + : base(item) { ForegroundColourHover = Color4.Black; } } } + protected class OsuTabDropdownHeader : OsuDropdownHeader { public OsuTabDropdownHeader() diff --git a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs index 111dba7151..ad7c7cf092 100644 --- a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs @@ -306,20 +306,14 @@ namespace osu.Game.Overlays.Settings.Sections.General BackgroundColour = colours.Gray3; } - protected override FlowContainer CreateItemsFlow() + protected override MarginPadding ItemFlowContainerPadding => new MarginPadding(); + + protected override DrawableMenuItem CreateDrawableMenuItem(DropdownMenuItem item) => new DrawableUserDropdownMenuItem(this, item); + + private class DrawableUserDropdownMenuItem : DrawableOsuDropdownMenuItem { - var flow = base.CreateItemsFlow(); - flow.Padding = new MarginPadding(0); - - return flow; - } - - protected override MenuItemRepresentation CreateMenuItemRepresentation(DropdownMenuItem model) => new UserDropdownMenuItem(this, model); - - private class UserDropdownMenuItem : OsuDropdownMenuItemRepresentation - { - public UserDropdownMenuItem(Menu> menu, DropdownMenuItem model) - : base(menu, model) + public DrawableUserDropdownMenuItem(Menu> menu, DropdownMenuItem item) + : base(item) { Foreground.Padding = new MarginPadding { Top = 5, Bottom = 5, Left = 10, Right = 5 }; Label.Margin = new MarginPadding { Left = UserDropdownHeader.LABEL_LEFT_MARGIN - 11 }; From 9374bf925ef2771cb74a9f94cec78fe219d57858 Mon Sep 17 00:00:00 2001 From: Jorolf Date: Fri, 25 Aug 2017 16:39:49 +0200 Subject: [PATCH 16/44] only show warning when focused --- .../Graphics/UserInterface/OsuPasswordTextBox.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs index 2fdbf64d08..c3cc4fe77b 100644 --- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs +++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs @@ -44,10 +44,24 @@ namespace osu.Game.Graphics.UserInterface protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) { if (args.Key == OpenTK.Input.Key.CapsLock) - warning.FadeTo(host.CapsLockEnabled ? 1 : 0, 250, Easing.OutQuint); + updateCapsWarning(host.CapsLockEnabled); return base.OnKeyDown(state, args); } + protected override void OnFocus(InputState state) + { + updateCapsWarning(host.CapsLockEnabled); + base.OnFocus(state); + } + + protected override void OnFocusLost(InputState state) + { + updateCapsWarning(false); + base.OnFocusLost(state); + } + + private void updateCapsWarning(bool visible) => warning.FadeTo(visible ? 1 : 0, 250, Easing.OutQuint); + public class PasswordMaskChar : Container { private readonly CircularContainer circle; From 4385edeb453103fe817e6af7326046d040dd046b Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Mon, 28 Aug 2017 11:01:53 +0900 Subject: [PATCH 17/44] Update usages of Menu to reflect ValueChanged events. --- osu-framework | 2 +- .../Graphics/UserInterface/OsuContextMenu.cs | 59 +++++++++++-------- .../Graphics/UserInterface/OsuDropdown.cs | 50 +++++++++------- 3 files changed, 64 insertions(+), 47 deletions(-) diff --git a/osu-framework b/osu-framework index 926d7c971d..743ad1129e 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 926d7c971d059c7aeb3ccfb09d06910c46aa3a40 +Subproject commit 743ad1129edbc1cb8faa14ebc9a6d1846780795c diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs index ad4cd1edbc..9bc2f381c0 100644 --- a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs @@ -111,34 +111,45 @@ namespace osu.Game.Graphics.UserInterface return base.OnClick(state); } - protected override Drawable CreateContent() => new Container + protected override Drawable CreateContent() { - AutoSizeAxes = Axes.Both, - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - Children = new Drawable[] + var container = new Container { - text = new OsuSpriteText + AutoSizeAxes = Axes.Both, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + Children = new Drawable[] { - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - TextSize = text_size, - Text = Item.Text, - Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, - }, - textBold = new OsuSpriteText - { - AlwaysPresent = true, - Alpha = 0, - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - TextSize = text_size, - Text = Item.Text, - Font = @"Exo2.0-Bold", - Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, + text = new OsuSpriteText + { + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + TextSize = text_size, + Text = Item.Text, + Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, + }, + textBold = new OsuSpriteText + { + AlwaysPresent = true, + Alpha = 0, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + TextSize = text_size, + Text = Item.Text, + Font = @"Exo2.0-Bold", + Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, + } } - } - }; + }; + + Item.Text.ValueChanged += newText => + { + text.Text = newText; + textBold.Text = newText; + }; + + return container; + } } #endregion } diff --git a/osu.Game/Graphics/UserInterface/OsuDropdown.cs b/osu.Game/Graphics/UserInterface/OsuDropdown.cs index 2c691b7763..8984ba1eba 100644 --- a/osu.Game/Graphics/UserInterface/OsuDropdown.cs +++ b/osu.Game/Graphics/UserInterface/OsuDropdown.cs @@ -120,32 +120,38 @@ namespace osu.Game.Graphics.UserInterface chevron.Alpha = IsHovered ? 1 : 0; } - protected override Drawable CreateContent() => new FillFlowContainer + protected override Drawable CreateContent() { - Direction = FillDirection.Horizontal, - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y, - Children = new Drawable[] + var container = new FillFlowContainer { - chevron = new SpriteIcon + Direction = FillDirection.Horizontal, + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Children = new Drawable[] { - AlwaysPresent = true, - Icon = FontAwesome.fa_chevron_right, - Colour = Color4.Black, - Alpha = 0.5f, - Size = new Vector2(8), - Margin = new MarginPadding { Left = 3, Right = 3 }, - Origin = Anchor.CentreLeft, - Anchor = Anchor.CentreLeft, - }, - Label = new OsuSpriteText - { - Text = Item.Text, - Origin = Anchor.CentreLeft, - Anchor = Anchor.CentreLeft, + chevron = new SpriteIcon + { + AlwaysPresent = true, + Icon = FontAwesome.fa_chevron_right, + Colour = Color4.Black, + Alpha = 0.5f, + Size = new Vector2(8), + Margin = new MarginPadding { Left = 3, Right = 3 }, + Origin = Anchor.CentreLeft, + Anchor = Anchor.CentreLeft, + }, + Label = new OsuSpriteText + { + Text = Item.Text, + Origin = Anchor.CentreLeft, + Anchor = Anchor.CentreLeft, + } } - } - }; + }; + + Item.Text.ValueChanged += newText => Label.Text = newText; + return container; + } } #endregion } From b5c1c05af5443246a1ec19a4cf09d03a7384ed88 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Mon, 28 Aug 2017 11:03:51 +0900 Subject: [PATCH 18/44] Remove poop. --- osu.Game/Graphics/UserInterface/OsuTabControl.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs index 58d853d97e..faa7b269bb 100644 --- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs +++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs @@ -181,9 +181,9 @@ namespace osu.Game.Graphics.UserInterface protected override DrawableMenuItem CreateDrawableMenuItem(DropdownMenuItem item) { - var poop = new DrawableOsuTabDropdownMenuItem(this, item); - poop.AccentColour.BindTo(AccentColour); - return poop; + var result = new DrawableOsuTabDropdownMenuItem(this, item); + result.AccentColour.BindTo(AccentColour); + return result; } private class DrawableOsuTabDropdownMenuItem : DrawableOsuDropdownMenuItem From 66db3389f6f8f7ce58e42fb008980fb923739366 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Mon, 28 Aug 2017 12:33:31 +0900 Subject: [PATCH 19/44] Update in line with framework changes. --- osu-framework | 2 +- .../Graphics/UserInterface/OsuContextMenu.cs | 63 ++++++++++--------- .../Graphics/UserInterface/OsuDropdown.cs | 38 ++++++----- .../Sections/General/LoginSettings.cs | 6 +- 4 files changed, 64 insertions(+), 45 deletions(-) diff --git a/osu-framework b/osu-framework index 743ad1129e..2958d6fda1 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 743ad1129edbc1cb8faa14ebc9a6d1846780795c +Subproject commit 2958d6fda1be252a0f479609090e72814b177c91 diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs index 9bc2f381c0..4ec349edd7 100644 --- a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs @@ -8,6 +8,7 @@ using osu.Framework.Audio.Sample; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input; using osu.Game.Graphics.Sprites; @@ -54,8 +55,7 @@ namespace osu.Game.Graphics.UserInterface private SampleChannel sampleClick; private SampleChannel sampleHover; - private OsuSpriteText text; - private OsuSpriteText textBold; + private TextContainer text; public DrawableOsuContextMenuItem(Menu menu, TItem item) : base(item) @@ -79,13 +79,13 @@ namespace osu.Game.Graphics.UserInterface switch (Item.Type) { case MenuItemType.Standard: - textBold.Colour = text.Colour = Color4.White; + text.Colour = Color4.White; break; case MenuItemType.Destructive: - textBold.Colour = text.Colour = Color4.Red; + text.Colour = Color4.Red; break; case MenuItemType.Highlighted: - textBold.Colour = text.Colour = OsuColour.FromHex(@"ffcc22"); + text.Colour = OsuColour.FromHex(@"ffcc22"); break; } } @@ -93,15 +93,15 @@ namespace osu.Game.Graphics.UserInterface protected override bool OnHover(InputState state) { sampleHover.Play(); - textBold.FadeIn(transition_length, Easing.OutQuint); - text.FadeOut(transition_length, Easing.OutQuint); + text.BoldText.FadeIn(transition_length, Easing.OutQuint); + text.NormalText.FadeOut(transition_length, Easing.OutQuint); return base.OnHover(state); } protected override void OnHoverLost(InputState state) { - textBold.FadeOut(transition_length, Easing.OutQuint); - text.FadeIn(transition_length, Easing.OutQuint); + text.BoldText.FadeOut(transition_length, Easing.OutQuint); + text.NormalText.FadeIn(transition_length, Easing.OutQuint); base.OnHoverLost(state); } @@ -111,44 +111,51 @@ namespace osu.Game.Graphics.UserInterface return base.OnClick(state); } - protected override Drawable CreateContent() + protected override Drawable CreateContent() => text = new TextContainer(); + + private class TextContainer : Container, IHasText { - var container = new Container + public string Text { - AutoSizeAxes = Axes.Both, - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, + get { return NormalText.Text; } + set + { + NormalText.Text = value; + BoldText.Text = value; + } + } + + public readonly SpriteText NormalText; + public readonly SpriteText BoldText; + + public TextContainer() + { + Anchor = Anchor.CentreLeft; + Origin = Anchor.CentreLeft; + + AutoSizeAxes = Axes.Both; + Children = new Drawable[] { - text = new OsuSpriteText + NormalText = new OsuSpriteText { Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, TextSize = text_size, - Text = Item.Text, Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, }, - textBold = new OsuSpriteText + BoldText = new OsuSpriteText { AlwaysPresent = true, Alpha = 0, Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, TextSize = text_size, - Text = Item.Text, Font = @"Exo2.0-Bold", Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, } - } - }; - - Item.Text.ValueChanged += newText => - { - text.Text = newText; - textBold.Text = newText; - }; - - return container; + }; + } } } #endregion diff --git a/osu.Game/Graphics/UserInterface/OsuDropdown.cs b/osu.Game/Graphics/UserInterface/OsuDropdown.cs index 8984ba1eba..d67a995e67 100644 --- a/osu.Game/Graphics/UserInterface/OsuDropdown.cs +++ b/osu.Game/Graphics/UserInterface/OsuDropdown.cs @@ -81,8 +81,7 @@ namespace osu.Game.Graphics.UserInterface { public readonly Bindable AccentColour = new Bindable(); - private SpriteIcon chevron; - protected OsuSpriteText Label; + private TextContainer textContainer; private Color4 nonAccentHoverColour; private Color4 nonAccentSelectedColour; @@ -117,19 +116,32 @@ namespace osu.Game.Graphics.UserInterface protected override void UpdateForegroundColour() { base.UpdateForegroundColour(); - chevron.Alpha = IsHovered ? 1 : 0; + + textContainer.Chevron.Alpha = IsHovered ? 1 : 0; } - protected override Drawable CreateContent() + protected override Drawable CreateContent() => textContainer = new TextContainer(); + + protected class TextContainer : FillFlowContainer, IHasText { - var container = new FillFlowContainer + public string Text { - Direction = FillDirection.Horizontal, - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y, + get { return Label.Text; } + set { Label.Text = value; } + } + + public readonly OsuSpriteText Label; + public readonly SpriteIcon Chevron; + + public TextContainer() + { + RelativeSizeAxes = Axes.X; + AutoSizeAxes = Axes.Y; + Direction = FillDirection.Horizontal; + Children = new Drawable[] { - chevron = new SpriteIcon + Chevron = new SpriteIcon { AlwaysPresent = true, Icon = FontAwesome.fa_chevron_right, @@ -142,15 +154,11 @@ namespace osu.Game.Graphics.UserInterface }, Label = new OsuSpriteText { - Text = Item.Text, Origin = Anchor.CentreLeft, Anchor = Anchor.CentreLeft, } - } - }; - - Item.Text.ValueChanged += newText => Label.Text = newText; - return container; + }; + } } } #endregion diff --git a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs index ad7c7cf092..609b4b1e16 100644 --- a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs @@ -316,9 +316,13 @@ namespace osu.Game.Overlays.Settings.Sections.General : base(item) { Foreground.Padding = new MarginPadding { Top = 5, Bottom = 5, Left = 10, Right = 5 }; - Label.Margin = new MarginPadding { Left = UserDropdownHeader.LABEL_LEFT_MARGIN - 11 }; CornerRadius = 5; } + + protected override Drawable CreateContent() => new TextContainer + { + Label = { Margin = new MarginPadding { Left = UserDropdownHeader.LABEL_LEFT_MARGIN - 11 } } + }; } } From fc6c682d886b2d93217c57896e08f764e7d810d5 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Mon, 28 Aug 2017 14:42:52 +0900 Subject: [PATCH 20/44] Update in-line with framework changes. --- osu-framework | 2 +- .../Visual/TestCaseContextMenu.cs | 37 ++++++++++--------- .../Graphics/Cursor/IHasOsuContextMenu.cs | 9 ----- .../Cursor/OsuContextMenuContainer.cs | 4 +- .../Graphics/UserInterface/OsuContextMenu.cs | 12 +++--- .../Graphics/UserInterface/OsuDropdown.cs | 4 +- osu.Game/Graphics/UserInterface/OsuMenu.cs | 3 +- .../{OsuContextMenuItem.cs => OsuMenuItem.cs} | 6 +-- .../Graphics/UserInterface/OsuTabControl.cs | 6 +-- .../Sections/General/LoginSettings.cs | 4 +- osu.Game/osu.Game.csproj | 3 +- 11 files changed, 41 insertions(+), 49 deletions(-) delete mode 100644 osu.Game/Graphics/Cursor/IHasOsuContextMenu.cs rename osu.Game/Graphics/UserInterface/{OsuContextMenuItem.cs => OsuMenuItem.cs} (65%) diff --git a/osu-framework b/osu-framework index 2958d6fda1..2cb3e59c8b 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 2958d6fda1be252a0f479609090e72814b177c91 +Subproject commit 2cb3e59c8bc7e67edef4dfe7f9c7dfc01db386a7 diff --git a/osu.Desktop.Tests/Visual/TestCaseContextMenu.cs b/osu.Desktop.Tests/Visual/TestCaseContextMenu.cs index 2ac3a28bd4..0d9c5e7ed1 100644 --- a/osu.Desktop.Tests/Visual/TestCaseContextMenu.cs +++ b/osu.Desktop.Tests/Visual/TestCaseContextMenu.cs @@ -3,8 +3,9 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Shapes; -using osu.Game.Graphics.Cursor; +using osu.Framework.Graphics.UserInterface; using osu.Game.Graphics.UserInterface; using OpenTK; using OpenTK.Graphics; @@ -66,30 +67,30 @@ namespace osu.Desktop.Tests.Visual ); } - private class MyContextMenuContainer : Container, IHasOsuContextMenu + private class MyContextMenuContainer : Container, IHasContextMenu { - public OsuContextMenuItem[] ContextMenuItems => new[] + public MenuItem[] ContextMenuItems => new MenuItem[] { - new OsuContextMenuItem(@"Some option"), - new OsuContextMenuItem(@"Highlighted option", MenuItemType.Highlighted), - new OsuContextMenuItem(@"Another option"), - new OsuContextMenuItem(@"Choose me please"), - new OsuContextMenuItem(@"And me too"), - new OsuContextMenuItem(@"Trying to fill"), - new OsuContextMenuItem(@"Destructive option", MenuItemType.Destructive), + new OsuMenuItem(@"Some option"), + new OsuMenuItem(@"Highlighted option", MenuItemType.Highlighted), + new OsuMenuItem(@"Another option"), + new OsuMenuItem(@"Choose me please"), + new OsuMenuItem(@"And me too"), + new OsuMenuItem(@"Trying to fill"), + new OsuMenuItem(@"Destructive option", MenuItemType.Destructive), }; } - private class AnotherContextMenuContainer : Container, IHasOsuContextMenu + private class AnotherContextMenuContainer : Container, IHasContextMenu { - public OsuContextMenuItem[] ContextMenuItems => new[] + public MenuItem[] ContextMenuItems => new MenuItem[] { - new OsuContextMenuItem(@"Simple option"), - new OsuContextMenuItem(@"Simple very very long option"), - new OsuContextMenuItem(@"Change width", MenuItemType.Highlighted, () => this.ResizeWidthTo(Width * 2, 100, Easing.OutQuint)), - new OsuContextMenuItem(@"Change height", MenuItemType.Highlighted, () => this.ResizeHeightTo(Height * 2, 100, Easing.OutQuint)), - new OsuContextMenuItem(@"Change width back", MenuItemType.Destructive, () => this.ResizeWidthTo(Width / 2, 100, Easing.OutQuint)), - new OsuContextMenuItem(@"Change height back", MenuItemType.Destructive, () => this.ResizeHeightTo(Height / 2, 100, Easing.OutQuint)), + new OsuMenuItem(@"Simple option"), + new OsuMenuItem(@"Simple very very long option"), + new OsuMenuItem(@"Change width", MenuItemType.Highlighted, () => this.ResizeWidthTo(Width * 2, 100, Easing.OutQuint)), + new OsuMenuItem(@"Change height", MenuItemType.Highlighted, () => this.ResizeHeightTo(Height * 2, 100, Easing.OutQuint)), + new OsuMenuItem(@"Change width back", MenuItemType.Destructive, () => this.ResizeWidthTo(Width / 2, 100, Easing.OutQuint)), + new OsuMenuItem(@"Change height back", MenuItemType.Destructive, () => this.ResizeHeightTo(Height / 2, 100, Easing.OutQuint)), }; } } diff --git a/osu.Game/Graphics/Cursor/IHasOsuContextMenu.cs b/osu.Game/Graphics/Cursor/IHasOsuContextMenu.cs deleted file mode 100644 index 6fb1a3d31f..0000000000 --- a/osu.Game/Graphics/Cursor/IHasOsuContextMenu.cs +++ /dev/null @@ -1,9 +0,0 @@ -using osu.Framework.Graphics.Cursor; -using osu.Game.Graphics.UserInterface; - -namespace osu.Game.Graphics.Cursor -{ - public interface IHasOsuContextMenu : IHasContextMenu - { - } -} diff --git a/osu.Game/Graphics/Cursor/OsuContextMenuContainer.cs b/osu.Game/Graphics/Cursor/OsuContextMenuContainer.cs index 4ee3e31707..1ece10bc60 100644 --- a/osu.Game/Graphics/Cursor/OsuContextMenuContainer.cs +++ b/osu.Game/Graphics/Cursor/OsuContextMenuContainer.cs @@ -7,8 +7,8 @@ using osu.Game.Graphics.UserInterface; namespace osu.Game.Graphics.Cursor { - public class OsuContextMenuContainer : ContextMenuContainer + public class OsuContextMenuContainer : ContextMenuContainer { - protected override Menu CreateMenu() => new OsuContextMenu(); + protected override Menu CreateMenu() => new OsuContextMenu(); } } \ No newline at end of file diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs index 4ec349edd7..9a2917cd66 100644 --- a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuContextMenu.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 OpenTK.Graphics; using osu.Framework.Allocation; using osu.Framework.Audio; @@ -15,8 +16,7 @@ using osu.Game.Graphics.Sprites; namespace osu.Game.Graphics.UserInterface { - public class OsuContextMenu : OsuMenu - where TItem : OsuContextMenuItem + public class OsuContextMenu : OsuMenu { private const int fade_duration = 250; @@ -42,7 +42,7 @@ namespace osu.Game.Graphics.UserInterface protected override MarginPadding ItemFlowContainerPadding => new MarginPadding { Vertical = DrawableOsuContextMenuItem.MARGIN_VERTICAL }; - protected override DrawableMenuItem CreateDrawableMenuItem(TItem item) => new DrawableOsuContextMenuItem(this, item); + protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableOsuContextMenuItem(item); #region DrawableOsuContextMenuItem private class DrawableOsuContextMenuItem : DrawableMenuItem @@ -57,9 +57,11 @@ namespace osu.Game.Graphics.UserInterface private TextContainer text; - public DrawableOsuContextMenuItem(Menu menu, TItem item) + public DrawableOsuContextMenuItem(MenuItem item) : base(item) { + if (!(Item is OsuMenuItem)) + throw new ArgumentException($"{nameof(item)} must be a {nameof(OsuMenuItem)}."); } [BackgroundDependencyLoader] @@ -76,7 +78,7 @@ namespace osu.Game.Graphics.UserInterface private void updateTextColour() { - switch (Item.Type) + switch (((OsuMenuItem)Item).Type) { case MenuItemType.Standard: text.Colour = Color4.White; diff --git a/osu.Game/Graphics/UserInterface/OsuDropdown.cs b/osu.Game/Graphics/UserInterface/OsuDropdown.cs index d67a995e67..9c816b8230 100644 --- a/osu.Game/Graphics/UserInterface/OsuDropdown.cs +++ b/osu.Game/Graphics/UserInterface/OsuDropdown.cs @@ -68,7 +68,7 @@ namespace osu.Game.Graphics.UserInterface public readonly Bindable AccentColour = new Bindable(); - protected override DrawableMenuItem CreateDrawableMenuItem(DropdownMenuItem item) + protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) { var newItem = new DrawableOsuDropdownMenuItem(item); newItem.AccentColour.BindTo(AccentColour); @@ -86,7 +86,7 @@ namespace osu.Game.Graphics.UserInterface private Color4 nonAccentHoverColour; private Color4 nonAccentSelectedColour; - public DrawableOsuDropdownMenuItem(DropdownMenuItem item) + public DrawableOsuDropdownMenuItem(MenuItem item) : base(item) { Foreground.Padding = new MarginPadding(2); diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs index 0c5bfa2947..6b64e9e367 100644 --- a/osu.Game/Graphics/UserInterface/OsuMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs @@ -8,8 +8,7 @@ using osu.Framework.Graphics.UserInterface; namespace osu.Game.Graphics.UserInterface { - public class OsuMenu : Menu - where TItem : MenuItem + public class OsuMenu : Menu { public OsuMenu() { diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs b/osu.Game/Graphics/UserInterface/OsuMenuItem.cs similarity index 65% rename from osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs rename to osu.Game/Graphics/UserInterface/OsuMenuItem.cs index bf00208b88..1f78666d20 100644 --- a/osu.Game/Graphics/UserInterface/OsuContextMenuItem.cs +++ b/osu.Game/Graphics/UserInterface/OsuMenuItem.cs @@ -6,17 +6,17 @@ using osu.Framework.Graphics.UserInterface; namespace osu.Game.Graphics.UserInterface { - public class OsuContextMenuItem : MenuItem + public class OsuMenuItem : MenuItem { public readonly MenuItemType Type; - public OsuContextMenuItem(string text, MenuItemType type = MenuItemType.Standard) + public OsuMenuItem(string text, MenuItemType type = MenuItemType.Standard) : base(text) { Type = type; } - public OsuContextMenuItem(string text, MenuItemType type, Action action) + public OsuMenuItem(string text, MenuItemType type, Action action) : base(text, action) { Type = type; diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs index faa7b269bb..32d2bc7c53 100644 --- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs +++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs @@ -179,16 +179,16 @@ namespace osu.Game.Graphics.UserInterface MaxHeight = 400; } - protected override DrawableMenuItem CreateDrawableMenuItem(DropdownMenuItem item) + protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) { - var result = new DrawableOsuTabDropdownMenuItem(this, item); + var result = new DrawableOsuTabDropdownMenuItem(item); result.AccentColour.BindTo(AccentColour); return result; } private class DrawableOsuTabDropdownMenuItem : DrawableOsuDropdownMenuItem { - public DrawableOsuTabDropdownMenuItem(Menu> menu, DropdownMenuItem item) + public DrawableOsuTabDropdownMenuItem(MenuItem item) : base(item) { ForegroundColourHover = Color4.Black; diff --git a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs index 609b4b1e16..cf12c8a8e8 100644 --- a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs @@ -308,11 +308,11 @@ namespace osu.Game.Overlays.Settings.Sections.General protected override MarginPadding ItemFlowContainerPadding => new MarginPadding(); - protected override DrawableMenuItem CreateDrawableMenuItem(DropdownMenuItem item) => new DrawableUserDropdownMenuItem(this, item); + protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableUserDropdownMenuItem(item); private class DrawableUserDropdownMenuItem : DrawableOsuDropdownMenuItem { - public DrawableUserDropdownMenuItem(Menu> menu, DropdownMenuItem item) + public DrawableUserDropdownMenuItem(MenuItem item) : base(item) { Foreground.Padding = new MarginPadding { Top = 5, Bottom = 5, Left = 10, Right = 5 }; diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 0c710fd242..325cfba986 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -84,7 +84,6 @@ - @@ -92,7 +91,7 @@ - + From 7bf6d4aa656a50e0373cec1d099f69037dc284c1 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Mon, 28 Aug 2017 15:33:24 +0900 Subject: [PATCH 21/44] Rename DrawableOsuContextMenuItem -> DrawableOsuMenuItem, and move to OsuMenu. --- .../Graphics/UserInterface/OsuContextMenu.cs | 129 +----------------- osu.Game/Graphics/UserInterface/OsuMenu.cs | 126 +++++++++++++++++ 2 files changed, 127 insertions(+), 128 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs index 9a2917cd66..808c72ee5d 100644 --- a/osu.Game/Graphics/UserInterface/OsuContextMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuContextMenu.cs @@ -1,18 +1,11 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using System; using OpenTK.Graphics; using osu.Framework.Allocation; -using osu.Framework.Audio; -using osu.Framework.Audio.Sample; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Sprites; -using osu.Framework.Graphics.UserInterface; -using osu.Framework.Input; -using osu.Game.Graphics.Sprites; namespace osu.Game.Graphics.UserInterface { @@ -40,126 +33,6 @@ namespace osu.Game.Graphics.UserInterface protected override void AnimateOpen() => this.FadeIn(fade_duration, Easing.OutQuint); protected override void AnimateClose() => this.FadeOut(fade_duration, Easing.OutQuint); - protected override MarginPadding ItemFlowContainerPadding => new MarginPadding { Vertical = DrawableOsuContextMenuItem.MARGIN_VERTICAL }; - - protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableOsuContextMenuItem(item); - - #region DrawableOsuContextMenuItem - private class DrawableOsuContextMenuItem : DrawableMenuItem - { - private const int margin_horizontal = 17; - private const int text_size = 17; - private const int transition_length = 80; - public const int MARGIN_VERTICAL = 4; - - private SampleChannel sampleClick; - private SampleChannel sampleHover; - - private TextContainer text; - - public DrawableOsuContextMenuItem(MenuItem item) - : base(item) - { - if (!(Item is OsuMenuItem)) - throw new ArgumentException($"{nameof(item)} must be a {nameof(OsuMenuItem)}."); - } - - [BackgroundDependencyLoader] - private void load(AudioManager audio) - { - sampleHover = audio.Sample.Get(@"UI/generic-hover"); - sampleClick = audio.Sample.Get(@"UI/generic-click"); - - BackgroundColour = Color4.Transparent; - BackgroundColourHover = OsuColour.FromHex(@"172023"); - - updateTextColour(); - } - - private void updateTextColour() - { - switch (((OsuMenuItem)Item).Type) - { - case MenuItemType.Standard: - text.Colour = Color4.White; - break; - case MenuItemType.Destructive: - text.Colour = Color4.Red; - break; - case MenuItemType.Highlighted: - text.Colour = OsuColour.FromHex(@"ffcc22"); - break; - } - } - - protected override bool OnHover(InputState state) - { - sampleHover.Play(); - text.BoldText.FadeIn(transition_length, Easing.OutQuint); - text.NormalText.FadeOut(transition_length, Easing.OutQuint); - return base.OnHover(state); - } - - protected override void OnHoverLost(InputState state) - { - text.BoldText.FadeOut(transition_length, Easing.OutQuint); - text.NormalText.FadeIn(transition_length, Easing.OutQuint); - base.OnHoverLost(state); - } - - protected override bool OnClick(InputState state) - { - sampleClick.Play(); - return base.OnClick(state); - } - - protected override Drawable CreateContent() => text = new TextContainer(); - - private class TextContainer : Container, IHasText - { - public string Text - { - get { return NormalText.Text; } - set - { - NormalText.Text = value; - BoldText.Text = value; - } - } - - public readonly SpriteText NormalText; - public readonly SpriteText BoldText; - - public TextContainer() - { - Anchor = Anchor.CentreLeft; - Origin = Anchor.CentreLeft; - - AutoSizeAxes = Axes.Both; - - Children = new Drawable[] - { - NormalText = new OsuSpriteText - { - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - TextSize = text_size, - Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, - }, - BoldText = new OsuSpriteText - { - AlwaysPresent = true, - Alpha = 0, - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - TextSize = text_size, - Font = @"Exo2.0-Bold", - Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, - } - }; - } - } - } - #endregion + protected override MarginPadding ItemFlowContainerPadding => new MarginPadding { Vertical = DrawableOsuMenuItem.MARGIN_VERTICAL }; } } \ No newline at end of file diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs index 6b64e9e367..fa56b183a5 100644 --- a/osu.Game/Graphics/UserInterface/OsuMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs @@ -1,10 +1,18 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System; +using osu.Framework.Allocation; +using osu.Framework.Audio; +using osu.Framework.Audio.Sample; using OpenTK.Graphics; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.UserInterface; +using osu.Framework.Input; +using osu.Game.Graphics.Sprites; namespace osu.Game.Graphics.UserInterface { @@ -26,5 +34,123 @@ namespace osu.Game.Graphics.UserInterface } protected override MarginPadding ItemFlowContainerPadding => new MarginPadding(5); + + protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableOsuMenuItem(item); + + protected class DrawableOsuMenuItem : DrawableMenuItem + { + private const int margin_horizontal = 17; + private const int text_size = 17; + private const int transition_length = 80; + public const int MARGIN_VERTICAL = 4; + + private SampleChannel sampleClick; + private SampleChannel sampleHover; + + private TextContainer text; + + public DrawableOsuMenuItem(MenuItem item) + : base(item) + { + if (!(Item is OsuMenuItem)) + throw new ArgumentException($"{nameof(item)} must be a {nameof(OsuMenuItem)}."); + } + + [BackgroundDependencyLoader] + private void load(AudioManager audio) + { + sampleHover = audio.Sample.Get(@"UI/generic-hover"); + sampleClick = audio.Sample.Get(@"UI/generic-click"); + + BackgroundColour = Color4.Transparent; + BackgroundColourHover = OsuColour.FromHex(@"172023"); + + updateTextColour(); + } + + private void updateTextColour() + { + switch (((OsuMenuItem)Item).Type) + { + case MenuItemType.Standard: + text.Colour = Color4.White; + break; + case MenuItemType.Destructive: + text.Colour = Color4.Red; + break; + case MenuItemType.Highlighted: + text.Colour = OsuColour.FromHex(@"ffcc22"); + break; + } + } + + protected override bool OnHover(InputState state) + { + sampleHover.Play(); + text.BoldText.FadeIn(transition_length, Easing.OutQuint); + text.NormalText.FadeOut(transition_length, Easing.OutQuint); + return base.OnHover(state); + } + + protected override void OnHoverLost(InputState state) + { + text.BoldText.FadeOut(transition_length, Easing.OutQuint); + text.NormalText.FadeIn(transition_length, Easing.OutQuint); + base.OnHoverLost(state); + } + + protected override bool OnClick(InputState state) + { + sampleClick.Play(); + return base.OnClick(state); + } + + protected override Drawable CreateContent() => text = new TextContainer(); + + private class TextContainer : Container, IHasText + { + public string Text + { + get { return NormalText.Text; } + set + { + NormalText.Text = value; + BoldText.Text = value; + } + } + + public readonly SpriteText NormalText; + public readonly SpriteText BoldText; + + public TextContainer() + { + Anchor = Anchor.CentreLeft; + Origin = Anchor.CentreLeft; + + AutoSizeAxes = Axes.Both; + + Children = new Drawable[] + { + NormalText = new OsuSpriteText + { + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + TextSize = text_size, + Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, + }, + BoldText = new OsuSpriteText + { + AlwaysPresent = true, + Alpha = 0, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + TextSize = text_size, + Font = @"Exo2.0-Bold", + Margin = new MarginPadding { Horizontal = margin_horizontal, Vertical = MARGIN_VERTICAL }, + } + }; + } + } + } } } From 83fe8514a49de4af590d2d076751220d7e2ba709 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Mon, 28 Aug 2017 15:44:05 +0900 Subject: [PATCH 22/44] Remove unnecessary exception, replace with default value. --- osu.Game/Graphics/UserInterface/OsuMenu.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs index fa56b183a5..efc6998ca7 100644 --- a/osu.Game/Graphics/UserInterface/OsuMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs @@ -52,8 +52,7 @@ namespace osu.Game.Graphics.UserInterface public DrawableOsuMenuItem(MenuItem item) : base(item) { - if (!(Item is OsuMenuItem)) - throw new ArgumentException($"{nameof(item)} must be a {nameof(OsuMenuItem)}."); + } [BackgroundDependencyLoader] @@ -70,8 +69,9 @@ namespace osu.Game.Graphics.UserInterface private void updateTextColour() { - switch (((OsuMenuItem)Item).Type) + switch ((Item as OsuMenuItem)?.Type) { + default: case MenuItemType.Standard: text.Colour = Color4.White; break; From 161718947502777d0e7feeedaef99d0e032ea29d Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Mon, 28 Aug 2017 17:53:03 +0800 Subject: [PATCH 23/44] Set DummyWorkingBeatmap's DeletePending to true. --- osu.Game/Beatmaps/DummyWorkingBeatmap.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs index 479f274efb..bc4b28168a 100644 --- a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs +++ b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs @@ -26,7 +26,7 @@ namespace osu.Game.Beatmaps Title = "no beatmaps available!", Author = "no one", }, - BeatmapSet = new BeatmapSetInfo(), + BeatmapSet = new BeatmapSetInfo { DeletePending = true }, Difficulty = new BeatmapDifficulty { DrainRate = 0, From 4aa5ce8b413eb8afa2cdeaa521d2fef1b42c21c4 Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Mon, 28 Aug 2017 17:53:57 +0800 Subject: [PATCH 24/44] Always load background and info wedge when no beatmap available. --- osu.Game/Screens/Select/SongSelect.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index aa554152f9..6c149c3f30 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -248,8 +248,7 @@ namespace osu.Game.Screens.Select if (beatmap == null) { - if (!Beatmap.IsDefault) - performLoad(); + performLoad(); } else { From b91757793f3e65da3c84d9fb9bd3302e4b9c94b5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 29 Aug 2017 15:20:56 +0900 Subject: [PATCH 25/44] Update framework --- osu-framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu-framework b/osu-framework index 2cb3e59c8b..167d5cda8f 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 2cb3e59c8bc7e67edef4dfe7f9c7dfc01db386a7 +Subproject commit 167d5cda8f3ddae702ffc8d8d22dac67e48b509c From 85f876a934ae831c786568e1631f7588fd006540 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 29 Aug 2017 15:23:32 +0900 Subject: [PATCH 26/44] Remove unused using statement --- osu.Game/Graphics/UserInterface/OsuMenu.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game/Graphics/UserInterface/OsuMenu.cs b/osu.Game/Graphics/UserInterface/OsuMenu.cs index efc6998ca7..ab37fd2c90 100644 --- a/osu.Game/Graphics/UserInterface/OsuMenu.cs +++ b/osu.Game/Graphics/UserInterface/OsuMenu.cs @@ -1,7 +1,6 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using System; using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Audio.Sample; From fb3ba4fe0cfa01ce725337e5a04b9c8934050495 Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Tue, 29 Aug 2017 00:26:16 +0800 Subject: [PATCH 27/44] Add comment for DeletePending. --- osu.Game/Beatmaps/DummyWorkingBeatmap.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs index bc4b28168a..4fc135a7e4 100644 --- a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs +++ b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs @@ -26,7 +26,7 @@ namespace osu.Game.Beatmaps Title = "no beatmaps available!", Author = "no one", }, - BeatmapSet = new BeatmapSetInfo { DeletePending = true }, + BeatmapSet = new BeatmapSetInfo { DeletePending = true }, //let song select show no beatmaps available if this is the only one Difficulty = new BeatmapDifficulty { DrainRate = 0, From 5b8349f90ed14ad09b8a165f4122f86f1cb2d892 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Tue, 29 Aug 2017 18:05:27 +0900 Subject: [PATCH 28/44] Revert DummyWorkingBeatmap changes. --- osu.Game/Beatmaps/DummyWorkingBeatmap.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs index 4fc135a7e4..479f274efb 100644 --- a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs +++ b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs @@ -26,7 +26,7 @@ namespace osu.Game.Beatmaps Title = "no beatmaps available!", Author = "no one", }, - BeatmapSet = new BeatmapSetInfo { DeletePending = true }, //let song select show no beatmaps available if this is the only one + BeatmapSet = new BeatmapSetInfo(), Difficulty = new BeatmapDifficulty { DrainRate = 0, From 39b5b047002d54bc1a9e623a912418fca4be887b Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 29 Aug 2017 18:17:01 +0900 Subject: [PATCH 29/44] Don't use Bindable for AccentColour Implements IHasAccentColour for conformity to rest of project. Also fixes a nullref when opening the login menu. --- .../Graphics/UserInterface/OsuDropdown.cs | 127 ++++++++++-------- .../Graphics/UserInterface/OsuTabControl.cs | 74 +++++----- osu.Game/Overlays/Direct/FilterControl.cs | 2 +- .../Overlays/Music/CollectionsDropdown.cs | 10 +- .../SearchableList/SlimEnumDropdown.cs | 8 +- .../Sections/General/LoginSettings.cs | 12 +- 6 files changed, 113 insertions(+), 120 deletions(-) diff --git a/osu.Game/Graphics/UserInterface/OsuDropdown.cs b/osu.Game/Graphics/UserInterface/OsuDropdown.cs index 9c816b8230..37bd4f2395 100644 --- a/osu.Game/Graphics/UserInterface/OsuDropdown.cs +++ b/osu.Game/Graphics/UserInterface/OsuDropdown.cs @@ -1,9 +1,9 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System.Linq; using OpenTK.Graphics; using osu.Framework.Allocation; -using osu.Framework.Configuration; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -14,35 +14,43 @@ using OpenTK; namespace osu.Game.Graphics.UserInterface { - public class OsuDropdown : Dropdown + public class OsuDropdown : Dropdown, IHasAccentColour { - public readonly Bindable AccentColour = new Bindable(); + private Color4 accentColour; + public Color4 AccentColour + { + get { return accentColour; } + set + { + accentColour = value; + updateAccentColour(); + } + } [BackgroundDependencyLoader] private void load(OsuColour colours) { - if (AccentColour.Value == null) - AccentColour.Value = colours.PinkDarker; + if (accentColour == default(Color4)) + accentColour = colours.PinkDarker; + updateAccentColour(); + } - protected override DropdownHeader CreateHeader() + private void updateAccentColour() { - var newHeader = new OsuDropdownHeader(); - newHeader.AccentColour.BindTo(AccentColour); + var header = Header as IHasAccentColour; + if (header != null) header.AccentColour = accentColour; - return newHeader; + var menu = Menu as IHasAccentColour; + if (menu != null) menu.AccentColour = accentColour; } - protected override DropdownMenu CreateMenu() - { - var newMenu = new OsuDropdownMenu(); - newMenu.AccentColour.BindTo(AccentColour); + protected override DropdownHeader CreateHeader() => new OsuDropdownHeader(); - return newMenu; - } + protected override DropdownMenu CreateMenu() => new OsuDropdownMenu(); #region OsuDropdownMenu - protected class OsuDropdownMenu : DropdownMenu + protected class OsuDropdownMenu : DropdownMenu, IHasAccentColour { // todo: this uses the same styling as OsuMenu. hopefully we can just use OsuMenu in the future with some refactoring public OsuDropdownMenu() @@ -65,23 +73,41 @@ namespace osu.Game.Graphics.UserInterface this.ResizeHeightTo(State == MenuState.Opened ? actualHeight : 0, 300, Easing.OutQuint); } - public readonly Bindable AccentColour = new Bindable(); - - - protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) + private Color4 accentColour; + public Color4 AccentColour { - var newItem = new DrawableOsuDropdownMenuItem(item); - newItem.AccentColour.BindTo(AccentColour); - - return newItem; + get { return accentColour; } + set + { + accentColour = value; + foreach (var c in Children.OfType()) + c.AccentColour = value; + } } - #region DrawableOsuDropdownMenuItem - protected class DrawableOsuDropdownMenuItem : DrawableDropdownMenuItem - { - public readonly Bindable AccentColour = new Bindable(); + protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableOsuDropdownMenuItem(item) { AccentColour = accentColour }; - private TextContainer textContainer; + #region DrawableOsuDropdownMenuItem + protected class DrawableOsuDropdownMenuItem : DrawableDropdownMenuItem, IHasAccentColour + { + private Color4? accentColour; + public Color4 AccentColour + { + get { return accentColour ?? nonAccentSelectedColour; } + set + { + accentColour = value; + updateColours(); + } + } + + private void updateColours() + { + BackgroundColourHover = accentColour ?? nonAccentHoverColour; + BackgroundColourSelected = accentColour ?? nonAccentSelectedColour; + UpdateBackgroundColour(); + UpdateForegroundColour(); + } private Color4 nonAccentHoverColour; private Color4 nonAccentSelectedColour; @@ -93,36 +119,29 @@ namespace osu.Game.Graphics.UserInterface Masking = true; CornerRadius = 6; - - AccentColour.ValueChanged += updateAccent; } [BackgroundDependencyLoader] private void load(OsuColour colours) { BackgroundColour = Color4.Transparent; + nonAccentHoverColour = colours.PinkDarker; nonAccentSelectedColour = Color4.Black.Opacity(0.5f); - } - - private void updateAccent(Color4? newValue) - { - BackgroundColourHover = newValue ?? nonAccentHoverColour; - BackgroundColourSelected = newValue ?? nonAccentSelectedColour; - UpdateBackgroundColour(); - UpdateForegroundColour(); + updateColours(); } protected override void UpdateForegroundColour() { base.UpdateForegroundColour(); - textContainer.Chevron.Alpha = IsHovered ? 1 : 0; + var content = Foreground.Child as Content; + if (content != null) content.Chevron.Alpha = IsHovered ? 1 : 0; } - protected override Drawable CreateContent() => textContainer = new TextContainer(); + protected override Drawable CreateContent() => new Content(); - protected class TextContainer : FillFlowContainer, IHasText + protected class Content : FillFlowContainer, IHasText { public string Text { @@ -133,7 +152,7 @@ namespace osu.Game.Graphics.UserInterface public readonly OsuSpriteText Label; public readonly SpriteIcon Chevron; - public TextContainer() + public Content() { RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; @@ -165,7 +184,7 @@ namespace osu.Game.Graphics.UserInterface } #endregion - public class OsuDropdownHeader : DropdownHeader + public class OsuDropdownHeader : DropdownHeader, IHasAccentColour { protected readonly SpriteText Text; protected override string Label @@ -176,7 +195,16 @@ namespace osu.Game.Graphics.UserInterface protected readonly SpriteIcon Icon; - public readonly Bindable AccentColour = new Bindable(); + private Color4 accentColour; + public virtual Color4 AccentColour + { + get { return accentColour; } + set + { + accentColour = value; + BackgroundColourHover = accentColour; + } + } public OsuDropdownHeader() { @@ -203,20 +231,13 @@ namespace osu.Game.Graphics.UserInterface Size = new Vector2(20), } }; - - AccentColour.ValueChanged += accentColourChanged; } [BackgroundDependencyLoader] private void load(OsuColour colours) { BackgroundColour = Color4.Black.Opacity(0.5f); - BackgroundColourHover = AccentColour?.Value ?? colours.PinkDarker; - } - - private void accentColourChanged(Color4? newValue) - { - BackgroundColourHover = newValue ?? Color4.White; + BackgroundColourHover = colours.PinkDarker; } } } diff --git a/osu.Game/Graphics/UserInterface/OsuTabControl.cs b/osu.Game/Graphics/UserInterface/OsuTabControl.cs index 32d2bc7c53..89b1f4124b 100644 --- a/osu.Game/Graphics/UserInterface/OsuTabControl.cs +++ b/osu.Game/Graphics/UserInterface/OsuTabControl.cs @@ -37,34 +37,34 @@ namespace osu.Game.Graphics.UserInterface [BackgroundDependencyLoader] private void load(OsuColour colours) { - if (accentColour == null) + if (accentColour == default(Color4)) AccentColour = colours.Blue; } - private Color4? accentColour; + private Color4 accentColour; public Color4 AccentColour { - get { return accentColour.GetValueOrDefault(); } + get { return accentColour; } set { accentColour = value; - var dropdown = Dropdown as OsuTabDropdown; + var dropdown = Dropdown as IHasAccentColour; if (dropdown != null) - dropdown.AccentColour.Value = value; - foreach (var item in TabContainer.Children.OfType()) - item.AccentColour = value; + dropdown.AccentColour = value; + foreach (var i in TabContainer.Children.OfType()) + i.AccentColour = value; } } - public class OsuTabItem : TabItem + public class OsuTabItem : TabItem, IHasAccentColour { protected readonly SpriteText Text; private readonly Box box; - private Color4? accentColour; + private Color4 accentColour; public Color4 AccentColour { - get { return accentColour.GetValueOrDefault(); } + get { return accentColour; } set { accentColour = value; @@ -103,7 +103,7 @@ namespace osu.Game.Graphics.UserInterface [BackgroundDependencyLoader] private void load(OsuColour colours) { - if (accentColour == null) + if (accentColour == default(Color4)) AccentColour = colours.Blue; } @@ -148,25 +148,13 @@ namespace osu.Game.Graphics.UserInterface RelativeSizeAxes = Axes.X; } - protected override DropdownMenu CreateMenu() + protected override DropdownMenu CreateMenu() => new OsuTabDropdownMenu(); + + protected override DropdownHeader CreateHeader() => new OsuTabDropdownHeader { - var menu = new OsuTabDropdownMenu(); - menu.AccentColour.BindTo(AccentColour); - return menu; - } - - protected override DropdownHeader CreateHeader() - { - var newHeader = new OsuTabDropdownHeader - { - Anchor = Anchor.TopRight, - Origin = Anchor.TopRight - }; - - newHeader.AccentColour.BindTo(AccentColour); - - return newHeader; - } + Anchor = Anchor.TopRight, + Origin = Anchor.TopRight + }; private class OsuTabDropdownMenu : OsuDropdownMenu { @@ -179,12 +167,7 @@ namespace osu.Game.Graphics.UserInterface MaxHeight = 400; } - protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) - { - var result = new DrawableOsuTabDropdownMenuItem(item); - result.AccentColour.BindTo(AccentColour); - return result; - } + protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableOsuTabDropdownMenuItem(item) { AccentColour = AccentColour }; private class DrawableOsuTabDropdownMenuItem : DrawableOsuDropdownMenuItem { @@ -199,6 +182,20 @@ namespace osu.Game.Graphics.UserInterface protected class OsuTabDropdownHeader : OsuDropdownHeader { + public override Color4 AccentColour + { + get + { + return base.AccentColour; + } + + set + { + base.AccentColour = value; + Foreground.Colour = value; + } + } + public OsuTabDropdownHeader() { RelativeSizeAxes = Axes.None; @@ -227,13 +224,6 @@ namespace osu.Game.Graphics.UserInterface }; Padding = new MarginPadding { Left = 5, Right = 5 }; - - AccentColour.ValueChanged += accentColourChanged; - } - - private void accentColourChanged(Color4? newValue) - { - Foreground.Colour = newValue ?? Color4.White; } protected override bool OnHover(InputState state) diff --git a/osu.Game/Overlays/Direct/FilterControl.cs b/osu.Game/Overlays/Direct/FilterControl.cs index ca9e8667e6..28d26d0641 100644 --- a/osu.Game/Overlays/Direct/FilterControl.cs +++ b/osu.Game/Overlays/Direct/FilterControl.cs @@ -36,7 +36,7 @@ namespace osu.Game.Overlays.Direct [BackgroundDependencyLoader(true)] private void load(OsuGame game, RulesetStore rulesets, OsuColour colours) { - DisplayStyleControl.Dropdown.AccentColour.Value = colours.BlueDark; + DisplayStyleControl.Dropdown.AccentColour = colours.BlueDark; Ruleset.BindTo(game?.Ruleset ?? new Bindable { Value = rulesets.GetRuleset(0) }); foreach (var r in rulesets.AllRulesets) diff --git a/osu.Game/Overlays/Music/CollectionsDropdown.cs b/osu.Game/Overlays/Music/CollectionsDropdown.cs index be72d4481a..3b11d9f52a 100644 --- a/osu.Game/Overlays/Music/CollectionsDropdown.cs +++ b/osu.Game/Overlays/Music/CollectionsDropdown.cs @@ -18,16 +18,10 @@ namespace osu.Game.Overlays.Music [BackgroundDependencyLoader] private void load(OsuColour colours) { - AccentColour.Value = colours.Gray6; + AccentColour = colours.Gray6; } - protected override DropdownHeader CreateHeader() - { - var newHeader = new CollectionsHeader(); - newHeader.AccentColour.BindTo(AccentColour); - - return newHeader; - } + protected override DropdownHeader CreateHeader() => new CollectionsHeader(); protected override DropdownMenu CreateMenu() => new CollectionsMenu(); diff --git a/osu.Game/Overlays/SearchableList/SlimEnumDropdown.cs b/osu.Game/Overlays/SearchableList/SlimEnumDropdown.cs index e68cddb293..2870607519 100644 --- a/osu.Game/Overlays/SearchableList/SlimEnumDropdown.cs +++ b/osu.Game/Overlays/SearchableList/SlimEnumDropdown.cs @@ -12,13 +12,7 @@ namespace osu.Game.Overlays.SearchableList { public class SlimEnumDropdown : OsuEnumDropdown { - protected override DropdownHeader CreateHeader() - { - var newHeader = new SlimDropdownHeader(); - newHeader.AccentColour.BindTo(AccentColour); - - return newHeader; - } + protected override DropdownHeader CreateHeader() => new SlimDropdownHeader(); protected override DropdownMenu CreateMenu() => new SlimMenu(); diff --git a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs index cf12c8a8e8..a816fa56c1 100644 --- a/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/LoginSettings.cs @@ -257,13 +257,7 @@ namespace osu.Game.Overlays.Settings.Sections.General private class UserDropdown : OsuEnumDropdown { - protected override DropdownHeader CreateHeader() - { - var newHeader = new UserDropdownHeader(); - newHeader.AccentColour.BindTo(AccentColour); - - return newHeader; - } + protected override DropdownHeader CreateHeader() => new UserDropdownHeader(); protected override DropdownMenu CreateMenu() => new UserDropdownMenu(); @@ -280,7 +274,7 @@ namespace osu.Game.Overlays.Settings.Sections.General [BackgroundDependencyLoader] private void load(OsuColour colours) { - AccentColour.Value = colours.Gray5; + AccentColour = colours.Gray5; } private class UserDropdownMenu : OsuDropdownMenu @@ -319,7 +313,7 @@ namespace osu.Game.Overlays.Settings.Sections.General CornerRadius = 5; } - protected override Drawable CreateContent() => new TextContainer + protected override Drawable CreateContent() => new Content { Label = { Margin = new MarginPadding { Left = UserDropdownHeader.LABEL_LEFT_MARGIN - 11 } } }; From 2535313f4f29db31928f5d2a20a95e48c27919f6 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Tue, 29 Aug 2017 18:18:36 +0900 Subject: [PATCH 30/44] Use using. --- osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs index c3cc4fe77b..7f193a0e1a 100644 --- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs +++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs @@ -3,6 +3,7 @@ using OpenTK; using OpenTK.Graphics; +using OpenTK.Input; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -43,7 +44,7 @@ namespace osu.Game.Graphics.UserInterface protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) { - if (args.Key == OpenTK.Input.Key.CapsLock) + if (args.Key == Key.CapsLock) updateCapsWarning(host.CapsLockEnabled); return base.OnKeyDown(state, args); } From 24a2dc3d1e2d93185beae32d7d7b9919108db2b9 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 29 Aug 2017 18:31:51 +0900 Subject: [PATCH 31/44] Don't use child --- osu.Game/Graphics/UserInterface/OsuDropdown.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Graphics/UserInterface/OsuDropdown.cs b/osu.Game/Graphics/UserInterface/OsuDropdown.cs index 37bd4f2395..dde154bb61 100644 --- a/osu.Game/Graphics/UserInterface/OsuDropdown.cs +++ b/osu.Game/Graphics/UserInterface/OsuDropdown.cs @@ -135,7 +135,7 @@ namespace osu.Game.Graphics.UserInterface { base.UpdateForegroundColour(); - var content = Foreground.Child as Content; + var content = Foreground.Children.FirstOrDefault() as Content; if (content != null) content.Chevron.Alpha = IsHovered ? 1 : 0; } From 07da29ea1ce6e4c4fb6551f16efcbcf002fdfcd0 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 30 Aug 2017 20:41:41 +0900 Subject: [PATCH 32/44] Add context menu to beatmap set header --- osu.Game/Beatmaps/Drawables/BeatmapGroup.cs | 3 +++ .../Beatmaps/Drawables/BeatmapSetHeader.cs | 23 ++++++++++++++++++- osu.Game/Screens/Select/BeatmapCarousel.cs | 3 +++ osu.Game/Screens/Select/SongSelect.cs | 14 +++++++---- 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs index ad9a0a787b..dc68c9a49e 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs @@ -23,6 +23,8 @@ namespace osu.Game.Beatmaps.Drawables /// public Action StartRequested; + public Action DeleteRequested; + public BeatmapSetHeader Header; private BeatmapGroupState state; @@ -66,6 +68,7 @@ namespace osu.Game.Beatmaps.Drawables Header = new BeatmapSetHeader(beatmap) { GainedSelection = headerGainedSelection, + DeleteRequested = b => DeleteRequested(b), RelativeSizeAxes = Axes.X, }; diff --git a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs index a2457ba78e..6510f92547 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs @@ -9,16 +9,22 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Sprites; using osu.Framework.Localisation; using osu.Game.Graphics.Sprites; using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.UserInterface; +using osu.Game.Graphics.UserInterface; namespace osu.Game.Beatmaps.Drawables { - public class BeatmapSetHeader : Panel + public class BeatmapSetHeader : Panel, IHasContextMenu { public Action GainedSelection; + + public Action DeleteRequested; + private readonly SpriteText title; private readonly SpriteText artist; @@ -148,5 +154,20 @@ namespace osu.Game.Beatmaps.Drawables foreach (var p in panels) difficultyIcons.Add(new DifficultyIcon(p.Beatmap)); } + + public MenuItem[] ContextMenuItems + { + get + { + List items = new List(); + + if (State == PanelSelectedState.NotSelected) + items.Add(new OsuMenuItem("Expand", MenuItemType.Highlighted, () => State = PanelSelectedState.Selected)); + + items.Add(new OsuMenuItem("Delete", MenuItemType.Destructive, () => DeleteRequested?.Invoke(beatmap))); + + return items.ToArray(); + } + } } } \ No newline at end of file diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 264636b258..448f5395b6 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -140,6 +140,8 @@ namespace osu.Game.Screens.Select public Action StartRequested; + public Action DeleteRequested; + public void SelectNext(int direction = 1, bool skipDifficulties = true) { if (groups.All(g => g.State == BeatmapGroupState.Hidden)) @@ -305,6 +307,7 @@ namespace osu.Game.Screens.Select { SelectionChanged = (g, p) => selectGroup(g, p), StartRequested = b => StartRequested?.Invoke(), + DeleteRequested = b => DeleteRequested?.Invoke(b), State = BeatmapGroupState.Collapsed }; } diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index 6c149c3f30..4eb6da4f88 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -106,6 +106,7 @@ namespace osu.Game.Screens.Select Origin = Anchor.CentreRight, SelectionChanged = carouselSelectionChanged, BeatmapsChanged = carouselBeatmapsLoaded, + DeleteRequested = b => promptDelete(b), StartRequested = () => carouselRaisedStart(), }); Add(FilterControl = new FilterControl @@ -163,7 +164,7 @@ namespace osu.Game.Screens.Select Footer.AddButton(@"random", colours.Green, triggerRandom, Key.F2); Footer.AddButton(@"options", colours.Blue, BeatmapOptions.ToggleVisibility, Key.F3); - BeatmapOptions.AddButton(@"Delete", @"Beatmap", FontAwesome.fa_trash, colours.Pink, promptDelete, Key.Number4, float.MaxValue); + BeatmapOptions.AddButton(@"Delete", @"Beatmap", FontAwesome.fa_trash, colours.Pink, () => promptDelete(Beatmap), Key.Number4, float.MaxValue); } if (manager == null) @@ -389,10 +390,12 @@ namespace osu.Game.Screens.Select Beatmap.SetDefault(); } - private void promptDelete() + private void promptDelete(WorkingBeatmap beatmap) { - if (Beatmap != null && !Beatmap.IsDefault) - dialogOverlay?.Push(new BeatmapDeleteDialog(Beatmap)); + if (beatmap == null) + return; + + dialogOverlay?.Push(new BeatmapDeleteDialog(beatmap)); } protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) @@ -408,7 +411,8 @@ namespace osu.Game.Screens.Select case Key.Delete: if (state.Keyboard.ShiftPressed) { - promptDelete(); + if (!Beatmap.IsDefault) + promptDelete(Beatmap); return true; } break; From 8619f28ced14952e50aa9a1f96adb60ae5734f05 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 30 Aug 2017 20:41:53 +0900 Subject: [PATCH 33/44] Add context menu to beatmap difficulty (wip) --- osu.Game/Beatmaps/Drawables/BeatmapPanel.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs index 429ecaf416..f963931c7c 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs @@ -5,6 +5,7 @@ using System; using osu.Framework.Graphics; using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Sprites; using osu.Game.Graphics; using osu.Game.Graphics.Backgrounds; @@ -14,16 +15,19 @@ using OpenTK.Graphics; using osu.Framework.Input; using osu.Game.Graphics.Sprites; using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.UserInterface; namespace osu.Game.Beatmaps.Drawables { - public class BeatmapPanel : Panel + public class BeatmapPanel : Panel, IHasContextMenu { public BeatmapInfo Beatmap; private readonly Sprite background; public Action GainedSelection; public Action StartRequested; + public Action DeleteRequested; + private readonly Triangles triangles; private readonly StarCounter starCounter; @@ -148,5 +152,12 @@ namespace osu.Game.Beatmaps.Drawables } }; } + + public MenuItem[] ContextMenuItems => new MenuItem[] + { + new OsuMenuItem("Play", MenuItemType.Highlighted), + new OsuMenuItem("Edit"), + new OsuMenuItem("Delete", MenuItemType.Destructive), + }; } } From 2fb4126ffc07eb84c9428009f8a8917f25313655 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 30 Aug 2017 20:53:33 +0900 Subject: [PATCH 34/44] Use BeatmapSetInfo instead of WorkingBeatmap --- osu.Game/Beatmaps/Drawables/BeatmapGroup.cs | 2 +- osu.Game/Beatmaps/Drawables/BeatmapPanel.cs | 2 +- osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs | 4 ++-- osu.Game/Screens/Select/SongSelect.cs | 7 ++++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs index dc68c9a49e..a4c7da71d8 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs @@ -23,7 +23,7 @@ namespace osu.Game.Beatmaps.Drawables /// public Action StartRequested; - public Action DeleteRequested; + public Action DeleteRequested; public BeatmapSetHeader Header; diff --git a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs index f963931c7c..235c98b43c 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs @@ -157,7 +157,7 @@ namespace osu.Game.Beatmaps.Drawables { new OsuMenuItem("Play", MenuItemType.Highlighted), new OsuMenuItem("Edit"), - new OsuMenuItem("Delete", MenuItemType.Destructive), + new OsuMenuItem("Delete", MenuItemType.Destructive, () => DeleteRequested?.Invoke(Beatmap)), }; } } diff --git a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs index 6510f92547..b475a23ffd 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs @@ -23,7 +23,7 @@ namespace osu.Game.Beatmaps.Drawables { public Action GainedSelection; - public Action DeleteRequested; + public Action DeleteRequested; private readonly SpriteText title; private readonly SpriteText artist; @@ -164,7 +164,7 @@ namespace osu.Game.Beatmaps.Drawables if (State == PanelSelectedState.NotSelected) items.Add(new OsuMenuItem("Expand", MenuItemType.Highlighted, () => State = PanelSelectedState.Selected)); - items.Add(new OsuMenuItem("Delete", MenuItemType.Destructive, () => DeleteRequested?.Invoke(beatmap))); + items.Add(new OsuMenuItem("Delete", MenuItemType.Destructive, () => DeleteRequested?.Invoke(beatmap.BeatmapSetInfo))); return items.ToArray(); } diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index 4eb6da4f88..6cd47aa9f6 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -249,7 +249,8 @@ namespace osu.Game.Screens.Select if (beatmap == null) { - performLoad(); + if (!Beatmap.IsDefault) + performLoad(); } else { @@ -390,7 +391,7 @@ namespace osu.Game.Screens.Select Beatmap.SetDefault(); } - private void promptDelete(WorkingBeatmap beatmap) + private void promptDelete(BeatmapSetInfo beatmap) { if (beatmap == null) return; @@ -412,7 +413,7 @@ namespace osu.Game.Screens.Select if (state.Keyboard.ShiftPressed) { if (!Beatmap.IsDefault) - promptDelete(Beatmap); + promptDelete(Beatmap.Value.BeatmapSetInfo); return true; } break; From 3b4b4b669bb88d4f3a35d54542399499a771fec9 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 30 Aug 2017 21:12:46 +0900 Subject: [PATCH 35/44] Add framework for deleting difficulties --- osu.Game/Beatmaps/BeatmapManager.cs | 12 +++++++++- osu.Game/Beatmaps/Drawables/BeatmapGroup.cs | 3 +++ osu.Game/Screens/Select/BeatmapCarousel.cs | 5 +++- .../Screens/Select/BeatmapDeleteDialog.cs | 23 ++++++++++++------- osu.Game/Screens/Select/SongSelect.cs | 11 ++++++++- 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/osu.Game/Beatmaps/BeatmapManager.cs b/osu.Game/Beatmaps/BeatmapManager.cs index 1dcab6cb5d..c52576fb9f 100644 --- a/osu.Game/Beatmaps/BeatmapManager.cs +++ b/osu.Game/Beatmaps/BeatmapManager.cs @@ -170,7 +170,7 @@ namespace osu.Game.Beatmaps /// Delete a beatmap from the manager. /// Is a no-op for already deleted beatmaps. /// - /// The beatmap to delete. + /// The beatmap set to delete. public void Delete(BeatmapSetInfo beatmapSet) { lock (beatmaps) @@ -180,6 +180,16 @@ namespace osu.Game.Beatmaps files.Dereference(beatmapSet.Files.Select(f => f.FileInfo).ToArray()); } + /// + /// Delete a beatmap from the manager. + /// Is a no-op for already deleted beatmaps. + /// + /// The beatmap difficulty to delete. + public void Delete(BeatmapInfo beatmap) + { + //todo: implement + } + /// /// Returns a to a usable state if it has previously been deleted but not yet purged. /// Is a no-op for already usable beatmaps. diff --git a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs index a4c7da71d8..b47210620d 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs @@ -25,6 +25,8 @@ namespace osu.Game.Beatmaps.Drawables public Action DeleteRequested; + public Action DeleteDifficultyRequested; + public BeatmapSetHeader Header; private BeatmapGroupState state; @@ -77,6 +79,7 @@ namespace osu.Game.Beatmaps.Drawables { Alpha = 0, GainedSelection = panelGainedSelection, + DeleteRequested = p => DeleteDifficultyRequested?.Invoke(p), StartRequested = p => { StartRequested?.Invoke(p.Beatmap); }, RelativeSizeAxes = Axes.X, }).ToList(); diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 448f5395b6..a1c7f64188 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -140,7 +140,9 @@ namespace osu.Game.Screens.Select public Action StartRequested; - public Action DeleteRequested; + public Action DeleteRequested; + + public Action DeleteDifficultyRequested; public void SelectNext(int direction = 1, bool skipDifficulties = true) { @@ -308,6 +310,7 @@ namespace osu.Game.Screens.Select SelectionChanged = (g, p) => selectGroup(g, p), StartRequested = b => StartRequested?.Invoke(), DeleteRequested = b => DeleteRequested?.Invoke(b), + DeleteDifficultyRequested = b => DeleteDifficultyRequested?.Invoke(b), State = BeatmapGroupState.Collapsed }; } diff --git a/osu.Game/Screens/Select/BeatmapDeleteDialog.cs b/osu.Game/Screens/Select/BeatmapDeleteDialog.cs index 96caf2f236..15ec84a7d8 100644 --- a/osu.Game/Screens/Select/BeatmapDeleteDialog.cs +++ b/osu.Game/Screens/Select/BeatmapDeleteDialog.cs @@ -13,29 +13,36 @@ namespace osu.Game.Screens.Select { private BeatmapManager manager; + private readonly Action deleteAction; + [BackgroundDependencyLoader] private void load(BeatmapManager beatmapManager) { manager = beatmapManager; } - public BeatmapDeleteDialog(WorkingBeatmap beatmap) + public BeatmapDeleteDialog(BeatmapSetInfo beatmap) : this() { - if (beatmap == null) throw new ArgumentNullException(nameof(beatmap)); + BodyText = $@"{beatmap.Metadata?.Artist} - {beatmap.Metadata?.Title} (ALL DIFFICULTIES)"; + deleteAction = () => manager.Delete(beatmap); + } + public BeatmapDeleteDialog(BeatmapInfo beatmap) : this() + { + BodyText = $@"{beatmap.Metadata?.Artist} - {beatmap.Metadata?.Title} [{beatmap.Version}]"; + deleteAction = () => manager.Delete(beatmap); + } + + public BeatmapDeleteDialog() + { Icon = FontAwesome.fa_trash_o; HeaderText = @"Confirm deletion of"; - BodyText = $@"{beatmap.Metadata?.Artist} - {beatmap.Metadata?.Title}"; Buttons = new PopupDialogButton[] { new PopupDialogOkButton { Text = @"Yes. Totally. Delete it.", - Action = () => - { - beatmap.Dispose(); - manager.Delete(beatmap.BeatmapSetInfo); - }, + Action = () => deleteAction(), }, new PopupDialogCancelButton { diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index 6cd47aa9f6..b3ee33e7c6 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -107,6 +107,7 @@ namespace osu.Game.Screens.Select SelectionChanged = carouselSelectionChanged, BeatmapsChanged = carouselBeatmapsLoaded, DeleteRequested = b => promptDelete(b), + DeleteDifficultyRequested = b => promptDelete(b), StartRequested = () => carouselRaisedStart(), }); Add(FilterControl = new FilterControl @@ -164,7 +165,7 @@ namespace osu.Game.Screens.Select Footer.AddButton(@"random", colours.Green, triggerRandom, Key.F2); Footer.AddButton(@"options", colours.Blue, BeatmapOptions.ToggleVisibility, Key.F3); - BeatmapOptions.AddButton(@"Delete", @"Beatmap", FontAwesome.fa_trash, colours.Pink, () => promptDelete(Beatmap), Key.Number4, float.MaxValue); + BeatmapOptions.AddButton(@"Delete", @"Beatmap", FontAwesome.fa_trash, colours.Pink, () => promptDelete(Beatmap.Value.BeatmapSetInfo), Key.Number4, float.MaxValue); } if (manager == null) @@ -399,6 +400,14 @@ namespace osu.Game.Screens.Select dialogOverlay?.Push(new BeatmapDeleteDialog(beatmap)); } + private void promptDelete(BeatmapInfo beatmap) + { + if (beatmap == null) + return; + + dialogOverlay?.Push(new BeatmapDeleteDialog(beatmap)); + } + protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) { if (args.Repeat) return false; From 5a58489adf72eacb03c182b419381d24a6c2a954 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 30 Aug 2017 21:12:58 +0900 Subject: [PATCH 36/44] Hook up play and edit (kinda) --- osu.Game/Beatmaps/Drawables/BeatmapPanel.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs index 235c98b43c..1006380a2b 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs @@ -26,6 +26,7 @@ namespace osu.Game.Beatmaps.Drawables public Action GainedSelection; public Action StartRequested; + public Action EditRequested; public Action DeleteRequested; private readonly Triangles triangles; @@ -155,8 +156,8 @@ namespace osu.Game.Beatmaps.Drawables public MenuItem[] ContextMenuItems => new MenuItem[] { - new OsuMenuItem("Play", MenuItemType.Highlighted), - new OsuMenuItem("Edit"), + new OsuMenuItem("Play", MenuItemType.Highlighted, () => StartRequested?.Invoke(this)), + new OsuMenuItem("Edit", MenuItemType.Standard, () => EditRequested?.Invoke(this)), new OsuMenuItem("Delete", MenuItemType.Destructive, () => DeleteRequested?.Invoke(Beatmap)), }; } From 1f646e6d548a988fba0fbc102a09e02574a35c85 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 31 Aug 2017 15:49:56 +0900 Subject: [PATCH 37/44] Add hiding support for beatmap difficulties --- osu-framework | 2 +- osu.Game/Beatmaps/BeatmapInfo.cs | 2 + osu.Game/Beatmaps/BeatmapManager.cs | 57 ++++++++++++------- osu.Game/Beatmaps/BeatmapStore.cs | 43 +++++++++++++- osu.Game/Beatmaps/Drawables/BeatmapGroup.cs | 5 +- osu.Game/Beatmaps/Drawables/BeatmapPanel.cs | 2 +- .../Beatmaps/Drawables/BeatmapSetHeader.cs | 6 ++ osu.Game/Screens/Select/BeatmapCarousel.cs | 38 +++++++++++-- .../Screens/Select/BeatmapDeleteDialog.cs | 19 +------ osu.Game/Screens/Select/SongSelect.cs | 21 +++---- 10 files changed, 136 insertions(+), 59 deletions(-) diff --git a/osu-framework b/osu-framework index 167d5cda8f..2804e052ca 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 167d5cda8f3ddae702ffc8d8d22dac67e48b509c +Subproject commit 2804e052ca2ce068f015771d28170d18573687e1 diff --git a/osu.Game/Beatmaps/BeatmapInfo.cs b/osu.Game/Beatmaps/BeatmapInfo.cs index ebf77bf9df..c962201fe3 100644 --- a/osu.Game/Beatmaps/BeatmapInfo.cs +++ b/osu.Game/Beatmaps/BeatmapInfo.cs @@ -52,6 +52,8 @@ namespace osu.Game.Beatmaps [JsonProperty("file_sha2")] public string Hash { get; set; } + public bool Hidden { get; set; } + /// /// MD5 is kept for legacy support (matching against replays, osu-web-10 etc.). /// diff --git a/osu.Game/Beatmaps/BeatmapManager.cs b/osu.Game/Beatmaps/BeatmapManager.cs index c52576fb9f..551612330b 100644 --- a/osu.Game/Beatmaps/BeatmapManager.cs +++ b/osu.Game/Beatmaps/BeatmapManager.cs @@ -33,11 +33,21 @@ namespace osu.Game.Beatmaps /// public event Action BeatmapSetAdded; + /// + /// Fired when a single difficulty has been hidden. + /// + public event Action BeatmapHidden; + /// /// Fired when a is removed from the database. /// public event Action BeatmapSetRemoved; + /// + /// Fired when a single difficulty has been restored. + /// + public event Action BeatmapRestored; + /// /// A default representation of a WorkingBeatmap to use when no beatmap is available. /// @@ -71,6 +81,8 @@ namespace osu.Game.Beatmaps beatmaps = new BeatmapStore(connection); beatmaps.BeatmapSetAdded += s => BeatmapSetAdded?.Invoke(s); beatmaps.BeatmapSetRemoved += s => BeatmapSetRemoved?.Invoke(s); + beatmaps.BeatmapHidden += b => BeatmapHidden?.Invoke(b); + beatmaps.BeatmapRestored += b => BeatmapRestored?.Invoke(b); this.storage = storage; this.files = files; @@ -162,8 +174,7 @@ namespace osu.Game.Beatmaps // If we have an ID then we already exist in the database. if (beatmapSetInfo.ID != 0) return; - lock (beatmaps) - beatmaps.Add(beatmapSetInfo); + beatmaps.Add(beatmapSetInfo); } /// @@ -173,22 +184,23 @@ namespace osu.Game.Beatmaps /// The beatmap set to delete. public void Delete(BeatmapSetInfo beatmapSet) { - lock (beatmaps) - if (!beatmaps.Delete(beatmapSet)) return; + if (!beatmaps.Delete(beatmapSet)) return; if (!beatmapSet.Protected) files.Dereference(beatmapSet.Files.Select(f => f.FileInfo).ToArray()); } /// - /// Delete a beatmap from the manager. - /// Is a no-op for already deleted beatmaps. + /// Delete a beatmap difficulty. /// - /// The beatmap difficulty to delete. - public void Delete(BeatmapInfo beatmap) - { - //todo: implement - } + /// The beatmap difficulty to hide. + public void Hide(BeatmapInfo beatmap) => beatmaps.Hide(beatmap); + + /// + /// Restore a beatmap difficulty. + /// + /// The beatmap difficulty to restore. + public void Restore(BeatmapInfo beatmap) => beatmaps.Restore(beatmap); /// /// Returns a to a usable state if it has previously been deleted but not yet purged. @@ -197,8 +209,7 @@ namespace osu.Game.Beatmaps /// The beatmap to restore. public void Undelete(BeatmapSetInfo beatmapSet) { - lock (beatmaps) - if (!beatmaps.Undelete(beatmapSet)) return; + if (!beatmaps.Undelete(beatmapSet)) return; if (!beatmapSet.Protected) files.Reference(beatmapSet.Files.Select(f => f.FileInfo).ToArray()); @@ -258,6 +269,13 @@ namespace osu.Game.Beatmaps } } + /// + /// Refresh an existing instance of a from the store. + /// + /// A stale instance. + /// A fresh instance. + public BeatmapSetInfo Refresh(BeatmapSetInfo beatmapSet) => QueryBeatmapSet(s => s.ID == beatmapSet.ID); + /// /// Perform a lookup query on available s. /// @@ -265,7 +283,7 @@ namespace osu.Game.Beatmaps /// Results from the provided query. public List QueryBeatmapSets(Expression> query) { - lock (beatmaps) return beatmaps.QueryAndPopulate(query); + return beatmaps.QueryAndPopulate(query); } /// @@ -275,15 +293,12 @@ namespace osu.Game.Beatmaps /// The first result for the provided query, or null if no results were found. public BeatmapInfo QueryBeatmap(Func query) { - lock (beatmaps) - { - BeatmapInfo set = beatmaps.Query().FirstOrDefault(query); + BeatmapInfo set = beatmaps.Query().FirstOrDefault(query); - if (set != null) - beatmaps.Populate(set); + if (set != null) + beatmaps.Populate(set); - return set; - } + return set; } /// diff --git a/osu.Game/Beatmaps/BeatmapStore.cs b/osu.Game/Beatmaps/BeatmapStore.cs index 8212712bf9..0f2d8cffa6 100644 --- a/osu.Game/Beatmaps/BeatmapStore.cs +++ b/osu.Game/Beatmaps/BeatmapStore.cs @@ -16,11 +16,14 @@ namespace osu.Game.Beatmaps public event Action BeatmapSetAdded; public event Action BeatmapSetRemoved; + public event Action BeatmapHidden; + public event Action BeatmapRestored; + /// /// The current version of this store. Used for migrations (see ). /// The initial version is 1. /// - protected override int StoreVersion => 3; + protected override int StoreVersion => 4; public BeatmapStore(SQLiteConnection connection) : base(connection) @@ -81,6 +84,10 @@ namespace osu.Game.Beatmaps // Added MD5Hash column to BeatmapInfo Connection.MigrateTable(); break; + case 4: + // Added Hidden column to BeatmapInfo + Connection.MigrateTable(); + break; } } } @@ -100,7 +107,7 @@ namespace osu.Game.Beatmaps } /// - /// Delete a to the database. + /// Delete a from the database. /// /// The beatmap to delete. /// Whether the beatmap's was changed. @@ -131,6 +138,38 @@ namespace osu.Game.Beatmaps return true; } + /// + /// Hide a in the database. + /// + /// The beatmap to hide. + /// Whether the beatmap's was changed. + public bool Hide(BeatmapInfo beatmap) + { + if (beatmap.Hidden) return false; + + beatmap.Hidden = true; + Connection.Update(beatmap); + + BeatmapHidden?.Invoke(beatmap); + return true; + } + + /// + /// Restore a previously hidden . + /// + /// The beatmap to restore. + /// Whether the beatmap's was changed. + public bool Restore(BeatmapInfo beatmap) + { + if (!beatmap.Hidden) return false; + + beatmap.Hidden = false; + Connection.Update(beatmap); + + BeatmapRestored?.Invoke(beatmap); + return true; + } + private void cleanupPendingDeletions() { Connection.RunInTransaction(() => diff --git a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs index b47210620d..19dfc22506 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs @@ -25,6 +25,8 @@ namespace osu.Game.Beatmaps.Drawables public Action DeleteRequested; + public Action RestoreHiddenRequested; + public Action DeleteDifficultyRequested; public BeatmapSetHeader Header; @@ -71,10 +73,11 @@ namespace osu.Game.Beatmaps.Drawables { GainedSelection = headerGainedSelection, DeleteRequested = b => DeleteRequested(b), + RestoreHiddenRequested = b => RestoreHiddenRequested(b), RelativeSizeAxes = Axes.X, }; - BeatmapSet.Beatmaps = BeatmapSet.Beatmaps.OrderBy(b => b.StarDifficulty).ToList(); + BeatmapSet.Beatmaps = BeatmapSet.Beatmaps.Where(b => !b.Hidden).OrderBy(b => b.StarDifficulty).ToList(); BeatmapPanels = BeatmapSet.Beatmaps.Select(b => new BeatmapPanel(b) { Alpha = 0, diff --git a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs index 1006380a2b..6b17b3bb8b 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs @@ -158,7 +158,7 @@ namespace osu.Game.Beatmaps.Drawables { new OsuMenuItem("Play", MenuItemType.Highlighted, () => StartRequested?.Invoke(this)), new OsuMenuItem("Edit", MenuItemType.Standard, () => EditRequested?.Invoke(this)), - new OsuMenuItem("Delete", MenuItemType.Destructive, () => DeleteRequested?.Invoke(Beatmap)), + new OsuMenuItem("Hide", MenuItemType.Destructive, () => DeleteRequested?.Invoke(Beatmap)), }; } } diff --git a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs index b475a23ffd..ee75b77747 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using OpenTK; using OpenTK.Graphics; using osu.Framework.Allocation; @@ -25,6 +26,8 @@ namespace osu.Game.Beatmaps.Drawables public Action DeleteRequested; + public Action RestoreHiddenRequested; + private readonly SpriteText title; private readonly SpriteText artist; @@ -164,6 +167,9 @@ namespace osu.Game.Beatmaps.Drawables if (State == PanelSelectedState.NotSelected) items.Add(new OsuMenuItem("Expand", MenuItemType.Highlighted, () => State = PanelSelectedState.Selected)); + if (beatmap.BeatmapSetInfo.Beatmaps.Any(b => b.Hidden)) + items.Add(new OsuMenuItem("Restore all hidden", MenuItemType.Standard, () => RestoreHiddenRequested?.Invoke(beatmap.BeatmapSetInfo))); + items.Add(new OsuMenuItem("Delete", MenuItemType.Destructive, () => DeleteRequested?.Invoke(beatmap.BeatmapSetInfo))); return items.ToArray(); diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index a1c7f64188..5d495a61f0 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -107,12 +107,39 @@ namespace osu.Game.Screens.Select }); } - public void RemoveBeatmap(BeatmapSetInfo beatmapSet) + public void RemoveBeatmap(BeatmapSetInfo beatmapSet) => removeGroup(groups.Find(b => b.BeatmapSet.ID == beatmapSet.ID)); + + internal void UpdateBeatmap(BeatmapInfo beatmap) { - Schedule(delegate + // todo: this method should not run more than once for the same BeatmapSetInfo. + var set = manager.Refresh(beatmap.BeatmapSet); + + // todo: this method should be smarter as to not recreate panels that haven't changed, etc. + var group = groups.Find(b => b.BeatmapSet.ID == set.ID); + + if (group == null) + return; + + var newGroup = createGroup(set); + + int i = groups.IndexOf(group); + groups.RemoveAt(i); + groups.Insert(i, newGroup); + + if (selectedGroup == group && newGroup.BeatmapPanels.Count == 0) + selectedGroup = null; + + Filter(null, false); + + //check if we can/need to maintain our current selection. + if (selectedGroup == group && newGroup.BeatmapPanels.Count > 0) { - removeGroup(groups.Find(b => b.BeatmapSet.ID == beatmapSet.ID)); - }); + var newSelection = + newGroup.BeatmapPanels.Find(p => p.Beatmap.ID == selectedPanel?.Beatmap.ID) ?? + newGroup.BeatmapPanels[Math.Min(newGroup.BeatmapPanels.Count - 1, group.BeatmapPanels.IndexOf(selectedPanel))]; + + selectGroup(newGroup, newSelection); + } } public void SelectBeatmap(BeatmapInfo beatmap, bool animated = true) @@ -142,6 +169,8 @@ namespace osu.Game.Screens.Select public Action DeleteRequested; + public Action RestoreRequested; + public Action DeleteDifficultyRequested; public void SelectNext(int direction = 1, bool skipDifficulties = true) @@ -310,6 +339,7 @@ namespace osu.Game.Screens.Select SelectionChanged = (g, p) => selectGroup(g, p), StartRequested = b => StartRequested?.Invoke(), DeleteRequested = b => DeleteRequested?.Invoke(b), + RestoreHiddenRequested = s => RestoreRequested?.Invoke(s), DeleteDifficultyRequested = b => DeleteDifficultyRequested?.Invoke(b), State = BeatmapGroupState.Collapsed }; diff --git a/osu.Game/Screens/Select/BeatmapDeleteDialog.cs b/osu.Game/Screens/Select/BeatmapDeleteDialog.cs index 15ec84a7d8..aa37705cdf 100644 --- a/osu.Game/Screens/Select/BeatmapDeleteDialog.cs +++ b/osu.Game/Screens/Select/BeatmapDeleteDialog.cs @@ -1,7 +1,6 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using System; using osu.Framework.Allocation; using osu.Game.Beatmaps; using osu.Game.Graphics; @@ -13,28 +12,16 @@ namespace osu.Game.Screens.Select { private BeatmapManager manager; - private readonly Action deleteAction; - [BackgroundDependencyLoader] private void load(BeatmapManager beatmapManager) { manager = beatmapManager; } - public BeatmapDeleteDialog(BeatmapSetInfo beatmap) : this() + public BeatmapDeleteDialog(BeatmapSetInfo beatmap) { - BodyText = $@"{beatmap.Metadata?.Artist} - {beatmap.Metadata?.Title} (ALL DIFFICULTIES)"; - deleteAction = () => manager.Delete(beatmap); - } + BodyText = $@"{beatmap.Metadata?.Artist} - {beatmap.Metadata?.Title}"; - public BeatmapDeleteDialog(BeatmapInfo beatmap) : this() - { - BodyText = $@"{beatmap.Metadata?.Artist} - {beatmap.Metadata?.Title} [{beatmap.Version}]"; - deleteAction = () => manager.Delete(beatmap); - } - - public BeatmapDeleteDialog() - { Icon = FontAwesome.fa_trash_o; HeaderText = @"Confirm deletion of"; Buttons = new PopupDialogButton[] @@ -42,7 +29,7 @@ namespace osu.Game.Screens.Select new PopupDialogOkButton { Text = @"Yes. Totally. Delete it.", - Action = () => deleteAction(), + Action = () => manager.Delete(beatmap), }, new PopupDialogCancelButton { diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index b3ee33e7c6..b743af5351 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -107,7 +107,8 @@ namespace osu.Game.Screens.Select SelectionChanged = carouselSelectionChanged, BeatmapsChanged = carouselBeatmapsLoaded, DeleteRequested = b => promptDelete(b), - DeleteDifficultyRequested = b => promptDelete(b), + RestoreRequested = s => { foreach (var b in s.Beatmaps) manager.Restore(b); }, + DeleteDifficultyRequested = b => manager.Hide(b), StartRequested = () => carouselRaisedStart(), }); Add(FilterControl = new FilterControl @@ -176,6 +177,8 @@ namespace osu.Game.Screens.Select manager.BeatmapSetAdded += onBeatmapSetAdded; manager.BeatmapSetRemoved += onBeatmapSetRemoved; + manager.BeatmapHidden += onBeatmapHidden; + manager.BeatmapRestored += onBeatmapRestored; dialogOverlay = dialog; @@ -192,6 +195,9 @@ namespace osu.Game.Screens.Select carousel.AllowSelection = !Beatmap.Disabled; } + private void onBeatmapRestored(BeatmapInfo b) => carousel.UpdateBeatmap(b); + private void onBeatmapHidden(BeatmapInfo b) => carousel.UpdateBeatmap(b); + private void carouselBeatmapsLoaded() { if (Beatmap.Value.BeatmapSetInfo?.DeletePending == false) @@ -380,10 +386,7 @@ namespace osu.Game.Screens.Select } } - private void addBeatmapSet(BeatmapSetInfo beatmapSet) - { - carousel.AddBeatmap(beatmapSet); - } + private void addBeatmapSet(BeatmapSetInfo beatmapSet) => carousel.AddBeatmap(beatmapSet); private void removeBeatmapSet(BeatmapSetInfo beatmapSet) { @@ -400,14 +403,6 @@ namespace osu.Game.Screens.Select dialogOverlay?.Push(new BeatmapDeleteDialog(beatmap)); } - private void promptDelete(BeatmapInfo beatmap) - { - if (beatmap == null) - return; - - dialogOverlay?.Push(new BeatmapDeleteDialog(beatmap)); - } - protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) { if (args.Repeat) return false; From f9d02afb007870f8bf9d778f99fd4de9d047af46 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 1 Sep 2017 18:13:21 +0900 Subject: [PATCH 38/44] Don't allow selection of a hidden beatmap --- osu.Game/Screens/Select/BeatmapCarousel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 5d495a61f0..8cdfcf1db0 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -144,7 +144,7 @@ namespace osu.Game.Screens.Select public void SelectBeatmap(BeatmapInfo beatmap, bool animated = true) { - if (beatmap == null) + if (beatmap == null || beatmap.Hidden) { SelectNext(); return; From 3d61cde266f3aac7149e9f18893bff6a8ecfd211 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 1 Sep 2017 18:22:38 +0900 Subject: [PATCH 39/44] Correctly delay loading of PlaySongSelect-specific components --- osu.Game/Screens/Select/PlaySongSelect.cs | 6 ++---- osu.Game/Screens/Select/SongSelect.cs | 11 ++++++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index 662e1d55a2..7e03707d18 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -54,13 +54,11 @@ namespace osu.Game.Screens.Select ValidForResume = false; Push(new Editor()); }, Key.Number3); - - Beatmap.ValueChanged += beatmap_ValueChanged; } - private void beatmap_ValueChanged(WorkingBeatmap beatmap) + protected override void UpdateBeatmap(WorkingBeatmap beatmap) { - if (!IsCurrentScreen) return; + base.UpdateBeatmap(beatmap); beatmap.Mods.BindTo(modSelect.SelectedMods); diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index b743af5351..e0e27e069d 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -244,7 +244,7 @@ namespace osu.Game.Screens.Select ensurePlayingSelected(preview); } - changeBackground(Beatmap.Value); + UpdateBeatmap(Beatmap.Value); }; selectionChangedDebounce?.Cancel(); @@ -312,7 +312,7 @@ namespace osu.Game.Screens.Select { if (Beatmap != null && !Beatmap.Value.BeatmapSetInfo.DeletePending) { - changeBackground(Beatmap); + UpdateBeatmap(Beatmap); ensurePlayingSelected(); } @@ -358,7 +358,12 @@ namespace osu.Game.Screens.Select initialAddSetsTask?.Cancel(); } - private void changeBackground(WorkingBeatmap beatmap) + /// + /// Allow components in SongSelect to update their loaded beatmap details. + /// This is a debounced call (unlike directly binding to WorkingBeatmap.ValueChanged). + /// + /// The working beatmap. + protected virtual void UpdateBeatmap(WorkingBeatmap beatmap) { var backgroundModeBeatmap = Background as BackgroundScreenBeatmap; if (backgroundModeBeatmap != null) From 8e0d18d36f73ddca1d66ef44e3707f900e6c0d8d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 1 Sep 2017 18:26:01 +0900 Subject: [PATCH 40/44] Add a button to restore all hidden difficulties --- .../Sections/Maintenance/GeneralSettings.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/osu.Game/Overlays/Settings/Sections/Maintenance/GeneralSettings.cs b/osu.Game/Overlays/Settings/Sections/Maintenance/GeneralSettings.cs index 9d13a2ae2f..233ca7be60 100644 --- a/osu.Game/Overlays/Settings/Sections/Maintenance/GeneralSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/Maintenance/GeneralSettings.cs @@ -13,6 +13,7 @@ namespace osu.Game.Overlays.Settings.Sections.Maintenance { private OsuButton importButton; private OsuButton deleteButton; + private OsuButton restoreButton; protected override string Header => "General"; @@ -41,6 +42,20 @@ namespace osu.Game.Overlays.Settings.Sections.Maintenance Task.Run(() => beatmaps.DeleteAll()).ContinueWith(t => Schedule(() => deleteButton.Enabled.Value = true)); } }, + restoreButton = new OsuButton + { + RelativeSizeAxes = Axes.X, + Text = "Restore all hidden difficulties", + Action = () => + { + restoreButton.Enabled.Value = false; + Task.Run(() => + { + foreach (var b in beatmaps.QueryBeatmaps(b => b.Hidden)) + beatmaps.Restore(b); + }).ContinueWith(t => Schedule(() => restoreButton.Enabled.Value = true)); + } + }, }; } } From b19ae7c44ed3c9df5d1fb7200c11a53d59b84651 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 1 Sep 2017 18:37:46 +0900 Subject: [PATCH 41/44] Update framework --- osu-framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu-framework b/osu-framework index 2804e052ca..2bd341b29d 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 2804e052ca2ce068f015771d28170d18573687e1 +Subproject commit 2bd341b29d6a7ed864aa9c1c5fad4668dafe03a4 From 3ede685ee9985065c079e2099dd2cf0a4706bb2a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 1 Sep 2017 18:44:51 +0900 Subject: [PATCH 42/44] Fix crash on random selection from a previously null selection --- osu.Game/Screens/Select/BeatmapCarousel.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 264636b258..556ba68e95 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -191,7 +191,8 @@ namespace osu.Game.Screens.Select if (!visibleGroups.Any()) return; - randomSelectedBeatmaps.Push(new KeyValuePair(selectedGroup, selectedGroup.SelectedPanel)); + if (selectedGroup != null) + randomSelectedBeatmaps.Push(new KeyValuePair(selectedGroup, selectedGroup.SelectedPanel)); BeatmapGroup group; From dd26c80837edb47bb5287c740e1d67b3e5338cb7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 4 Sep 2017 07:59:32 +0900 Subject: [PATCH 43/44] Delete -> Hide --- osu.Game/Beatmaps/Drawables/BeatmapGroup.cs | 4 ++-- osu.Game/Beatmaps/Drawables/BeatmapPanel.cs | 4 ++-- osu.Game/Screens/Select/BeatmapCarousel.cs | 4 ++-- osu.Game/Screens/Select/SongSelect.cs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs index 19dfc22506..4a389101e2 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapGroup.cs @@ -27,7 +27,7 @@ namespace osu.Game.Beatmaps.Drawables public Action RestoreHiddenRequested; - public Action DeleteDifficultyRequested; + public Action HideDifficultyRequested; public BeatmapSetHeader Header; @@ -82,7 +82,7 @@ namespace osu.Game.Beatmaps.Drawables { Alpha = 0, GainedSelection = panelGainedSelection, - DeleteRequested = p => DeleteDifficultyRequested?.Invoke(p), + HideRequested = p => HideDifficultyRequested?.Invoke(p), StartRequested = p => { StartRequested?.Invoke(p.Beatmap); }, RelativeSizeAxes = Axes.X, }).ToList(); diff --git a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs index 6b17b3bb8b..e216f1b83e 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs @@ -27,7 +27,7 @@ namespace osu.Game.Beatmaps.Drawables public Action GainedSelection; public Action StartRequested; public Action EditRequested; - public Action DeleteRequested; + public Action HideRequested; private readonly Triangles triangles; private readonly StarCounter starCounter; @@ -158,7 +158,7 @@ namespace osu.Game.Beatmaps.Drawables { new OsuMenuItem("Play", MenuItemType.Highlighted, () => StartRequested?.Invoke(this)), new OsuMenuItem("Edit", MenuItemType.Standard, () => EditRequested?.Invoke(this)), - new OsuMenuItem("Hide", MenuItemType.Destructive, () => DeleteRequested?.Invoke(Beatmap)), + new OsuMenuItem("Hide", MenuItemType.Destructive, () => HideRequested?.Invoke(Beatmap)), }; } } diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 7044447508..94ae740c74 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -171,7 +171,7 @@ namespace osu.Game.Screens.Select public Action RestoreRequested; - public Action DeleteDifficultyRequested; + public Action HideDifficultyRequested; public void SelectNext(int direction = 1, bool skipDifficulties = true) { @@ -341,7 +341,7 @@ namespace osu.Game.Screens.Select StartRequested = b => StartRequested?.Invoke(), DeleteRequested = b => DeleteRequested?.Invoke(b), RestoreHiddenRequested = s => RestoreRequested?.Invoke(s), - DeleteDifficultyRequested = b => DeleteDifficultyRequested?.Invoke(b), + HideDifficultyRequested = b => HideDifficultyRequested?.Invoke(b), State = BeatmapGroupState.Collapsed }; } diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index e0e27e069d..8925732128 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -108,7 +108,7 @@ namespace osu.Game.Screens.Select BeatmapsChanged = carouselBeatmapsLoaded, DeleteRequested = b => promptDelete(b), RestoreRequested = s => { foreach (var b in s.Beatmaps) manager.Restore(b); }, - DeleteDifficultyRequested = b => manager.Hide(b), + HideDifficultyRequested = b => manager.Hide(b), StartRequested = () => carouselRaisedStart(), }); Add(FilterControl = new FilterControl From 543a71efcc7a8dfff9c5c40d5f99bef42509e0b8 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 4 Sep 2017 08:21:07 +0900 Subject: [PATCH 44/44] Fix ObjectDisposal exceptions due to lingering event binds --- osu.Game/Screens/Select/SongSelect.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index 8925732128..f97c4fe420 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -353,6 +353,8 @@ namespace osu.Game.Screens.Select { manager.BeatmapSetAdded -= onBeatmapSetAdded; manager.BeatmapSetRemoved -= onBeatmapSetRemoved; + manager.BeatmapHidden -= onBeatmapHidden; + manager.BeatmapRestored -= onBeatmapRestored; } initialAddSetsTask?.Cancel();