FluentList.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. namespace InABox.Core
  6. {
  7. public class FluentList<T> : IEnumerable<T>
  8. {
  9. public delegate void FluentListChangedEvent(object sender, EventArgs args);
  10. private int _enabled = 0;
  11. private bool _changed = false;
  12. private readonly List<T> _values = new List<T>();
  13. public bool Enabled
  14. {
  15. get => _enabled == 0;
  16. set
  17. {
  18. if (value)
  19. EndUpdate();
  20. else
  21. BeginUpdate();
  22. }
  23. }
  24. public T this[int i]
  25. {
  26. get => _values[i];
  27. set
  28. {
  29. _values[i] = value;
  30. Changed();
  31. }
  32. }
  33. public int Count => _values.Count;
  34. public IEnumerator<T> GetEnumerator()
  35. {
  36. return ((IEnumerable<T>)_values).GetEnumerator();
  37. }
  38. IEnumerator IEnumerable.GetEnumerator()
  39. {
  40. return ((IEnumerable<T>)_values).GetEnumerator();
  41. }
  42. public FluentList<T> Add(T value)
  43. {
  44. if (!_values.Contains(value))
  45. {
  46. _changed = true;
  47. _values.Add(value);
  48. }
  49. return Changed();
  50. }
  51. public FluentList<T> AddRange(params T[] values)
  52. {
  53. foreach (var value in values)
  54. if (!_values.Contains(value))
  55. {
  56. _changed = true;
  57. _values.Add(value);
  58. }
  59. return Changed();
  60. }
  61. public FluentList<T> AddRange(IEnumerable<T> values)
  62. {
  63. foreach (var value in values)
  64. if (!_values.Contains(value))
  65. {
  66. _changed = true;
  67. _values.Add(value);
  68. }
  69. return Changed();
  70. }
  71. public FluentList<T> Remove(T value)
  72. {
  73. _changed = _values.Remove(value) || _changed;
  74. return Changed();
  75. }
  76. public FluentList<T> RemoveAt(int index)
  77. {
  78. if (index > 0 && index < _values.Count)
  79. {
  80. _values.RemoveAt(index);
  81. _changed = true;
  82. }
  83. return Changed();
  84. }
  85. public FluentList<T> RemoveRange(params T[] values)
  86. {
  87. foreach (var value in values)
  88. _changed = _values.Remove(value) || _changed;
  89. return Changed();
  90. }
  91. public FluentList<T> RemoveRange(IEnumerable<T> values)
  92. {
  93. foreach (var value in values)
  94. _changed = _values.Remove(value) || _changed;
  95. return Changed();
  96. }
  97. public FluentList<T> Clear()
  98. {
  99. if(_values.Count > 0)
  100. {
  101. _values.Clear();
  102. _changed = true;
  103. }
  104. return Changed();
  105. }
  106. public event FluentListChangedEvent OnChanged;
  107. public FluentList<T> BeginUpdate()
  108. {
  109. ++_enabled;
  110. return this;
  111. }
  112. private FluentList<T> Changed()
  113. {
  114. if (_enabled == 0 && _changed)
  115. {
  116. _changed = false;
  117. OnChanged?.Invoke(this, new EventArgs());
  118. }
  119. return this;
  120. }
  121. public FluentList<T> EndUpdate()
  122. {
  123. --_enabled;
  124. return Changed();
  125. }
  126. }
  127. }