1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-13 10:03:05 +08:00

refactor: improve attachement flow

This removes the hard reliance on individual classes and makes its usage easiser to ingreate anywhere
else.
This commit is contained in:
tsrk 2023-06-06 00:04:29 +02:00
parent 41b7eacc72
commit 4c397085c5
No known key found for this signature in database
GPG Key ID: EBD46BB3049B56D6
3 changed files with 64 additions and 6 deletions

View File

@ -158,9 +158,41 @@ namespace osu.Game.Rulesets.UI
#endregion #endregion
#region Component attachement
public void Attach(IAttachableSkinComponent skinComponent)
{
switch (skinComponent)
{
case KeyCounterDisplay keyCounterDisplay:
attachKeyCounter(keyCounterDisplay);
break;
case ClicksPerSecondCalculator clicksPerSecondCalculator:
attachClicksPerSecond(clicksPerSecondCalculator);
break;
}
}
public void Detach(IAttachableSkinComponent skinComponent)
{
switch (skinComponent)
{
case KeyCounterDisplay keyCounterDisplay:
detachKeyCounter(keyCounterDisplay);
break;
case ClicksPerSecondCalculator clicksPerSecondCalculator:
detachClicksPerSecond(clicksPerSecondCalculator);
break;
}
}
#endregion
#region Key Counter Attachment #region Key Counter Attachment
public void Attach(KeyCounterDisplay keyCounter) private void attachKeyCounter(KeyCounterDisplay keyCounter)
{ {
var receptor = new ActionReceptor(keyCounter); var receptor = new ActionReceptor(keyCounter);
@ -174,6 +206,10 @@ namespace osu.Game.Rulesets.UI
.Select(action => new KeyCounterActionTrigger<T>(action))); .Select(action => new KeyCounterActionTrigger<T>(action)));
} }
private void detachKeyCounter(KeyCounterDisplay keyCounter)
{
}
private partial class ActionReceptor : KeyCounterDisplay.Receptor, IKeyBindingHandler<T> private partial class ActionReceptor : KeyCounterDisplay.Receptor, IKeyBindingHandler<T>
{ {
public ActionReceptor(KeyCounterDisplay target) public ActionReceptor(KeyCounterDisplay target)
@ -197,13 +233,17 @@ namespace osu.Game.Rulesets.UI
#region Keys per second Counter Attachment #region Keys per second Counter Attachment
public void Attach(ClicksPerSecondCalculator calculator) private void attachClicksPerSecond(ClicksPerSecondCalculator calculator)
{ {
var listener = new ActionListener(calculator); var listener = new ActionListener(calculator);
KeyBindingContainer.Add(listener); KeyBindingContainer.Add(listener);
} }
private void detachClicksPerSecond(ClicksPerSecondCalculator calculator)
{
}
private partial class ActionListener : Component, IKeyBindingHandler<T> private partial class ActionListener : Component, IKeyBindingHandler<T>
{ {
private readonly ClicksPerSecondCalculator calculator; private readonly ClicksPerSecondCalculator calculator;
@ -266,8 +306,12 @@ namespace osu.Game.Rulesets.UI
/// </summary> /// </summary>
public interface ICanAttachHUDPieces public interface ICanAttachHUDPieces
{ {
void Attach(KeyCounterDisplay keyCounter); void Attach(IAttachableSkinComponent component);
void Attach(ClicksPerSecondCalculator calculator); void Detach(IAttachableSkinComponent component);
}
public interface IAttachableSkinComponent
{
} }
public class RulesetInputManagerInputState<T> : InputState public class RulesetInputManagerInputState<T> : InputState

View File

@ -8,7 +8,7 @@ using osu.Game.Rulesets.UI;
namespace osu.Game.Screens.Play.HUD.ClicksPerSecond namespace osu.Game.Screens.Play.HUD.ClicksPerSecond
{ {
public partial class ClicksPerSecondCalculator : Component public partial class ClicksPerSecondCalculator : Component, IAttachableSkinComponent
{ {
private readonly List<double> timestamps = new List<double>(); private readonly List<double> timestamps = new List<double>();

View File

@ -11,6 +11,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Input.Events; using osu.Framework.Input.Events;
using osu.Game.Configuration; using osu.Game.Configuration;
using osu.Game.Rulesets.UI;
using osuTK; using osuTK;
namespace osu.Game.Screens.Play.HUD namespace osu.Game.Screens.Play.HUD
@ -18,7 +19,7 @@ namespace osu.Game.Screens.Play.HUD
/// <summary> /// <summary>
/// A flowing display of all gameplay keys. Individual keys can be added using <see cref="InputTrigger"/> implementations. /// A flowing display of all gameplay keys. Individual keys can be added using <see cref="InputTrigger"/> implementations.
/// </summary> /// </summary>
public abstract partial class KeyCounterDisplay : CompositeDrawable public abstract partial class KeyCounterDisplay : CompositeDrawable, IAttachableSkinComponent
{ {
/// <summary> /// <summary>
/// Whether the key counter should be visible regardless of the configuration value. /// Whether the key counter should be visible regardless of the configuration value.
@ -44,6 +45,11 @@ namespace osu.Game.Screens.Play.HUD
private Receptor? receptor; private Receptor? receptor;
/// <summary>
/// Sets a <see cref="Receptor"/> that will populate keybinding events to this <see cref="KeyCounterDisplay"/>.
/// </summary>
/// <param name="receptor">The receptor to set</param>
/// <exception cref="InvalidOperationException">When a <see cref="Receptor"/> is already active on this <see cref="KeyCounterDisplay"/></exception>
public void SetReceptor(Receptor receptor) public void SetReceptor(Receptor receptor)
{ {
if (this.receptor != null) if (this.receptor != null)
@ -52,6 +58,14 @@ namespace osu.Game.Screens.Play.HUD
this.receptor = receptor; this.receptor = receptor;
} }
/// <summary>
/// Clears any <see cref="Receptor"/> active
/// </summary>
public void ClearReceptor()
{
receptor = null;
}
/// <summary> /// <summary>
/// Add a <see cref="InputTrigger"/> to this display. /// Add a <see cref="InputTrigger"/> to this display.
/// </summary> /// </summary>