13d5400104
Il tasto al centro perde l'etichetta: non ne ha una sola, perche' quello che fa lo decide la schermata sotto. Dentro un'ispezione apre le sue azioni (nuova scheda, concludi, elimina); altrove apre una nuova ispezione. Il glifo resta lo stesso e resta nello stesso punto: quello che cambia e' cosa c'e' dietro, non dove mettere il dito. Le azioni dell'ispezione lasciano quindi la testata, dove stavano dietro un menu a tre punti, e tornano sotto il pollice. Il collegamento passa da PageActionsService: la pagina si registra finche' e' a video e si sfila uscendo, cosi' la barra non tiene in vita schermate che non ci sono piu'. Chi non registra niente lascia al comando il suo significato di default — un'ispezione conclusa non registra, e il tasto non resta li' a non fare nulla. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
47 lines
1.6 KiB
C#
47 lines
1.6 KiB
C#
namespace SteUp.Shared.Core.Messages.System;
|
|
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
public class PageActionsService
|
|
{
|
|
private Func<Task>? _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<Task> handler)
|
|
{
|
|
_handler = handler;
|
|
Changed?.Invoke();
|
|
|
|
return new Registration(this, handler);
|
|
}
|
|
|
|
public Task Invoke() => _handler?.Invoke() ?? Task.CompletedTask;
|
|
|
|
private sealed class Registration(PageActionsService owner, Func<Task> 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();
|
|
}
|
|
}
|
|
}
|