mergemilitary/Assets/ThirdPlugins/StompyRobot/SRDebugger/Scripts/Services/Implementation/OptionsServiceImpl.cs

98 lines
2.8 KiB
C#
Raw Normal View History

2022-05-23 13:39:59 +00:00
namespace SRDebugger.Services.Implementation
{
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using Internal;
using SRF.Service;
[Service(typeof (IOptionsService))]
public class OptionsServiceImpl : IOptionsService
{
public event EventHandler OptionsUpdated;
public event EventHandler<PropertyChangedEventArgs> OptionsValueUpdated;
public ICollection<OptionDefinition> Options
{
get { return _optionsReadonly; }
}
private readonly Dictionary<object, ICollection<OptionDefinition>> _optionContainerLookup = new Dictionary<object, ICollection<OptionDefinition>>();
private readonly List<OptionDefinition> _options = new List<OptionDefinition>();
private readonly IList<OptionDefinition> _optionsReadonly;
public OptionsServiceImpl()
{
_optionsReadonly = new ReadOnlyCollection<OptionDefinition>(_options);
}
public void Scan(object obj)
{
AddContainer(obj);
}
public void AddContainer(object obj)
{
if (_optionContainerLookup.ContainsKey(obj))
{
throw new Exception("An object should only be added once.");
}
var options = SRDebuggerUtil.ScanForOptions(obj);
_optionContainerLookup.Add(obj, options);
if (options.Count > 0)
{
_options.AddRange(options);
OnOptionsUpdated();
var changed = obj as INotifyPropertyChanged;
if (changed != null)
{
changed.PropertyChanged += OnPropertyChanged;
}
}
}
public void RemoveContainer(object obj)
{
if (!_optionContainerLookup.ContainsKey(obj))
{
return;
}
var list = _optionContainerLookup[obj];
_optionContainerLookup.Remove(obj);
foreach (var op in list)
{
_options.Remove(op);
}
var changed = obj as INotifyPropertyChanged;
if (changed != null)
{
changed.PropertyChanged -= OnPropertyChanged;
}
OnOptionsUpdated();
}
private void OnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
{
if (OptionsValueUpdated != null)
{
OptionsValueUpdated(this, propertyChangedEventArgs);
}
}
private void OnOptionsUpdated()
{
if (OptionsUpdated != null)
{
OptionsUpdated(this, EventArgs.Empty);
}
}
}
}