diff --git a/sources/core/Stride.Core/Collections/ITrackingCollectionChanged.cs b/sources/core/Stride.Core/Collections/ITrackingCollectionChanged.cs index 80ed223053..4d87284ef2 100644 --- a/sources/core/Stride.Core/Collections/ITrackingCollectionChanged.cs +++ b/sources/core/Stride.Core/Collections/ITrackingCollectionChanged.cs @@ -1,13 +1,15 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace Stride.Core.Collections; - -public interface ITrackingCollectionChanged +public interface ITrackingCollectionChanged { /// /// Occurs when [collection changed]. /// /// Called as is when adding an item, and in reverse-order when removing an item. - event EventHandler CollectionChanged; + event EventHandler> CollectionChanged; } diff --git a/sources/core/Stride.Core/Collections/ITrackingKeyedCollectionChanged.cs b/sources/core/Stride.Core/Collections/ITrackingKeyedCollectionChanged.cs new file mode 100644 index 0000000000..d4b77d6bd6 --- /dev/null +++ b/sources/core/Stride.Core/Collections/ITrackingKeyedCollectionChanged.cs @@ -0,0 +1,13 @@ +// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) +// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. + +namespace Stride.Core.Collections; + +public interface ITrackingKeyedCollectionChanged +{ + /// + /// Occurs when [collection changed]. + /// + /// Called as is when adding an item, and in reverse-order when removing an item. + event EventHandler> CollectionChanged; +} diff --git a/sources/core/Stride.Core/Collections/TrackingCollection.cs b/sources/core/Stride.Core/Collections/TrackingCollection.cs index a257a6a0a6..06d5359bf3 100644 --- a/sources/core/Stride.Core/Collections/TrackingCollection.cs +++ b/sources/core/Stride.Core/Collections/TrackingCollection.cs @@ -12,24 +12,24 @@ namespace Stride.Core.Collections; /// /// The type of elements in the collection. [DataSerializer(typeof(ListAllSerializer<,>), Mode = DataSerializerGenericMode.TypeAndGenericArguments)] -public class TrackingCollection : FastCollection, ITrackingCollectionChanged +public class TrackingCollection : FastCollection, ITrackingCollectionChanged { - private EventHandler? itemAdded; - private EventHandler? itemRemoved; + private EventHandler>? _itemAdded; + private EventHandler>? _itemRemoved; /// - public event EventHandler CollectionChanged + public event EventHandler> CollectionChanged { add { // We keep a list in reverse order for removal, so that we can easily have multiple handlers depending on each others - itemAdded = (EventHandler)Delegate.Combine(itemAdded, value); - itemRemoved = (EventHandler)Delegate.Combine(value, itemRemoved); + _itemAdded = (EventHandler>)Delegate.Combine(_itemAdded, value); + _itemRemoved = (EventHandler>)Delegate.Combine(value, _itemRemoved); } remove { - itemAdded = (EventHandler?)Delegate.Remove(itemAdded, value); - itemRemoved = (EventHandler?)Delegate.Remove(itemRemoved, value); + _itemAdded = (EventHandler>?)Delegate.Remove(_itemAdded, value); + _itemRemoved = (EventHandler>?)Delegate.Remove(_itemRemoved, value); } } @@ -37,13 +37,13 @@ public event EventHandler CollectionChanged protected override void InsertItem(int index, T item) { base.InsertItem(index, item); - itemAdded?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, null, index, true)); + _itemAdded?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, default, index, true)); } /// protected override void RemoveItem(int index) { - itemRemoved?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, this[index], null, index, true)); + _itemRemoved?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, this[index], default, index, true)); base.RemoveItem(index); } @@ -57,11 +57,11 @@ protected override void ClearItems() protected void ClearItemsEvents() { // Note: Changing CollectionChanged is not thread-safe - var collectionChanged = itemRemoved; + var collectionChanged = _itemRemoved; if (collectionChanged != null) { for (var i = Count - 1; i >= 0; --i) - collectionChanged(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, this[i], null, i, true)); + collectionChanged(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, this[i], default, i, true)); } } @@ -69,13 +69,13 @@ protected void ClearItemsEvents() protected override void SetItem(int index, T item) { // Note: Changing CollectionChanged is not thread-safe - var collectionChangedRemoved = itemRemoved; + var collectionChangedRemoved = _itemRemoved; - object? oldItem = collectionChangedRemoved != null ? this[index] : null; - collectionChangedRemoved?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, oldItem, null, index, false)); + T? oldItem = collectionChangedRemoved != null ? this[index] : default; + collectionChangedRemoved?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, oldItem, default, index, false)); base.SetItem(index, item); - itemAdded?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, oldItem, index, false)); + _itemAdded?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, oldItem, index, false)); } } diff --git a/sources/core/Stride.Core/Collections/TrackingCollectionChangedEventArgs.cs b/sources/core/Stride.Core/Collections/TrackingCollectionChangedEventArgs.cs index 41772dda66..d6025ef2d9 100644 --- a/sources/core/Stride.Core/Collections/TrackingCollectionChangedEventArgs.cs +++ b/sources/core/Stride.Core/Collections/TrackingCollectionChangedEventArgs.cs @@ -1,32 +1,17 @@ -// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) -// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. - using System.Collections.Specialized; namespace Stride.Core.Collections; - -public class TrackingCollectionChangedEventArgs : EventArgs +public sealed class TrackingCollectionChangedEventArgs : EventArgs { - public TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction action, object? item, object? oldItem, int index, bool collectionChanged) + public TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction action, TValue? item, TValue? oldItem, int index, bool collectionChanged) { Action = action; Item = item; OldItem = oldItem; - Key = null; Index = index; CollectionChanged = collectionChanged; } - public TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction action, object key, object? item, object? oldItem, bool collectionChanged) - { - Action = action; - Item = item; - OldItem = oldItem; - Key = key; - Index = -1; - CollectionChanged = collectionChanged; - } - /// /// Gets the type of action performed. /// Allowed values are and . @@ -36,15 +21,12 @@ public TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction action, /// /// Gets the added or removed item (if dictionary, value only). /// - public object? Item { get; } + public TValue? Item { get; } /// /// Gets the previous value. Only valid if is and /// - public object? OldItem { get; } - - /// Gets the added or removed key (if dictionary). - public object? Key { get; } + public TValue? OldItem { get; } /// /// Gets the index in the collection (if applicable). diff --git a/sources/core/Stride.Core/Collections/TrackingDictionary.cs b/sources/core/Stride.Core/Collections/TrackingDictionary.cs index c22319c83c..5c6426e543 100644 --- a/sources/core/Stride.Core/Collections/TrackingDictionary.cs +++ b/sources/core/Stride.Core/Collections/TrackingDictionary.cs @@ -18,27 +18,27 @@ namespace Stride.Core.Collections; /// The type of the key. /// The type of the value. [DataSerializer(typeof(DictionaryAllSerializer<,,>), Mode = DataSerializerGenericMode.TypeAndGenericArguments)] -public class TrackingDictionary : IDictionary, IDictionary, ITrackingCollectionChanged +public class TrackingDictionary : IDictionary, IDictionary, ITrackingKeyedCollectionChanged where TKey : notnull { private readonly Dictionary innerDictionary; - private EventHandler? itemAdded; - private EventHandler? itemRemoved; + private EventHandler>? _itemAdded; + private EventHandler>? _itemRemoved; /// - public event EventHandler CollectionChanged + public event EventHandler> CollectionChanged { add { // We keep a list in reverse order for removal, so that we can easily have multiple handlers depending on each others - itemAdded = (EventHandler)Delegate.Combine(itemAdded, value); - itemRemoved = (EventHandler)Delegate.Combine(value, itemRemoved); + _itemAdded = (EventHandler>)Delegate.Combine(_itemAdded, value); + _itemRemoved = (EventHandler>)Delegate.Combine(value, _itemRemoved); } remove { - itemAdded = (EventHandler?)Delegate.Remove(itemAdded, value); - itemRemoved = (EventHandler?)Delegate.Remove(itemRemoved, value); + _itemAdded = (EventHandler>?)Delegate.Remove(_itemAdded, value); + _itemRemoved = (EventHandler>?)Delegate.Remove(_itemRemoved, value); } } @@ -54,7 +54,7 @@ public TrackingDictionary() public void Add(TKey key, TValue value) { innerDictionary.Add(key, value); - itemAdded?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, key, value, null, true)); + _itemAdded?.Invoke(this, new TrackingKeyedCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, key, value, default, true)); } /// @@ -72,9 +72,9 @@ public ICollection Keys /// public bool Remove(TKey key) { - var collectionChanged = itemRemoved; + var collectionChanged = _itemRemoved; if (collectionChanged != null && innerDictionary.TryGetValue(key, out var dictValue)) - collectionChanged(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, key, dictValue, null, true)); + collectionChanged(this, new TrackingKeyedCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, key, dictValue, default, true)); return innerDictionary.Remove(key); } @@ -100,17 +100,17 @@ public TValue this[TKey key] } set { - var collectionChangedRemoved = itemRemoved; + var collectionChangedRemoved = _itemRemoved; if (collectionChangedRemoved != null) { var alreadyExisting = innerDictionary.TryGetValue(key, out var oldValue); if (alreadyExisting) - collectionChangedRemoved(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, key, oldValue, null, false)); + collectionChangedRemoved(this, new TrackingKeyedCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, key, oldValue, default, false)); innerDictionary[key] = value; // Note: CollectionChanged is considered not thread-safe, so no need to skip if null here, shouldn't happen - itemAdded?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, key, innerDictionary[key], oldValue, !alreadyExisting)); + _itemAdded?.Invoke(this, new TrackingKeyedCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, key, innerDictionary[key], oldValue, !alreadyExisting)); } else { @@ -128,7 +128,7 @@ public void Add(KeyValuePair item) /// public void Clear() { - var collectionChanged = itemRemoved; + var collectionChanged = _itemRemoved; if (collectionChanged != null) { foreach (var key in innerDictionary.Keys.ToArray()) @@ -169,7 +169,7 @@ public bool IsReadOnly /// public bool Remove(KeyValuePair item) { - var collectionChanged = itemRemoved; + var collectionChanged = _itemRemoved; if (collectionChanged != null && innerDictionary.Contains(item)) return innerDictionary.Remove(item.Key); diff --git a/sources/core/Stride.Core/Collections/TrackingHashSet.cs b/sources/core/Stride.Core/Collections/TrackingHashSet.cs index 6a337e7e0a..10bb0ac0ba 100644 --- a/sources/core/Stride.Core/Collections/TrackingHashSet.cs +++ b/sources/core/Stride.Core/Collections/TrackingHashSet.cs @@ -12,26 +12,26 @@ namespace Stride.Core.Collections; /// Underlying storage is done with a . /// /// The type of elements in the hash set. -public class TrackingHashSet : ISet, IReadOnlySet, ITrackingCollectionChanged +public class TrackingHashSet : ISet, IReadOnlySet, ITrackingCollectionChanged { private readonly HashSet innerHashSet = []; - private EventHandler? itemAdded; - private EventHandler? itemRemoved; + private EventHandler>? _itemAdded; + private EventHandler>? _itemRemoved; /// - public event EventHandler CollectionChanged + public event EventHandler> CollectionChanged { add { // We keep a list in reverse order for removal, so that we can easily have multiple handlers depending on each others - itemAdded = (EventHandler)Delegate.Combine(itemAdded, value); - itemRemoved = (EventHandler)Delegate.Combine(value, itemRemoved); + _itemAdded = (EventHandler>)Delegate.Combine(_itemAdded, value); + _itemRemoved = (EventHandler>)Delegate.Combine(value, _itemRemoved); } remove { - itemAdded = (EventHandler?)Delegate.Remove(itemAdded, value); - itemRemoved = (EventHandler?)Delegate.Remove(itemRemoved, value); + _itemAdded = (EventHandler>?)Delegate.Remove(_itemAdded, value); + _itemRemoved = (EventHandler>?)Delegate.Remove(_itemRemoved, value); } } @@ -40,7 +40,7 @@ public bool Add(T item) { if (innerHashSet.Add(item)) { - itemAdded?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, null, -1, true)); + _itemAdded?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, default, -1, true)); return true; } @@ -116,7 +116,7 @@ void ICollection.Add(T item) /// public void Clear() { - if (itemRemoved != null) + if (_itemRemoved != null) { foreach (var item in innerHashSet.ToArray()) { @@ -153,7 +153,7 @@ public bool Remove(T item) if (!innerHashSet.Remove(item)) return false; - itemRemoved?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, null, -1, true)); + _itemRemoved?.Invoke(this, new TrackingCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, default, -1, true)); return true; } diff --git a/sources/core/Stride.Core/Collections/TrackingKeyedCollectionChangedEventArgs.cs b/sources/core/Stride.Core/Collections/TrackingKeyedCollectionChangedEventArgs.cs new file mode 100644 index 0000000000..6185c2c743 --- /dev/null +++ b/sources/core/Stride.Core/Collections/TrackingKeyedCollectionChangedEventArgs.cs @@ -0,0 +1,51 @@ +// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp) +// Distributed under the MIT license. See the LICENSE.md file in the project root for more information. + +using System.Collections.Specialized; + +namespace Stride.Core.Collections; + +public sealed class TrackingKeyedCollectionChangedEventArgs : EventArgs +{ + public TrackingKeyedCollectionChangedEventArgs(NotifyCollectionChangedAction action, TKey key, TValue? item, TValue? oldItem, bool collectionChanged) + { + Action = action; + Item = item; + OldItem = oldItem; + Key = key; + Index = -1; + CollectionChanged = collectionChanged; + } + + /// + /// Gets the type of action performed. + /// Allowed values are and . + /// + public NotifyCollectionChangedAction Action { get; } + + /// + /// Gets the added or removed item (if dictionary, value only). + /// + public TValue? Item { get; } + + /// + /// Gets the previous value. Only valid if is and + /// + public TValue? OldItem { get; } + + /// Gets the added or removed key (if dictionary). + public TKey Key { get; } + + /// + /// Gets the index in the collection (if applicable). + /// + public int Index { get; } + + /// + /// Gets a value indicating whether [collection changed (not a replacement but real insertion/removal)]. + /// + /// + /// true if [collection changed]; otherwise, false. + /// + public bool CollectionChanged { get; } +} diff --git a/sources/editor/Stride.Assets.Presentation/AssetEditors/EntityHierarchyEditor/Game/EditorGameNavigationMeshService.cs b/sources/editor/Stride.Assets.Presentation/AssetEditors/EntityHierarchyEditor/Game/EditorGameNavigationMeshService.cs index 3e727fcd6d..83163ce181 100644 --- a/sources/editor/Stride.Assets.Presentation/AssetEditors/EntityHierarchyEditor/Game/EditorGameNavigationMeshService.cs +++ b/sources/editor/Stride.Assets.Presentation/AssetEditors/EntityHierarchyEditor/Game/EditorGameNavigationMeshService.cs @@ -365,7 +365,7 @@ private NavigationMeshDebugVisual CreateDebugVisual(NavigationMesh navigationMes return ret; } - private void GameSystemsOnCollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void GameSystemsOnCollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { if (dynamicNavigationMeshSystem != null) return; diff --git a/sources/editor/Stride.Assets.Presentation/AssetEditors/VisualScriptEditor/BlockNodeVertex.cs b/sources/editor/Stride.Assets.Presentation/AssetEditors/VisualScriptEditor/BlockNodeVertex.cs index b42cb71735..d5f37a6ab0 100644 --- a/sources/editor/Stride.Assets.Presentation/AssetEditors/VisualScriptEditor/BlockNodeVertex.cs +++ b/sources/editor/Stride.Assets.Presentation/AssetEditors/VisualScriptEditor/BlockNodeVertex.cs @@ -45,13 +45,13 @@ internal BlockNodeVertex(VisualScriptBlockViewModel viewModel) viewModel.Block.Slots.CollectionChanged += Slots_CollectionChanged; } - private void Slots_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void Slots_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: { - var slot = (Slot)e.Item; + var slot = e.Item; var slots = slot.Direction == SlotDirection.Input ? InputSlots : OutputSlots; var slotViewModel = new VisualScriptSlotViewModel(ViewModel, slot); slots.Add(slotViewModel); diff --git a/sources/editor/Stride.Assets.Presentation/ViewModel/CodeViewModel.cs b/sources/editor/Stride.Assets.Presentation/ViewModel/CodeViewModel.cs index 547e567254..7de25ea166 100644 --- a/sources/editor/Stride.Assets.Presentation/ViewModel/CodeViewModel.cs +++ b/sources/editor/Stride.Assets.Presentation/ViewModel/CodeViewModel.cs @@ -82,9 +82,9 @@ private async Task InitializeAsync(StrideAssetsViewModel strideAssetsViewModel) projectWatcherCompletion.SetResult(projectWatcher); workspaceCompletion.SetResult(workspace); - void TrackedAssembliesCollectionChanged(object sender, Core.Collections.TrackingCollectionChangedEventArgs e) + void TrackedAssembliesCollectionChanged(object sender, Core.Collections.TrackingCollectionChangedEventArgs e) { - if (((ProjectWatcher.TrackedAssembly)e.Item).Project is { } project) + if ((e.Item).Project is { } project) { switch (e.Action) { diff --git a/sources/engine/Stride.Assets/Scripts/Block.cs b/sources/engine/Stride.Assets/Scripts/Block.cs index 2bec82adcf..f20b7da4ef 100644 --- a/sources/engine/Stride.Assets/Scripts/Block.cs +++ b/sources/engine/Stride.Assets/Scripts/Block.cs @@ -107,15 +107,15 @@ protected virtual void OnSlotRemove(Slot slot) slot.Owner = null; } - private void Slots_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void Slots_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: - OnSlotAdd((Slot)e.Item); + OnSlotAdd(e.Item); break; case NotifyCollectionChangedAction.Remove: - OnSlotRemove((Slot)e.Item); + OnSlotRemove(e.Item); break; default: throw new NotSupportedException(); diff --git a/sources/engine/Stride.Engine/Audio/AudioEmitterProcessor.cs b/sources/engine/Stride.Engine/Audio/AudioEmitterProcessor.cs index dc64f5cc93..1fb04a221b 100644 --- a/sources/engine/Stride.Engine/Audio/AudioEmitterProcessor.cs +++ b/sources/engine/Stride.Engine/Audio/AudioEmitterProcessor.cs @@ -233,7 +233,7 @@ protected override void OnEntityComponentRemoved(Entity entity, AudioEmitterComp data.AudioEmitterComponent.ControllerCollectionChanged -= OnSoundControllerListChanged; } - private void OnListenerCollectionChanged(object o, TrackingCollectionChangedEventArgs args) + private void OnListenerCollectionChanged(object o, TrackingKeyedCollectionChangedEventArgs args) { if (!args.CollectionChanged) // no keys have been added or removed, only one of the values changed return; @@ -249,11 +249,11 @@ private void OnListenerCollectionChanged(object o, TrackingCollectionChangedEven { if (args.Action == NotifyCollectionChangedAction.Add) // A new listener have been added { - soundController.CreateSoundInstance((AudioListenerComponent)args.Key, false); + soundController.CreateSoundInstance(args.Key, false); } else if (args.Action == NotifyCollectionChangedAction.Remove) // A listener have been removed { - soundController.DestroySoundInstances((AudioListenerComponent)args.Key); + soundController.DestroySoundInstances(args.Key); } } } diff --git a/sources/engine/Stride.Engine/Engine/AnimationComponent.cs b/sources/engine/Stride.Engine/Engine/AnimationComponent.cs index d1fb246e23..477000624b 100644 --- a/sources/engine/Stride.Engine/Engine/AnimationComponent.cs +++ b/sources/engine/Stride.Engine/Engine/AnimationComponent.cs @@ -49,9 +49,9 @@ public AnimationComponent() PlayingAnimations.CollectionChanged += PlayingAnimations_CollectionChanged; } - private void PlayingAnimations_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void PlayingAnimations_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { - var item = (PlayingAnimation)e.Item; + var item = e.Item; switch (e.Action) { case NotifyCollectionChangedAction.Remove: diff --git a/sources/engine/Stride.Engine/Engine/AudioEmitterComponent.cs b/sources/engine/Stride.Engine/Engine/AudioEmitterComponent.cs index 6ab40a90b7..48d1713671 100644 --- a/sources/engine/Stride.Engine/Engine/AudioEmitterComponent.cs +++ b/sources/engine/Stride.Engine/Engine/AudioEmitterComponent.cs @@ -189,15 +189,15 @@ private void SoundRemoved(SoundBase sound) } } - private void OnSoundsOnCollectionChanged(object sender, TrackingCollectionChangedEventArgs args) + private void OnSoundsOnCollectionChanged(object sender, TrackingKeyedCollectionChangedEventArgs args) { switch (args.Action) { case NotifyCollectionChangedAction.Add: - SoundAdded((SoundBase)args.Item); + SoundAdded(args.Item); break; case NotifyCollectionChangedAction.Remove: - SoundRemoved((SoundBase)args.Item); + SoundRemoved(args.Item); break; } } diff --git a/sources/engine/Stride.Engine/Engine/SceneInstance.cs b/sources/engine/Stride.Engine/Engine/SceneInstance.cs index cab3b67ca5..0e7c7c7d19 100644 --- a/sources/engine/Stride.Engine/Engine/SceneInstance.cs +++ b/sources/engine/Stride.Engine/Engine/SceneInstance.cs @@ -151,9 +151,9 @@ private void Add(Scene scene) } scene.Entities.CollectionChanged -= DealWithTempChanges; - void DealWithTempChanges(object sender, TrackingCollectionChangedEventArgs e) + void DealWithTempChanges(object sender, TrackingCollectionChangedEventArgs e) { - Entity entity = (Entity)e.Item; + Entity entity = e.Item; if (e.Action == NotifyCollectionChangedAction.Remove) { if (entitiesToAdd.Remove(entity) == false) @@ -182,9 +182,9 @@ void DealWithTempChanges(object sender, TrackingCollectionChangedEventArgs e) } scene.Children.CollectionChanged -= DealWithTempChanges; - void DealWithTempChanges(object sender, TrackingCollectionChangedEventArgs e) + void DealWithTempChanges(object sender, TrackingCollectionChangedEventArgs e) { - Scene subScene = (Scene)e.Item; + Scene subScene = e.Item; if (e.Action == NotifyCollectionChangedAction.Remove) { if (scenesToAdd.Remove(subScene) == false) @@ -222,28 +222,28 @@ private void Remove(Scene scene) } } - private void Entities_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void Entities_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: - Add((Entity)e.Item); + Add(e.Item); break; case NotifyCollectionChangedAction.Remove: - Remove((Entity)e.Item); + Remove(e.Item); break; } } - private void Children_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void Children_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: - Add((Scene)e.Item); + Add(e.Item); break; case NotifyCollectionChangedAction.Remove: - Remove((Scene)e.Item); + Remove(e.Item); break; } } @@ -271,9 +271,9 @@ private void RemoveRendererTypes() registeredRenderProcessorTypes.Clear(); } - private void VisibilityGroups_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void VisibilityGroups_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { - var visibilityGroup = (VisibilityGroup)e.Item; + var visibilityGroup = e.Item; switch (e.Action) { diff --git a/sources/engine/Stride.Games/GameSystemCollection.cs b/sources/engine/Stride.Games/GameSystemCollection.cs index ef59929979..33d7534378 100644 --- a/sources/engine/Stride.Games/GameSystemCollection.cs +++ b/sources/engine/Stride.Games/GameSystemCollection.cs @@ -238,7 +238,7 @@ public void Dispose() } } - private void GameSystems_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void GameSystems_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Add) { @@ -250,9 +250,9 @@ private void GameSystems_CollectionChanged(object sender, TrackingCollectionChan } } - private void GameSystems_ItemAdded(object sender, TrackingCollectionChangedEventArgs e) + private void GameSystems_ItemAdded(object sender, TrackingCollectionChangedEventArgs e) { - var gameSystem = (IGameSystemBase)e.Item; + var gameSystem = e.Item; // If the game is already running, then we can initialize the game system now if (State >= GameSystemState.Initialized) @@ -298,9 +298,9 @@ private void GameSystems_ItemAdded(object sender, TrackingCollectionChangedEvent } } - private void GameSystems_ItemRemoved(object sender, TrackingCollectionChangedEventArgs e) + private void GameSystems_ItemRemoved(object sender, TrackingCollectionChangedEventArgs e) { - var gameSystem = (IGameSystemBase)e.Item; + var gameSystem = e.Item; if (State == GameSystemState.None) { diff --git a/sources/engine/Stride.Input/InputManager.cs b/sources/engine/Stride.Input/InputManager.cs index 5b16714c14..dd8dd2990f 100644 --- a/sources/engine/Stride.Input/InputManager.cs +++ b/sources/engine/Stride.Input/InputManager.cs @@ -72,7 +72,7 @@ public void Clear() private GameContext gameContext; - private Dictionary> devicesCollectionChangedActions = new Dictionary>(); + private Dictionary>> devicesCollectionChangedActions = []; #if STRIDE_INPUT_RAWINPUT private bool rawInputEnabled = false; @@ -584,16 +584,16 @@ public void Resume() } } - private void SourcesOnCollectionChanged(object o, TrackingCollectionChangedEventArgs e) + private void SourcesOnCollectionChanged(object o, TrackingCollectionChangedEventArgs e) { - var source = (IInputSource)e.Item; + var source = e.Item; switch (e.Action) { case NotifyCollectionChangedAction.Add: if (Sources.Count(x => x == source) > 1) throw new InvalidOperationException("Input Source already added"); - EventHandler eventHandler = (sender, args) => InputDevicesOnCollectionChanged(source, args); + EventHandler> eventHandler = (sender, args) => InputDevicesOnCollectionChanged(source, args); devicesCollectionChangedActions.Add(source, eventHandler); source.Devices.CollectionChanged += eventHandler; source.Initialize(this); @@ -722,15 +722,15 @@ protected override void Destroy() } } - private void GesturesOnCollectionChanged(object sender, TrackingCollectionChangedEventArgs trackingCollectionChangedEventArgs) + private void GesturesOnCollectionChanged(object sender, TrackingCollectionChangedEventArgs trackingCollectionChangedEventArgs) { switch (trackingCollectionChangedEventArgs.Action) { case NotifyCollectionChangedAction.Add: - StartGestureRecognition((GestureConfig)trackingCollectionChangedEventArgs.Item); + StartGestureRecognition(trackingCollectionChangedEventArgs.Item); break; case NotifyCollectionChangedAction.Remove: - StopGestureRecognition((GestureConfig)trackingCollectionChangedEventArgs.Item); + StopGestureRecognition(trackingCollectionChangedEventArgs.Item); break; case NotifyCollectionChangedAction.Replace: case NotifyCollectionChangedAction.Reset: @@ -762,15 +762,15 @@ private void SetMousePosition(Vector2 normalizedPosition) } } - private void InputDevicesOnCollectionChanged(IInputSource source, TrackingCollectionChangedEventArgs e) + private void InputDevicesOnCollectionChanged(IInputSource source, TrackingKeyedCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: - OnInputDeviceAdded(source, (IInputDevice)e.Item); + OnInputDeviceAdded(source, e.Item); break; case NotifyCollectionChangedAction.Remove: - OnInputDeviceRemoved((IInputDevice)e.Item); + OnInputDeviceRemoved(e.Item); break; default: throw new InvalidOperationException("Unsupported collection operation"); diff --git a/sources/engine/Stride.Input/VirtualButton/VirtualButtonConfig.cs b/sources/engine/Stride.Input/VirtualButton/VirtualButtonConfig.cs index 8af14f7622..c718dc49ee 100644 --- a/sources/engine/Stride.Input/VirtualButton/VirtualButtonConfig.cs +++ b/sources/engine/Stride.Input/VirtualButton/VirtualButtonConfig.cs @@ -117,9 +117,9 @@ public virtual bool IsReleased(InputManager inputManager, object name) return false; } - private void Bindings_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void Bindings_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { - var virtualButtonBinding = (VirtualButtonBinding)e.Item; + var virtualButtonBinding = e.Item; switch (e.Action) { case NotifyCollectionChangedAction.Add: diff --git a/sources/engine/Stride.Navigation/Processors/NavigationProcessor.cs b/sources/engine/Stride.Navigation/Processors/NavigationProcessor.cs index 3fb1430a31..b07d3c79a0 100644 --- a/sources/engine/Stride.Navigation/Processors/NavigationProcessor.cs +++ b/sources/engine/Stride.Navigation/Processors/NavigationProcessor.cs @@ -180,7 +180,7 @@ private void UpdateSceneOffset(AssociatedData data) data.Component.SceneOffset = data.Component.NavigationMesh != null ? data.Component.Entity.Scene.Offset : Vector3.Zero; } - private void GameSystemsOnCollectionChanged(object sender, TrackingCollectionChangedEventArgs trackingCollectionChangedEventArgs) + private void GameSystemsOnCollectionChanged(object sender, TrackingCollectionChangedEventArgs trackingCollectionChangedEventArgs) { TryRegisterDynamicNavigationMeshSystem(); } diff --git a/sources/engine/Stride.Rendering/Rendering/Lights/ForwardLightingRenderFeature.cs b/sources/engine/Stride.Rendering/Rendering/Lights/ForwardLightingRenderFeature.cs index b4f876a04b..8645e920aa 100644 --- a/sources/engine/Stride.Rendering/Rendering/Lights/ForwardLightingRenderFeature.cs +++ b/sources/engine/Stride.Rendering/Rendering/Lights/ForwardLightingRenderFeature.cs @@ -686,19 +686,19 @@ private RenderLightCollectionGroup GetLightGroup(RenderViewLightData renderViewD return lightGroup; } - private void LightRenderers_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void LightRenderers_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: { - var item = e.Item as LightGroupRendererBase; + var item = e.Item; item?.Initialize(Context); break; } case NotifyCollectionChangedAction.Remove: { - var item = e.OldItem as LightGroupRendererBase; + var item = e.OldItem; item?.Unload(); break; } diff --git a/sources/engine/Stride.Rendering/Rendering/MeshRenderFeature.cs b/sources/engine/Stride.Rendering/Rendering/MeshRenderFeature.cs index 58d9ea471e..e32a764683 100644 --- a/sources/engine/Stride.Rendering/Rendering/MeshRenderFeature.cs +++ b/sources/engine/Stride.Rendering/Rendering/MeshRenderFeature.cs @@ -255,9 +255,9 @@ public override void Flush(RenderDrawContext context) } } - private void RenderFeatures_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void RenderFeatures_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) { - var renderFeature = (SubRenderFeature)e.Item; + var renderFeature = e.Item; switch (e.Action) { diff --git a/sources/engine/Stride.Rendering/Rendering/Model.cs b/sources/engine/Stride.Rendering/Rendering/Model.cs index 9e5cc455d8..23a14ed7f6 100644 --- a/sources/engine/Stride.Rendering/Rendering/Model.cs +++ b/sources/engine/Stride.Rendering/Rendering/Model.cs @@ -146,9 +146,9 @@ public Model Instantiate() return result; } - private void Children_CollectionChanged(object sender, TrackingCollectionChangedEventArgs e) + private void Children_CollectionChanged(object sender, TrackingKeyedCollectionChangedEventArgs e) { - var child = (Model)e.Item; + var child = e.Item; switch (e.Action) { case NotifyCollectionChangedAction.Add: diff --git a/sources/engine/Stride.UI/Panels/Grid.cs b/sources/engine/Stride.UI/Panels/Grid.cs index 549d73c6d3..5696261400 100644 --- a/sources/engine/Stride.UI/Panels/Grid.cs +++ b/sources/engine/Stride.UI/Panels/Grid.cs @@ -72,9 +72,9 @@ public Grid() LayerDefinitions.CollectionChanged += DefinitionCollectionChanged; } - private void DefinitionCollectionChanged(object sender, TrackingCollectionChangedEventArgs trackingCollectionChangedEventArgs) + private void DefinitionCollectionChanged(object sender, TrackingCollectionChangedEventArgs trackingCollectionChangedEventArgs) { - var modifiedElement = (StripDefinition)trackingCollectionChangedEventArgs.Item; + var modifiedElement = trackingCollectionChangedEventArgs.Item; switch (trackingCollectionChangedEventArgs.Action) { case NotifyCollectionChangedAction.Add: diff --git a/sources/engine/Stride.UI/Panels/Panel.cs b/sources/engine/Stride.UI/Panels/Panel.cs index 50ff46fc34..823f1075f8 100644 --- a/sources/engine/Stride.UI/Panels/Panel.cs +++ b/sources/engine/Stride.UI/Panels/Panel.cs @@ -114,9 +114,9 @@ protected Panel() /// /// Sender of the event /// Argument indicating what changed in the collection - protected void LogicalChildrenChanged(object sender, TrackingCollectionChangedEventArgs trackingCollectionChangedEventArgs) + protected void LogicalChildrenChanged(object sender, TrackingCollectionChangedEventArgs trackingCollectionChangedEventArgs) { - var modifiedElement = (UIElement)trackingCollectionChangedEventArgs.Item; + var modifiedElement = trackingCollectionChangedEventArgs.Item; var elementIndex = trackingCollectionChangedEventArgs.Index; switch (trackingCollectionChangedEventArgs.Action) { diff --git a/sources/presentation/Stride.Core.Presentation.Graph/Controls/NodeEdgeControl.cs b/sources/presentation/Stride.Core.Presentation.Graph/Controls/NodeEdgeControl.cs index 824d4f2ca0..31d254ab07 100644 --- a/sources/presentation/Stride.Core.Presentation.Graph/Controls/NodeEdgeControl.cs +++ b/sources/presentation/Stride.Core.Presentation.Graph/Controls/NodeEdgeControl.cs @@ -214,7 +214,7 @@ public override void UpdateEdge(bool updateLabel = true) Visibility = Visibility.Visible; } - private void UpdateSourceConnectors(object sender, TrackingCollectionChangedEventArgs e) + private void UpdateSourceConnectors(object sender, TrackingKeyedCollectionChangedEventArgs e) { // Unregister ourselves ((NodeVertexControl)Source).Connectors.CollectionChanged -= UpdateSourceConnectors; @@ -223,7 +223,7 @@ private void UpdateSourceConnectors(object sender, TrackingCollectionChangedEven UpdateEdge(); } - private void UpdateTargetConnectors(object sender, TrackingCollectionChangedEventArgs e) + private void UpdateTargetConnectors(object sender, TrackingKeyedCollectionChangedEventArgs e) { // Unregister ourselves ((NodeVertexControl)Target).Connectors.CollectionChanged -= UpdateTargetConnectors;