Add web-like hover behavior

This commit is contained in:
Andrei Zavatski 2019-08-12 16:20:36 +03:00
parent 62a91e4aaa
commit b71c776e65
2 changed files with 36 additions and 5 deletions

View File

@ -57,12 +57,13 @@ namespace osu.Game.Overlays.BeatmapSet
modsContainer.Add(new ModButton(new NoMod())); modsContainer.Add(new ModButton(new NoMod()));
foreach (var mod in ruleset.NewValue.CreateInstance().GetAllMods()) ruleset.NewValue.CreateInstance().GetAllMods().ForEach(mod =>
{
if (mod.Ranked) if (mod.Ranked)
modsContainer.Add(new ModButton(mod)); modsContainer.Add(new ModButton(mod));
});
foreach (var mod in modsContainer) modsContainer.ForEach(button => button.OnSelectionChanged += selectionChanged);
mod.OnSelectionChanged += selectionChanged;
} }
private void selectionChanged(Mod mod, bool selected) private void selectionChanged(Mod mod, bool selected)
@ -74,11 +75,39 @@ namespace osu.Game.Overlays.BeatmapSet
else else
mods.Remove(mod); mods.Remove(mod);
if (!mods.Any() && !IsHovered)
modsContainer.ForEach(button => button.Highlighted.Value = true);
SelectedMods.Value = mods; SelectedMods.Value = mods;
} }
protected override bool OnHover(HoverEvent e)
{
if (!SelectedMods.Value.Any())
dehighlightAll();
return base.OnHover(e);
}
protected override void OnHoverLost(HoverLostEvent e)
{
base.OnHoverLost(e);
if (!SelectedMods.Value.Any())
modsContainer.ForEach(mod => mod.Highlighted.Value = true);
}
public void DeselectAll() => modsContainer.ForEach(mod => mod.Selected.Value = false); public void DeselectAll() => modsContainer.ForEach(mod => mod.Selected.Value = false);
private void dehighlightAll()
{
modsContainer.ForEach(button =>
{
if (!button.IsHovered)
button.Highlighted.Value = false;
});
}
private class ModButton : ModIcon private class ModButton : ModIcon
{ {
private const float mod_scale = 0.4f; private const float mod_scale = 0.4f;
@ -98,11 +127,13 @@ namespace osu.Game.Overlays.BeatmapSet
{ {
base.LoadComplete(); base.LoadComplete();
Highlighted.Value = true;
Selected.BindValueChanged(selected => Selected.BindValueChanged(selected =>
{ {
updateState(); updateState();
OnSelectionChanged?.Invoke(Mod, selected.NewValue); OnSelectionChanged?.Invoke(Mod, selected.NewValue);
}, true); });
} }
protected override bool OnClick(ClickEvent e) protected override bool OnClick(ClickEvent e)

View File

@ -115,7 +115,7 @@ namespace osu.Game.Rulesets.UI
protected override void LoadComplete() protected override void LoadComplete()
{ {
base.LoadComplete(); base.LoadComplete();
Highlighted.BindValueChanged(OnHighlightedChange, true); Highlighted.BindValueChanged(OnHighlightedChange);
} }
protected virtual void OnHighlightedChange(ValueChangedEvent<bool> highlighted) protected virtual void OnHighlightedChange(ValueChangedEvent<bool> highlighted)