RobotNet/RobotNet.WebApp/Maps/Models/MapZoneModel.cs
2025-10-15 15:15:53 +07:00

74 lines
2.3 KiB
C#

using RobotNet.MapShares.Dtos;
namespace RobotNet.WebApp.Maps.Models;
public class MapZoneModel : IEnumerable<ZoneModel>
{
private readonly Dictionary<Guid, ZoneModel> dicZones = [];
public ZoneModel this[int i] => dicZones.Values.ElementAt(i);
public ZoneModel this[Guid id] => dicZones[id];
public IEnumerator<ZoneModel> GetEnumerator() => dicZones.Values.GetEnumerator();
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => GetEnumerator();
public bool TryGetValue(Guid id, out ZoneModel? value) => dicZones.TryGetValue(id, out value);
public ZoneModel? ZoneActived { get; private set; }
public event Action? Changed;
public event Action<ZoneModel, bool>? ActivedZoneChanged;
public void ReplaceAll(IEnumerable<ZoneDto> zones)
{
foreach (var zone in dicZones.Values)
{
zone.ActiveChanged -= Zone_ActiveChanged;
zone.Dispose();
if (ZoneActived is not null && ZoneActived == zone) ZoneActived = null;
}
dicZones.Clear();
foreach (var zone in zones)
{
var model = new ZoneModel(zone);
model.ActiveChanged += Zone_ActiveChanged;
dicZones.Add(zone.Id, model);
}
Changed?.Invoke();
}
public void Add(ZoneDto zone)
{
if (dicZones.ContainsKey(zone.Id)) return;
var model = new ZoneModel(zone);
dicZones.Add(model.Id, model);
model.ActiveChanged += Zone_ActiveChanged;
Changed?.Invoke();
}
public void Remove(ZoneModel zone)
{
if (!dicZones.ContainsKey(zone.Id)) return;
zone.UnActive();
zone.ActiveChanged -= Zone_ActiveChanged;
if (ZoneActived is not null && zone.Id == ZoneActived.Id) ZoneActived = null;
zone.Dispose();
dicZones.Remove(zone.Id);
Changed?.Invoke();
}
private void Zone_ActiveChanged(ZoneModel zone, bool state)
{
if (state)
{
if (ZoneActived is not null && ZoneActived != zone || ZoneActived is null)
{
ZoneActived?.UnActive();
ZoneActived = zone;
}
}
ActivedZoneChanged?.Invoke(zone, state);
}
public void UnActivedZone() => ZoneActived?.UnActive();
}