namespace SteUp.Shared.Core.Messages.System; /// /// Ponte fra il comando al centro della barra di navigazione e la schermata /// che sta sotto. Il comando sta sempre nello stesso punto — sotto il pollice, /// dove il rilevatore lo cerca — ma quello che fa appartiene alla schermata: /// dentro un'ispezione apre le azioni di quell'ispezione, altrove apre una /// nuova ispezione. /// /// La pagina si registra finché è a video e si sfila uscendo, così la barra /// non tiene in vita un riferimento a schermate che non ci sono più. Chi non /// registra niente lascia al comando il suo significato di default: la barra /// non resta mai con un tasto che non fa nulla. /// public class PageActionsService { private Func? _handler; /// Avvisa la barra che il significato del comando è cambiato, così si ridisegna. public event Action? Changed; public bool HasActions => _handler is not null; public IDisposable Register(Func handler) { _handler = handler; Changed?.Invoke(); return new Registration(this, handler); } public Task Invoke() => _handler?.Invoke() ?? Task.CompletedTask; private sealed class Registration(PageActionsService owner, Func handler) : IDisposable { public void Dispose() { // Solo chi ha registrato per ultimo può sfilare: se una schermata // nuova si è già registrata, la vecchia uscendo non deve spegnerla. if (owner._handler != handler) return; owner._handler = null; owner.Changed?.Invoke(); } } }