// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System.Collections.Generic; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Graphics.Containers; using osu.Game.Configuration; using osu.Game.Rulesets.UI; using osu.Game.Skinning; namespace osu.Game.Screens.Play.HUD { /// /// A flowing display of all gameplay keys. Individual keys can be added using implementations. /// public abstract partial class KeyCounterDisplay : CompositeDrawable, ISerialisableDrawable { /// /// Whether the key counter should be visible regardless of the configuration value. /// This is true by default, but can be changed. /// public Bindable AlwaysVisible { get; } = new Bindable(true); /// /// The s contained in this . /// public IEnumerable Counters => KeyFlow; protected abstract FillFlowContainer KeyFlow { get; } protected readonly Bindable ConfigVisibility = new Bindable(); [Resolved] private KeyCounterController controller { get; set; } = null!; protected abstract void UpdateVisibility(); /// /// Add a to this display. /// public void Add(InputTrigger trigger) { var keyCounter = CreateCounter(trigger); KeyFlow.Add(keyCounter); } /// /// Add a range of to this display. /// public void AddRange(IEnumerable triggers) => triggers.ForEach(Add); protected abstract KeyCounter CreateCounter(InputTrigger trigger); [BackgroundDependencyLoader] private void load(OsuConfigManager config, DrawableRuleset? drawableRuleset) { config.BindWith(OsuSetting.KeyOverlay, ConfigVisibility); if (drawableRuleset != null) AlwaysVisible.BindTo(drawableRuleset.HasReplayLoaded); } protected override void LoadComplete() { base.LoadComplete(); controller.OnNewTrigger += Add; AddRange(controller.Triggers); AlwaysVisible.BindValueChanged(_ => UpdateVisibility()); ConfigVisibility.BindValueChanged(_ => UpdateVisibility(), true); } protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); controller.OnNewTrigger -= Add; } public bool UsesFixedAnchor { get; set; } } }