67 lines
1.8 KiB
C#
67 lines
1.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace Vanguard.Battle
|
|
{
|
|
/// <summary>
|
|
/// Счётчик причин блокировки: анимация, оверлей, контекстное меню.
|
|
/// Ввод возвращается только когда снята последняя причина.
|
|
/// </summary>
|
|
public sealed class InputLockService
|
|
{
|
|
private readonly Dictionary<string, int> _reasons =
|
|
new Dictionary<string, int>(StringComparer.Ordinal);
|
|
|
|
public bool IsLocked => _reasons.Count > 0;
|
|
|
|
public string Describe() =>
|
|
_reasons.Count == 0
|
|
? "none"
|
|
: string.Join(",", _reasons.Select(pair => pair.Key + "=" + pair.Value));
|
|
|
|
public event Action<bool> Changed;
|
|
|
|
public void Acquire(string reason)
|
|
{
|
|
if (string.IsNullOrEmpty(reason))
|
|
return;
|
|
|
|
var wasLocked = _reasons.Count > 0;
|
|
_reasons.TryGetValue(reason, out var count);
|
|
_reasons[reason] = count + 1;
|
|
|
|
if (!wasLocked)
|
|
Changed?.Invoke(true);
|
|
}
|
|
|
|
public void Release(string reason)
|
|
{
|
|
if (string.IsNullOrEmpty(reason))
|
|
return;
|
|
|
|
if (!_reasons.TryGetValue(reason, out var count))
|
|
return;
|
|
|
|
if (count > 1)
|
|
{
|
|
_reasons[reason] = count - 1;
|
|
return;
|
|
}
|
|
|
|
_reasons.Remove(reason);
|
|
if (_reasons.Count == 0)
|
|
Changed?.Invoke(false);
|
|
}
|
|
|
|
public void ReleaseAll()
|
|
{
|
|
if (_reasons.Count == 0)
|
|
return;
|
|
|
|
_reasons.Clear();
|
|
Changed?.Invoke(false);
|
|
}
|
|
}
|
|
}
|