diff --git a/osu.Game/Overlays/Options/DropdownOption.cs b/osu.Game/Overlays/Options/DropdownOption.cs index 567e2821ab..0ba9811d35 100644 --- a/osu.Game/Overlays/Options/DropdownOption.cs +++ b/osu.Game/Overlays/Options/DropdownOption.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using System.Linq; using System.Reflection; +using OpenTK; using OpenTK.Graphics; using osu.Framework.Configuration; using osu.Framework.Graphics; @@ -61,13 +62,92 @@ public DropdownOption() Children = new Drawable[] { text = new SpriteText { Alpha = 0 }, - dropdown = new DropDownMenu + dropdown = new StyledDropDownMenu { Margin = new MarginPadding { Top = 5 }, RelativeSizeAxes = Axes.X, - Items = items.Select(item => new DropDownMenuItem(item.Item1, item.Item2)) + Items = items.Select(item => new StyledDropDownMenuItem(item.Item1, item.Item2)) } }; } + + private class StyledDropDownMenu : DropDownMenu + { + protected override float DropDownListSpacing => 4; + + protected override DropDownComboBox CreateComboBox() + { + return new StyledDropDownComboBox(); + } + + public StyledDropDownMenu() + { + ComboBox.CornerRadius = 4; + DropDown.CornerRadius = 4; + } + + protected override void AnimateOpen() + { + foreach (StyledDropDownMenuItem child in DropDownList.Children) + { + child.FadeIn(200); + child.ResizeTo(new Vector2(1, 24), 200); + } + DropDown.Show(); + } + + protected override void AnimateClose() + { + foreach (StyledDropDownMenuItem child in DropDownList.Children) + { + child.ResizeTo(new Vector2(1, 0), 200); + child.FadeOut(200); + } + } + } + + private class StyledDropDownComboBox : DropDownComboBox + { + protected override Color4 BackgroundColour => new Color4(255, 255, 255, 100); + protected override Color4 BackgroundColourHover => Color4.HotPink; + + public StyledDropDownComboBox() + { + Foreground.Padding = new MarginPadding(4); + } + } + + private class StyledDropDownMenuItem : DropDownMenuItem + { + public StyledDropDownMenuItem(string text, U value) : base(text, value) + { + AutoSizeAxes = Axes.None; + Height = 0; + Foreground.Padding = new MarginPadding(2); + } + + protected override void OnSelectChange() + { + if (!IsLoaded) + return; + + FormatBackground(); + FormatCaret(); + FormatLabel(); + } + + protected override void FormatCaret() + { + (Caret as SpriteText).Text = IsSelected ? @"+" : @"-"; + } + + protected override void FormatLabel() + { + if (IsSelected) + (Label as SpriteText).Text = @"*" + Value + @"*"; + else + (Label as SpriteText).Text = Value.ToString(); + } + } } }