mirror of
https://github.com/ppy/osu.git
synced 2025-02-15 21:42:55 +08:00
Refactor Ruleset Selector in osu!direct (#5214)
Refactor Ruleset Selector in osu!direct Co-authored-by: Dean Herbert <pe@ppy.sh>
This commit is contained in:
commit
f358b69b8e
@ -3,10 +3,8 @@
|
|||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Framework.Allocation;
|
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Game.Rulesets;
|
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.Online
|
namespace osu.Game.Tests.Visual.Online
|
||||||
{
|
{
|
||||||
@ -14,7 +12,6 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
public class TestSceneDirectOverlay : OsuTestScene
|
public class TestSceneDirectOverlay : OsuTestScene
|
||||||
{
|
{
|
||||||
private DirectOverlay direct;
|
private DirectOverlay direct;
|
||||||
private RulesetStore rulesets;
|
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
{
|
{
|
||||||
@ -25,18 +22,11 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
|
|
||||||
AddStep(@"toggle", direct.ToggleVisibility);
|
AddStep(@"toggle", direct.ToggleVisibility);
|
||||||
AddStep(@"result counts", () => direct.ResultAmounts = new DirectOverlay.ResultCounts(1, 4, 13));
|
AddStep(@"result counts", () => direct.ResultAmounts = new DirectOverlay.ResultCounts(1, 4, 13));
|
||||||
}
|
AddStep(@"trigger disabled", () => Ruleset.Disabled = !Ruleset.Disabled);
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(RulesetStore rulesets)
|
|
||||||
{
|
|
||||||
this.rulesets = rulesets;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void newBeatmaps()
|
private void newBeatmaps()
|
||||||
{
|
{
|
||||||
var ruleset = rulesets.GetRuleset(0);
|
|
||||||
|
|
||||||
direct.BeatmapSets = new[]
|
direct.BeatmapSets = new[]
|
||||||
{
|
{
|
||||||
new BeatmapSetInfo
|
new BeatmapSetInfo
|
||||||
@ -65,7 +55,7 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
{
|
{
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 5.35f,
|
StarDifficulty = 5.35f,
|
||||||
Metadata = new BeatmapMetadata(),
|
Metadata = new BeatmapMetadata(),
|
||||||
},
|
},
|
||||||
@ -97,7 +87,7 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
{
|
{
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 5.81f,
|
StarDifficulty = 5.81f,
|
||||||
Metadata = new BeatmapMetadata(),
|
Metadata = new BeatmapMetadata(),
|
||||||
},
|
},
|
||||||
@ -129,23 +119,23 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
{
|
{
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 0.9f,
|
StarDifficulty = 0.9f,
|
||||||
Metadata = new BeatmapMetadata(),
|
Metadata = new BeatmapMetadata(),
|
||||||
},
|
},
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 1.1f,
|
StarDifficulty = 1.1f,
|
||||||
},
|
},
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 2.02f,
|
StarDifficulty = 2.02f,
|
||||||
},
|
},
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 3.49f,
|
StarDifficulty = 3.49f,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -176,43 +166,43 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
{
|
{
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 1.26f,
|
StarDifficulty = 1.26f,
|
||||||
Metadata = new BeatmapMetadata(),
|
Metadata = new BeatmapMetadata(),
|
||||||
},
|
},
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 2.01f,
|
StarDifficulty = 2.01f,
|
||||||
},
|
},
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 2.87f,
|
StarDifficulty = 2.87f,
|
||||||
},
|
},
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 3.76f,
|
StarDifficulty = 3.76f,
|
||||||
},
|
},
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 3.93f,
|
StarDifficulty = 3.93f,
|
||||||
},
|
},
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 4.37f,
|
StarDifficulty = 4.37f,
|
||||||
},
|
},
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 5.13f,
|
StarDifficulty = 5.13f,
|
||||||
},
|
},
|
||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = Ruleset.Value,
|
||||||
StarDifficulty = 5.42f,
|
StarDifficulty = 5.42f,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
88
osu.Game/Overlays/Direct/DirectRulesetSelector.cs
Normal file
88
osu.Game/Overlays/Direct/DirectRulesetSelector.cs
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Graphics.UserInterface;
|
||||||
|
using osu.Framework.Input.Events;
|
||||||
|
using osu.Game.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Rulesets;
|
||||||
|
using osuTK;
|
||||||
|
using osuTK.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Overlays.Direct
|
||||||
|
{
|
||||||
|
public class DirectRulesetSelector : RulesetSelector
|
||||||
|
{
|
||||||
|
public override bool HandleNonPositionalInput => !Current.Disabled && base.HandleNonPositionalInput;
|
||||||
|
|
||||||
|
public override bool HandlePositionalInput => !Current.Disabled && base.HandlePositionalInput;
|
||||||
|
|
||||||
|
public override bool PropagatePositionalInputSubTree => !Current.Disabled && base.PropagatePositionalInputSubTree;
|
||||||
|
|
||||||
|
public DirectRulesetSelector()
|
||||||
|
{
|
||||||
|
TabContainer.Masking = false;
|
||||||
|
TabContainer.Spacing = new Vector2(10, 0);
|
||||||
|
AutoSizeAxes = Axes.Both;
|
||||||
|
|
||||||
|
Current.DisabledChanged += value => SelectedTab.FadeColour(value ? Color4.DarkGray : Color4.White, 200, Easing.OutQuint);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override TabItem<RulesetInfo> CreateTabItem(RulesetInfo value) => new DirectRulesetTabItem(value);
|
||||||
|
|
||||||
|
protected override TabFillFlowContainer CreateTabFlow() => new TabFillFlowContainer
|
||||||
|
{
|
||||||
|
Direction = FillDirection.Horizontal,
|
||||||
|
AutoSizeAxes = Axes.Both,
|
||||||
|
};
|
||||||
|
|
||||||
|
private class DirectRulesetTabItem : TabItem<RulesetInfo>
|
||||||
|
{
|
||||||
|
private readonly ConstrainedIconContainer iconContainer;
|
||||||
|
|
||||||
|
public DirectRulesetTabItem(RulesetInfo value)
|
||||||
|
: base(value)
|
||||||
|
{
|
||||||
|
AutoSizeAxes = Axes.Both;
|
||||||
|
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
iconContainer = new ConstrainedIconContainer
|
||||||
|
{
|
||||||
|
Icon = value.CreateInstance().CreateIcon(),
|
||||||
|
Size = new Vector2(32),
|
||||||
|
},
|
||||||
|
new HoverClickSounds()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool OnHover(HoverEvent e)
|
||||||
|
{
|
||||||
|
base.OnHover(e);
|
||||||
|
updateState();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnHoverLost(HoverLostEvent e)
|
||||||
|
{
|
||||||
|
base.OnHoverLost(e);
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnActivated() => updateState();
|
||||||
|
|
||||||
|
protected override void OnDeactivated() => updateState();
|
||||||
|
|
||||||
|
private void updateState() => iconContainer.FadeColour(IsHovered || Active.Value ? Color4.White : Color4.Gray, 120, Easing.InQuad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4,105 +4,30 @@
|
|||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Containers;
|
|
||||||
using osu.Game.Online.API.Requests;
|
using osu.Game.Online.API.Requests;
|
||||||
using osu.Game.Overlays.SearchableList;
|
using osu.Game.Overlays.SearchableList;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osuTK;
|
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Direct
|
namespace osu.Game.Overlays.Direct
|
||||||
{
|
{
|
||||||
public class FilterControl : SearchableListFilterControl<DirectSortCriteria, BeatmapSearchCategory>
|
public class FilterControl : SearchableListFilterControl<DirectSortCriteria, BeatmapSearchCategory>
|
||||||
{
|
{
|
||||||
public readonly Bindable<RulesetInfo> Ruleset = new Bindable<RulesetInfo>();
|
private DirectRulesetSelector rulesetSelector;
|
||||||
private FillFlowContainer<RulesetToggleButton> modeButtons;
|
|
||||||
|
|
||||||
protected override Color4 BackgroundColour => OsuColour.FromHex(@"384552");
|
protected override Color4 BackgroundColour => OsuColour.FromHex(@"384552");
|
||||||
protected override DirectSortCriteria DefaultTab => DirectSortCriteria.Ranked;
|
protected override DirectSortCriteria DefaultTab => DirectSortCriteria.Ranked;
|
||||||
|
|
||||||
protected override Drawable CreateSupplementaryControls()
|
protected override Drawable CreateSupplementaryControls() => rulesetSelector = new DirectRulesetSelector();
|
||||||
{
|
|
||||||
modeButtons = new FillFlowContainer<RulesetToggleButton>
|
|
||||||
{
|
|
||||||
AutoSizeAxes = Axes.Both,
|
|
||||||
Spacing = new Vector2(10f, 0f),
|
|
||||||
};
|
|
||||||
|
|
||||||
return modeButtons;
|
public Bindable<RulesetInfo> Ruleset => rulesetSelector.Current;
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader(true)]
|
[BackgroundDependencyLoader(true)]
|
||||||
private void load(RulesetStore rulesets, OsuColour colours, Bindable<RulesetInfo> ruleset)
|
private void load(OsuColour colours, Bindable<RulesetInfo> ruleset)
|
||||||
{
|
{
|
||||||
DisplayStyleControl.Dropdown.AccentColour = colours.BlueDark;
|
DisplayStyleControl.Dropdown.AccentColour = colours.BlueDark;
|
||||||
|
rulesetSelector.Current.BindTo(ruleset);
|
||||||
Ruleset.Value = ruleset.Value ?? rulesets.GetRuleset(0);
|
|
||||||
foreach (var r in rulesets.AvailableRulesets)
|
|
||||||
modeButtons.Add(new RulesetToggleButton(Ruleset, r));
|
|
||||||
}
|
|
||||||
|
|
||||||
private class RulesetToggleButton : OsuClickableContainer
|
|
||||||
{
|
|
||||||
private Drawable icon
|
|
||||||
{
|
|
||||||
get => iconContainer.Icon;
|
|
||||||
set => iconContainer.Icon = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private RulesetInfo ruleset;
|
|
||||||
|
|
||||||
public RulesetInfo Ruleset
|
|
||||||
{
|
|
||||||
get => ruleset;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
ruleset = value;
|
|
||||||
icon = Ruleset.CreateInstance().CreateIcon();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private readonly Bindable<RulesetInfo> bindable;
|
|
||||||
|
|
||||||
private readonly ConstrainedIconContainer iconContainer;
|
|
||||||
|
|
||||||
private void Bindable_ValueChanged(ValueChangedEvent<RulesetInfo> e)
|
|
||||||
{
|
|
||||||
iconContainer.FadeTo(Ruleset.ID == e.NewValue?.ID ? 1f : 0.5f, 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool HandleNonPositionalInput => !bindable.Disabled && base.HandleNonPositionalInput;
|
|
||||||
public override bool HandlePositionalInput => !bindable.Disabled && base.HandlePositionalInput;
|
|
||||||
|
|
||||||
public RulesetToggleButton(Bindable<RulesetInfo> bindable, RulesetInfo ruleset)
|
|
||||||
{
|
|
||||||
this.bindable = bindable;
|
|
||||||
AutoSizeAxes = Axes.Both;
|
|
||||||
|
|
||||||
Children = new[]
|
|
||||||
{
|
|
||||||
iconContainer = new ConstrainedIconContainer
|
|
||||||
{
|
|
||||||
Origin = Anchor.TopLeft,
|
|
||||||
Anchor = Anchor.TopLeft,
|
|
||||||
Size = new Vector2(32),
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Ruleset = ruleset;
|
|
||||||
bindable.ValueChanged += Bindable_ValueChanged;
|
|
||||||
Bindable_ValueChanged(new ValueChangedEvent<RulesetInfo>(bindable.Value, bindable.Value));
|
|
||||||
Action = () => bindable.Value = Ruleset;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Dispose(bool isDisposing)
|
|
||||||
{
|
|
||||||
if (bindable != null)
|
|
||||||
bindable.ValueChanged -= Bindable_ValueChanged;
|
|
||||||
base.Dispose(isDisposing);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user