adams-toolkit

codigo-fonte GPL-3.0 · espelho oficial · commit b208bae5
Core/AppState.cs · 30 linhas · raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
namespace AdamsToolkit.Core;

/// <summary>
/// Estado global "a app está a ser vista?" — regra da pena: nada de sensores,
/// timers ou desenho quando o jogador não está a olhar para a janela (na bandeja
/// ou com o jogo à frente). As views consultam <see cref="IsVisible"/> e ligam-se
/// ao <see cref="Changed"/> para se suspenderem/retomarem sozinhas.
/// </summary>
public static class AppState
{
    private static bool _shown = true;   // janela aberta (não está na bandeja)
    private static bool _active = true;  // janela em primeiro plano

    /// <summary>Vale a pena gastar CPU? (janela aberta E em primeiro plano)</summary>
    public static bool IsVisible => _shown && _active;

    /// <summary>Disparado quando o estado muda (thread de UI).</summary>
    public static event Action<bool>? Changed;

    public static void SetShown(bool v) => Set(ref _shown, v);
    public static void SetActive(bool v) => Set(ref _active, v);

    private static void Set(ref bool field, bool v)
    {
        if (field == v) return;
        var before = IsVisible;
        field = v;
        if (IsVisible != before) Changed?.Invoke(IsVisible);
    }
}