mirror of
https://github.com/ppy/osu.git
synced 2024-11-11 16:27:26 +08:00
Add extension points required for replacing old mod overlay
This commit is contained in:
parent
f37444938f
commit
67c44db8d5
@ -54,6 +54,8 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
public Bindable<IReadOnlyList<Mod>> SelectedMods = new Bindable<IReadOnlyList<Mod>>(Array.Empty<Mod>());
|
public Bindable<IReadOnlyList<Mod>> SelectedMods = new Bindable<IReadOnlyList<Mod>>(Array.Empty<Mod>());
|
||||||
|
|
||||||
|
protected virtual ModPanel CreateModPanel(Mod mod) => new ModPanel(mod);
|
||||||
|
|
||||||
private readonly Key[]? toggleKeys;
|
private readonly Key[]? toggleKeys;
|
||||||
|
|
||||||
private readonly Bindable<Dictionary<ModType, IReadOnlyList<Mod>>> availableMods = new Bindable<Dictionary<ModType, IReadOnlyList<Mod>>>();
|
private readonly Bindable<Dictionary<ModType, IReadOnlyList<Mod>>> availableMods = new Bindable<Dictionary<ModType, IReadOnlyList<Mod>>>();
|
||||||
@ -258,10 +260,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
cancellationTokenSource?.Cancel();
|
cancellationTokenSource?.Cancel();
|
||||||
|
|
||||||
var panels = newMods.Select(mod => new ModPanel(mod)
|
var panels = newMods.Select(mod => CreateModPanel(mod).With(panel => panel.Shear = new Vector2(-ModPanel.SHEAR_X, 0)));
|
||||||
{
|
|
||||||
Shear = new Vector2(-ModPanel.SHEAR_X, 0)
|
|
||||||
});
|
|
||||||
|
|
||||||
Task? loadTask;
|
Task? loadTask;
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
@ -31,16 +33,43 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
protected override bool StartHidden => true;
|
protected override bool StartHidden => true;
|
||||||
|
|
||||||
|
private Func<Mod, bool> isValidMod = m => true;
|
||||||
|
|
||||||
|
public Func<Mod, bool> IsValidMod
|
||||||
|
{
|
||||||
|
get => isValidMod;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
isValidMod = value ?? throw new ArgumentNullException(nameof(value));
|
||||||
|
|
||||||
|
if (IsLoaded)
|
||||||
|
updateAvailableMods();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether configurable <see cref="Mod"/>s can be configured by the local user.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual bool AllowConfiguration => true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether the total score multiplier calculated from the current selected set of mods should be shown.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual bool ShowTotalMultiplier => true;
|
||||||
|
|
||||||
|
protected virtual ModColumn CreateModColumn(ModType modType, Key[]? toggleKeys = null) => new ModColumn(modType, false, toggleKeys);
|
||||||
|
|
||||||
private readonly BindableBool customisationVisible = new BindableBool();
|
private readonly BindableBool customisationVisible = new BindableBool();
|
||||||
|
|
||||||
private DifficultyMultiplierDisplay multiplierDisplay;
|
private DifficultyMultiplierDisplay? multiplierDisplay;
|
||||||
private ModSettingsArea modSettingsArea;
|
private ModSettingsArea modSettingsArea = null!;
|
||||||
private FillFlowContainer<ModColumn> columnFlow;
|
private Container aboveColumnsContainer = null!;
|
||||||
private GridContainer grid;
|
private FillFlowContainer<ModColumn> columnFlow = null!;
|
||||||
private Container mainContent;
|
private GridContainer grid = null!;
|
||||||
|
private Container mainContent = null!;
|
||||||
|
|
||||||
private PopupScreenTitle header;
|
private PopupScreenTitle header = null!;
|
||||||
private Container footer;
|
private Container footer = null!;
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
@ -82,7 +111,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
},
|
},
|
||||||
new Drawable[]
|
new Drawable[]
|
||||||
{
|
{
|
||||||
new Container
|
aboveColumnsContainer = new Container
|
||||||
{
|
{
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
@ -94,11 +123,6 @@ namespace osu.Game.Overlays.Mods
|
|||||||
{
|
{
|
||||||
Horizontal = 100,
|
Horizontal = 100,
|
||||||
Vertical = 10
|
Vertical = 10
|
||||||
},
|
|
||||||
Child = multiplierDisplay = new DifficultyMultiplierDisplay
|
|
||||||
{
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -126,11 +150,11 @@ namespace osu.Game.Overlays.Mods
|
|||||||
Margin = new MarginPadding { Right = 70 },
|
Margin = new MarginPadding { Right = 70 },
|
||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
new ModColumn(ModType.DifficultyReduction, false, new[] { Key.Q, Key.W, Key.E, Key.R, Key.T, Key.Y, Key.U, Key.I, Key.O, Key.P }),
|
CreateModColumn(ModType.DifficultyReduction, new[] { Key.Q, Key.W, Key.E, Key.R, Key.T, Key.Y, Key.U, Key.I, Key.O, Key.P }),
|
||||||
new ModColumn(ModType.DifficultyIncrease, false, new[] { Key.A, Key.S, Key.D, Key.F, Key.G, Key.H, Key.J, Key.K, Key.L }),
|
CreateModColumn(ModType.DifficultyIncrease, new[] { Key.A, Key.S, Key.D, Key.F, Key.G, Key.H, Key.J, Key.K, Key.L }),
|
||||||
new ModColumn(ModType.Automation, false, new[] { Key.Z, Key.X, Key.C, Key.V, Key.B, Key.N, Key.M }),
|
CreateModColumn(ModType.Automation, new[] { Key.Z, Key.X, Key.C, Key.V, Key.B, Key.N, Key.M }),
|
||||||
new ModColumn(ModType.Conversion, false),
|
CreateModColumn(ModType.Conversion),
|
||||||
new ModColumn(ModType.Fun, false)
|
CreateModColumn(ModType.Fun)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -182,6 +206,15 @@ namespace osu.Game.Overlays.Mods
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (ShowTotalMultiplier)
|
||||||
|
{
|
||||||
|
aboveColumnsContainer.Add(multiplierDisplay = new DifficultyMultiplierDisplay
|
||||||
|
{
|
||||||
|
Anchor = Anchor.CentreRight,
|
||||||
|
Origin = Anchor.CentreRight
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
columnFlow.Shear = new Vector2(ModPanel.SHEAR_X, 0);
|
columnFlow.Shear = new Vector2(ModPanel.SHEAR_X, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,10 +237,15 @@ namespace osu.Game.Overlays.Mods
|
|||||||
}
|
}
|
||||||
|
|
||||||
customisationVisible.BindValueChanged(_ => updateCustomisationVisualState(), true);
|
customisationVisible.BindValueChanged(_ => updateCustomisationVisualState(), true);
|
||||||
|
|
||||||
|
updateAvailableMods();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateMultiplier()
|
private void updateMultiplier()
|
||||||
{
|
{
|
||||||
|
if (multiplierDisplay == null)
|
||||||
|
return;
|
||||||
|
|
||||||
double multiplier = 1.0;
|
double multiplier = 1.0;
|
||||||
|
|
||||||
foreach (var mod in SelectedMods.Value)
|
foreach (var mod in SelectedMods.Value)
|
||||||
@ -216,8 +254,17 @@ namespace osu.Game.Overlays.Mods
|
|||||||
multiplierDisplay.Current.Value = multiplier;
|
multiplierDisplay.Current.Value = multiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateAvailableMods()
|
||||||
|
{
|
||||||
|
foreach (var column in columnFlow)
|
||||||
|
column.Filter = isValidMod;
|
||||||
|
}
|
||||||
|
|
||||||
private void updateCustomisation(ValueChangedEvent<IReadOnlyList<Mod>> valueChangedEvent)
|
private void updateCustomisation(ValueChangedEvent<IReadOnlyList<Mod>> valueChangedEvent)
|
||||||
{
|
{
|
||||||
|
if (!AllowConfiguration)
|
||||||
|
return;
|
||||||
|
|
||||||
bool anyCustomisableMod = false;
|
bool anyCustomisableMod = false;
|
||||||
bool anyModWithRequiredCustomisationAdded = false;
|
bool anyModWithRequiredCustomisationAdded = false;
|
||||||
|
|
||||||
@ -292,7 +339,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
header.MoveToY(0, fade_in_duration, Easing.OutQuint);
|
header.MoveToY(0, fade_in_duration, Easing.OutQuint);
|
||||||
footer.MoveToY(0, fade_in_duration, Easing.OutQuint);
|
footer.MoveToY(0, fade_in_duration, Easing.OutQuint);
|
||||||
|
|
||||||
multiplierDisplay
|
multiplierDisplay?
|
||||||
.Delay(fade_in_duration * 0.65f)
|
.Delay(fade_in_duration * 0.65f)
|
||||||
.FadeIn(fade_in_duration / 2, Easing.OutQuint)
|
.FadeIn(fade_in_duration / 2, Easing.OutQuint)
|
||||||
.ScaleTo(1, fade_in_duration, Easing.OutElastic);
|
.ScaleTo(1, fade_in_duration, Easing.OutElastic);
|
||||||
@ -313,7 +360,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
base.PopOut();
|
base.PopOut();
|
||||||
this.FadeOut(fade_out_duration, Easing.OutQuint);
|
this.FadeOut(fade_out_duration, Easing.OutQuint);
|
||||||
|
|
||||||
multiplierDisplay
|
multiplierDisplay?
|
||||||
.FadeOut(fade_out_duration / 2, Easing.OutQuint)
|
.FadeOut(fade_out_duration / 2, Easing.OutQuint)
|
||||||
.ScaleTo(0.75f, fade_out_duration, Easing.OutQuint);
|
.ScaleTo(0.75f, fade_out_duration, Easing.OutQuint);
|
||||||
|
|
||||||
@ -368,7 +415,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
{
|
{
|
||||||
public BindableBool HandleMouse { get; } = new BindableBool();
|
public BindableBool HandleMouse { get; } = new BindableBool();
|
||||||
|
|
||||||
public Action OnClicked { get; set; }
|
public Action? OnClicked { get; set; }
|
||||||
|
|
||||||
protected override bool Handle(UIEvent e)
|
protected override bool Handle(UIEvent e)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user