Files
SteUP_Dotnet/SteUp.Shared/Core/Messages/System/PageActionsService.cs
T
MarcoE 13d5400104 Il comando della barra si adatta alla schermata
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>
2026-09-17 15:44:55 +02:00

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();
}
}
}