1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-15 09:42:54 +08:00

Refactor preview panel to be more self-contained

This commit is contained in:
Bartłomiej Dach 2023-09-11 08:44:25 +02:00
parent c1a2b86f3f
commit f591a30ea7
No known key found for this signature in database
2 changed files with 22 additions and 34 deletions

View File

@ -20,6 +20,7 @@ using osu.Game.Rulesets.Mods;
using osuTK; using osuTK;
using osuTK.Graphics; using osuTK.Graphics;
using System.Threading; using System.Threading;
using osu.Game.Configuration;
namespace osu.Game.Overlays.Mods namespace osu.Game.Overlays.Mods
{ {
@ -41,24 +42,13 @@ namespace osu.Game.Overlays.Mods
private const float transition_duration = 250; private const float transition_duration = 250;
private IBeatmapInfo? beatmapInfo; public Bindable<IBeatmapInfo?> BeatmapInfo { get; } = new Bindable<IBeatmapInfo?>();
public IBeatmapInfo? BeatmapInfo
{
get => beatmapInfo;
set
{
if (value == beatmapInfo) return;
beatmapInfo = value;
updateStarDifficultyBind();
UpdateValues();
}
}
[Resolved] [Resolved]
private Bindable<IReadOnlyList<Mod>> mods { get; set; } = null!; private Bindable<IReadOnlyList<Mod>> mods { get; set; } = null!;
private ModSettingChangeTracker? modSettingChangeTracker;
[Resolved] [Resolved]
private OverlayColourProvider colourProvider { get; set; } = null!; private OverlayColourProvider colourProvider { get; set; } = null!;
@ -178,16 +168,25 @@ namespace osu.Game.Overlays.Mods
content.BorderColour = ColourInfo.GradientVertical(background.Colour, glowColour); content.BorderColour = ColourInfo.GradientVertical(background.Colour, glowColour);
innerContent.BorderColour = ColourInfo.GradientVertical(innerBackground.Colour, glowColour); innerContent.BorderColour = ColourInfo.GradientVertical(innerBackground.Colour, glowColour);
updateStarDifficultyBind(); BeatmapInfo.BindValueChanged(_ => updateValues(), true);
mods.BindValueChanged(_ =>
{
modSettingChangeTracker?.Dispose();
modSettingChangeTracker = new ModSettingChangeTracker(mods.Value);
modSettingChangeTracker.SettingChanged += _ => updateValues();
updateValues();
});
} }
private void updateStarDifficultyBind() private void updateValues() => Scheduler.AddOnce(() =>
{ {
if (beatmapInfo == null) if (BeatmapInfo.Value == null)
return; return;
cancellationSource?.Cancel(); cancellationSource?.Cancel();
starDifficulty = difficultyCache.GetBindableDifficulty(beatmapInfo, (cancellationSource = new CancellationTokenSource()).Token); starDifficulty = difficultyCache.GetBindableDifficulty(BeatmapInfo.Value, (cancellationSource = new CancellationTokenSource()).Token);
starDifficulty.BindValueChanged(s => starDifficulty.BindValueChanged(s =>
{ {
starRatingDisplay.Current.Value = s.NewValue ?? default; starRatingDisplay.Current.Value = s.NewValue ?? default;
@ -197,20 +196,14 @@ namespace osu.Game.Overlays.Mods
starRatingDisplay.FadeIn(transition_duration); starRatingDisplay.FadeIn(transition_duration);
}); });
}
public void UpdateValues()
{
if (beatmapInfo == null)
return;
double rate = 1; double rate = 1;
foreach (var mod in mods.Value.OfType<IApplicableToRate>()) foreach (var mod in mods.Value.OfType<IApplicableToRate>())
rate = mod.ApplyToRate(0, rate); rate = mod.ApplyToRate(0, rate);
bpmDisplay.Current.Value = beatmapInfo.BPM * rate; bpmDisplay.Current.Value = BeatmapInfo.Value.BPM * rate;
BeatmapDifficulty adjustedDifficulty = new BeatmapDifficulty(beatmapInfo.Difficulty); BeatmapDifficulty adjustedDifficulty = new BeatmapDifficulty(BeatmapInfo.Value.Difficulty);
foreach (var mod in mods.Value.OfType<IApplicableToDifficulty>()) foreach (var mod in mods.Value.OfType<IApplicableToDifficulty>())
mod.ApplyToDifficulty(adjustedDifficulty); mod.ApplyToDifficulty(adjustedDifficulty);
@ -218,7 +211,7 @@ namespace osu.Game.Overlays.Mods
drainRateDisplay.Current.Value = adjustedDifficulty.DrainRate; drainRateDisplay.Current.Value = adjustedDifficulty.DrainRate;
approachRateDisplay.Current.Value = adjustedDifficulty.ApproachRate; approachRateDisplay.Current.Value = adjustedDifficulty.ApproachRate;
overallDifficultyDisplay.Current.Value = adjustedDifficulty.OverallDifficulty; overallDifficultyDisplay.Current.Value = adjustedDifficulty.OverallDifficulty;
} });
private partial class BPMDisplay : RollingCounter<double> private partial class BPMDisplay : RollingCounter<double>
{ {

View File

@ -143,7 +143,7 @@ namespace osu.Game.Overlays.Mods
if (beatmap == value) return; if (beatmap == value) return;
beatmap = value; beatmap = value;
modEffectPreviewPanel.BeatmapInfo = beatmap.BeatmapInfo; modEffectPreviewPanel.BeatmapInfo.Value = beatmap.BeatmapInfo;
} }
} }
@ -300,7 +300,6 @@ namespace osu.Game.Overlays.Mods
SelectedMods.BindValueChanged(_ => SelectedMods.BindValueChanged(_ =>
{ {
modEffectPreviewPanel.UpdateValues();
updateMultiplier(); updateMultiplier();
updateFromExternalSelection(); updateFromExternalSelection();
updateCustomisation(); updateCustomisation();
@ -314,11 +313,7 @@ namespace osu.Game.Overlays.Mods
// //
// See https://github.com/ppy/osu/pull/23284#issuecomment-1529056988 // See https://github.com/ppy/osu/pull/23284#issuecomment-1529056988
modSettingChangeTracker = new ModSettingChangeTracker(SelectedMods.Value); modSettingChangeTracker = new ModSettingChangeTracker(SelectedMods.Value);
modSettingChangeTracker.SettingChanged += _ => modSettingChangeTracker.SettingChanged += _ => updateMultiplier();
{
modEffectPreviewPanel.UpdateValues();
updateMultiplier();
};
} }
}, true); }, true);