diff --git a/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsListPiece.cs b/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsListPiece.cs index 0b93780..24c7077 100644 --- a/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsListPiece.cs +++ b/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsListPiece.cs @@ -19,7 +19,9 @@ public partial class SettingsListPiece : SettingsPieceBasePanel, ISettingsIte private readonly CurrentValueText valueText = new CurrentValueText { - RelativeSizeAxes = Axes.X + RelativeSizeAxes = Axes.X, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, }; public List Values { get; set; } @@ -83,7 +85,9 @@ public LocalisableString Text Alpha = 0, Font = OsuFont.GetFont(size: 20), Y = -5, - RelativeSizeAxes = Axes.X + RelativeSizeAxes = Axes.X, + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, }; Schedule(() => AddInternal(currentText)); diff --git a/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsPieceBasePanel.cs b/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsPieceBasePanel.cs index c47da44..6bf0213 100644 --- a/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsPieceBasePanel.cs +++ b/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsPieceBasePanel.cs @@ -31,6 +31,8 @@ public partial class SettingsPieceBasePanel : CompositeDrawable Size = new Vector2(25) }; + protected GridContainer FirstLineGrid { get; private set; } + public virtual LocalisableString Description { get => description; @@ -91,14 +93,6 @@ private void load(AudioManager audio) RelativeSizeAxes = Axes.Both, Depth = float.MaxValue }, - new Container - { - RelativeSizeAxes = Axes.X, - Height = 25, - Margin = new MarginPadding { Top = 10 }, - Padding = new MarginPadding { Left = 10 + 25 + 5 }, - Child = CreateSideDrawable() - }, FillFlow = new FillFlowContainer { AutoSizeAxes = Axes.Y, @@ -108,7 +102,33 @@ private void load(AudioManager audio) Spacing = new Vector2(5), Children = new Drawable[] { - SpriteIcon, + FirstLineGrid = new GridContainer + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + RowDimensions = [new Dimension(GridSizeMode.AutoSize)], + ColumnDimensions = + [ + new Dimension(GridSizeMode.AutoSize), + new Dimension(), + ], + Content = new[] + { + new Drawable[] + { + SpriteIcon, + CreateSideDrawable().With(d => + { + d.Anchor = Anchor.CentreLeft; + d.Origin = Anchor.CentreLeft; + d.Margin = new MarginPadding + { + Horizontal = 5, + }; + }), + }, + }, + }, SpriteText, } }, diff --git a/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSeparatorPiece.cs b/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSeparatorPiece.cs index b2c6406..4943f58 100644 --- a/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSeparatorPiece.cs +++ b/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSeparatorPiece.cs @@ -21,10 +21,10 @@ private void load() RelativeSizeAxes = Axes.X; Width = 1; - SpriteText.Anchor = SpriteText.Origin = SpriteIcon.Anchor = SpriteIcon.Origin = Anchor.BottomRight; + SpriteText.Anchor = SpriteText.Origin = FirstLineGrid.Anchor = FirstLineGrid.Origin = Anchor.BottomRight; FillFlow.Direction = FillDirection.Horizontal; - SpriteIcon.Hide(); + FirstLineGrid.Hide(); } protected override void OnColorChanged() diff --git a/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSlider.cs b/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSlider.cs index 23fcb2b..8e38857 100644 --- a/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSlider.cs +++ b/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSlider.cs @@ -3,6 +3,7 @@ using System; using System.Numerics; using osu.Framework.Allocation; +using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; @@ -14,35 +15,73 @@ namespace osu.Game.Rulesets.Hikariii.Features.Player.Graphics.SideBar.Settings.I public partial class SettingsSlider : OsuSliderBar where T : struct, INumber, IMinMaxValue, IConvertible { + /// + /// Controls whether to show a hint line below the slider body. + /// + public readonly BindableBool HintActive = new BindableBool(); + + private Circle baseLine; private Container circle; [BackgroundDependencyLoader] private void load() { Height = 1; - Child = circle = new Container + + Children = new Drawable[] { - RelativePositionAxes = Axes.X, - Size = new Vector2(25), - Anchor = Anchor.CentreLeft, - Origin = Anchor.CentreLeft, - Child = new Circle + baseLine = new Circle { Anchor = Anchor.Centre, Origin = Anchor.Centre, - RelativeSizeAxes = Axes.Both, + RelativeSizeAxes = Axes.X, + Height = 2, + Alpha = 0, + }, + circle = new Container + { RelativePositionAxes = Axes.X, - X = -0.5f + Size = new Vector2(25), + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + Child = new Circle + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + RelativeSizeAxes = Axes.Both, + RelativePositionAxes = Axes.X, + X = -0.5f + } } }; RangePadding = 0; } + protected override void LoadComplete() + { + base.LoadComplete(); + HintActive.BindValueChanged(onLineStatusChanged); + } + + private void onLineStatusChanged(ValueChangedEvent e) + { + if (e.NewValue) + { + baseLine.ResizeHeightTo(4, 250, Easing.OutExpo); + baseLine.FadeTo(0.8f, 250, Easing.OutExpo); + } + else + { + baseLine.ResizeHeightTo(2, 250, Easing.OutExpo); + baseLine.FadeOut(250, Easing.OutExpo); + } + } + protected override void UpdateValue(float value) { circle.MoveToX(value, 250, Easing.OutExpo); - circle.ScaleTo(value + 0.2f, 250, Easing.OutBack); + circle.ScaleTo(value * 0.75f + 0.25f, 250, Easing.OutBack); } } } diff --git a/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSliderPiece.cs b/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSliderPiece.cs index 3f140a7..b878c0a 100644 --- a/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSliderPiece.cs +++ b/osu.Game.Rulesets.Hikariii/Features/Player/Graphics/SideBar/Settings/Items/SettingsSliderPiece.cs @@ -2,9 +2,11 @@ using System; using System.Numerics; +using JetBrains.Annotations; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Sprites; +using osu.Framework.Input.Events; using osu.Framework.Localisation; namespace osu.Game.Rulesets.Hikariii.Features.Player.Graphics.SideBar.Settings.Items @@ -27,7 +29,7 @@ public LocalisableString TooltipText protected override IconUsage DefaultIcon => FontAwesome.Solid.SlidersH; - protected override Drawable CreateSideDrawable() => new SettingsSlider + protected override Drawable CreateSideDrawable() => slider = new SettingsSlider { RelativeSizeAxes = Axes.Both, Current = Bindable, @@ -35,9 +37,28 @@ public LocalisableString TooltipText TransferValueOnCommit = TransferValueOnCommit, }; + [CanBeNull] + private SettingsSlider slider; + protected override void OnMiddleClick() { Bindable.Value = Bindable.Default; } + + protected override bool OnHover(HoverEvent e) + { + if (slider != null) + slider.HintActive.Value = true; + + return base.OnHover(e); + } + + protected override void OnHoverLost(HoverLostEvent e) + { + if (slider != null) + slider.HintActive.Value = false; + + base.OnHoverLost(e); + } } }