GeometryKeyFrameCollection.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Globalization;
  5. using System.Windows;
  6. namespace HandyControl.Media.Animation;
  7. public class GeometryKeyFrameCollection : Freezable, IList
  8. {
  9. private List<GeometryKeyFrame> _keyFrames;
  10. private static GeometryKeyFrameCollection s_emptyCollection;
  11. public GeometryKeyFrameCollection()
  12. {
  13. _keyFrames = new List<GeometryKeyFrame>(2);
  14. }
  15. public static GeometryKeyFrameCollection Empty
  16. {
  17. get
  18. {
  19. if (s_emptyCollection == null)
  20. {
  21. var emptyCollection = new GeometryKeyFrameCollection
  22. {
  23. _keyFrames = new List<GeometryKeyFrame>(0)
  24. };
  25. emptyCollection.Freeze();
  26. s_emptyCollection = emptyCollection;
  27. }
  28. return s_emptyCollection;
  29. }
  30. }
  31. public new GeometryKeyFrameCollection Clone() => (GeometryKeyFrameCollection) base.Clone();
  32. protected override Freezable CreateInstanceCore() => new GeometryKeyFrameCollection();
  33. protected override void CloneCore(Freezable sourceFreezable)
  34. {
  35. var sourceCollection = (GeometryKeyFrameCollection) sourceFreezable;
  36. base.CloneCore(sourceFreezable);
  37. var count = sourceCollection._keyFrames.Count;
  38. _keyFrames = new List<GeometryKeyFrame>(count);
  39. for (var i = 0; i < count; i++)
  40. {
  41. var keyFrame = (GeometryKeyFrame) sourceCollection._keyFrames[i].Clone();
  42. _keyFrames.Add(keyFrame);
  43. OnFreezablePropertyChanged(null, keyFrame);
  44. }
  45. }
  46. protected override void CloneCurrentValueCore(Freezable sourceFreezable)
  47. {
  48. var sourceCollection = (GeometryKeyFrameCollection) sourceFreezable;
  49. base.CloneCurrentValueCore(sourceFreezable);
  50. var count = sourceCollection._keyFrames.Count;
  51. _keyFrames = new List<GeometryKeyFrame>(count);
  52. for (var i = 0; i < count; i++)
  53. {
  54. var keyFrame = (GeometryKeyFrame) sourceCollection._keyFrames[i].CloneCurrentValue();
  55. _keyFrames.Add(keyFrame);
  56. OnFreezablePropertyChanged(null, keyFrame);
  57. }
  58. }
  59. protected override void GetAsFrozenCore(Freezable sourceFreezable)
  60. {
  61. var sourceCollection = (GeometryKeyFrameCollection) sourceFreezable;
  62. base.GetAsFrozenCore(sourceFreezable);
  63. var count = sourceCollection._keyFrames.Count;
  64. _keyFrames = new List<GeometryKeyFrame>(count);
  65. for (var i = 0; i < count; i++)
  66. {
  67. var keyFrame = (GeometryKeyFrame) sourceCollection._keyFrames[i].GetAsFrozen();
  68. _keyFrames.Add(keyFrame);
  69. OnFreezablePropertyChanged(null, keyFrame);
  70. }
  71. }
  72. protected override void GetCurrentValueAsFrozenCore(Freezable sourceFreezable)
  73. {
  74. var sourceCollection = (GeometryKeyFrameCollection) sourceFreezable;
  75. base.GetCurrentValueAsFrozenCore(sourceFreezable);
  76. var count = sourceCollection._keyFrames.Count;
  77. _keyFrames = new List<GeometryKeyFrame>(count);
  78. for (var i = 0; i < count; i++)
  79. {
  80. var keyFrame = (GeometryKeyFrame) sourceCollection._keyFrames[i].GetCurrentValueAsFrozen();
  81. _keyFrames.Add(keyFrame);
  82. OnFreezablePropertyChanged(null, keyFrame);
  83. }
  84. }
  85. protected override bool FreezeCore(bool isChecking)
  86. {
  87. var canFreeze = base.FreezeCore(isChecking);
  88. for (var i = 0; i < _keyFrames.Count && canFreeze; i++)
  89. {
  90. canFreeze &= Freeze(_keyFrames[i], isChecking);
  91. }
  92. return canFreeze;
  93. }
  94. public IEnumerator GetEnumerator()
  95. {
  96. ReadPreamble();
  97. return _keyFrames.GetEnumerator();
  98. }
  99. void ICollection.CopyTo(Array array, int index)
  100. {
  101. ReadPreamble();
  102. ((ICollection) _keyFrames).CopyTo(array, index);
  103. }
  104. public void CopyTo(GeometryKeyFrame[] array, int index)
  105. {
  106. ReadPreamble();
  107. _keyFrames.CopyTo(array, index);
  108. }
  109. public int Count
  110. {
  111. get
  112. {
  113. ReadPreamble();
  114. return _keyFrames.Count;
  115. }
  116. }
  117. public object SyncRoot
  118. {
  119. get
  120. {
  121. ReadPreamble();
  122. return ((ICollection) _keyFrames).SyncRoot;
  123. }
  124. }
  125. public bool IsSynchronized
  126. {
  127. get
  128. {
  129. ReadPreamble();
  130. return IsFrozen || Dispatcher != null;
  131. }
  132. }
  133. int IList.Add(object keyFrame) => Add((GeometryKeyFrame) keyFrame);
  134. public int Add(GeometryKeyFrame keyFrame)
  135. {
  136. if (keyFrame == null)
  137. {
  138. throw new ArgumentNullException(nameof(keyFrame));
  139. }
  140. WritePreamble();
  141. OnFreezablePropertyChanged(null, keyFrame);
  142. _keyFrames.Add(keyFrame);
  143. WritePostscript();
  144. return _keyFrames.Count - 1;
  145. }
  146. public void Clear()
  147. {
  148. WritePreamble();
  149. if (_keyFrames.Count <= 0) return;
  150. foreach (var frame in _keyFrames)
  151. {
  152. OnFreezablePropertyChanged(frame, null);
  153. }
  154. _keyFrames.Clear();
  155. WritePostscript();
  156. }
  157. bool IList.Contains(object keyFrame) => Contains((GeometryKeyFrame) keyFrame);
  158. public bool Contains(GeometryKeyFrame keyFrame)
  159. {
  160. ReadPreamble();
  161. return _keyFrames.Contains(keyFrame);
  162. }
  163. int IList.IndexOf(object keyFrame) => IndexOf((GeometryKeyFrame) keyFrame);
  164. public int IndexOf(GeometryKeyFrame keyFrame)
  165. {
  166. ReadPreamble();
  167. return _keyFrames.IndexOf(keyFrame);
  168. }
  169. void IList.Insert(int index, object keyFrame) => Insert(index, (GeometryKeyFrame) keyFrame);
  170. public void Insert(int index, GeometryKeyFrame keyFrame)
  171. {
  172. if (keyFrame == null)
  173. {
  174. throw new ArgumentNullException(nameof(keyFrame));
  175. }
  176. WritePreamble();
  177. OnFreezablePropertyChanged(null, keyFrame);
  178. _keyFrames.Insert(index, keyFrame);
  179. WritePostscript();
  180. }
  181. void IList.Remove(object keyFrame) => Remove((GeometryKeyFrame) keyFrame);
  182. public void Remove(GeometryKeyFrame keyFrame)
  183. {
  184. WritePreamble();
  185. if (_keyFrames.Contains(keyFrame))
  186. {
  187. OnFreezablePropertyChanged(keyFrame, null);
  188. _keyFrames.Remove(keyFrame);
  189. WritePostscript();
  190. }
  191. }
  192. public void RemoveAt(int index)
  193. {
  194. WritePreamble();
  195. OnFreezablePropertyChanged(_keyFrames[index], null);
  196. _keyFrames.RemoveAt(index);
  197. WritePostscript();
  198. }
  199. object IList.this[int index]
  200. {
  201. get => this[index];
  202. set => this[index] = (GeometryKeyFrame) value;
  203. }
  204. public GeometryKeyFrame this[int index]
  205. {
  206. get
  207. {
  208. ReadPreamble();
  209. return _keyFrames[index];
  210. }
  211. set
  212. {
  213. if (value == null)
  214. {
  215. throw new ArgumentNullException(string.Format(CultureInfo.InvariantCulture, "DoubleKeyFrameCollection[{0}]", index));
  216. }
  217. WritePreamble();
  218. if (value != _keyFrames[index])
  219. {
  220. OnFreezablePropertyChanged(_keyFrames[index], value);
  221. _keyFrames[index] = value;
  222. WritePostscript();
  223. }
  224. }
  225. }
  226. public bool IsReadOnly
  227. {
  228. get
  229. {
  230. ReadPreamble();
  231. return IsFrozen;
  232. }
  233. }
  234. public bool IsFixedSize
  235. {
  236. get
  237. {
  238. ReadPreamble();
  239. return IsFrozen;
  240. }
  241. }
  242. }