1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Nodes - Improved changing pin types without reconnecting pins

UI - Fixed possible lingering UI elements in node editor and several other places
This commit is contained in:
Robert 2022-09-03 10:16:24 +02:00
parent eca8985fc4
commit cdd814d920
8 changed files with 27 additions and 47 deletions

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Artemis.Core.Events; using Artemis.Core.Events;
namespace Artemis.Core; namespace Artemis.Core;
@ -143,30 +144,20 @@ public abstract class Pin : CorePropertyChanged, IPin
/// <param name="currentType">The backing field of the current type of the pin.</param> /// <param name="currentType">The backing field of the current type of the pin.</param>
protected void ChangeType(Type type, ref Type currentType) protected void ChangeType(Type type, ref Type currentType)
{ {
// Enums are a special case that disconnect and, if still compatible, reconnect if (currentType == type)
if (type.IsEnum && currentType.IsEnum) return;
{
List<IPin> connections = new(ConnectedTo);
DisconnectAll();
// Change the type bool changingEnums = type.IsEnum && currentType.IsEnum;
SetAndNotify(ref currentType, type, nameof(Type));
IsNumeric = type == typeof(Numeric);
foreach (IPin pin in connections.Where(p => p.IsTypeCompatible(type))) List<IPin> connections = new(ConnectedTo);
ConnectTo(pin); DisconnectAll();
}
// Disconnect pins incompatible with the new type
else
{
List<IPin> toDisconnect = ConnectedTo.Where(p => !p.IsTypeCompatible(type, false)).ToList();
foreach (IPin pin in toDisconnect)
DisconnectFrom(pin);
// Change the type // Change the type
SetAndNotify(ref currentType, type, nameof(Type)); SetAndNotify(ref currentType, type, nameof(Type));
IsNumeric = type == typeof(Numeric); IsNumeric = type == typeof(Numeric);
}
foreach (IPin pin in connections.Where(p => p.IsTypeCompatible(type, changingEnums)))
ConnectTo(pin);
} }
#endregion #endregion

View File

@ -32,7 +32,7 @@ public class LayerHintsDialogViewModel : DialogViewModelBase<bool>
.Subscribe(c => AdaptionHints.Add(CreateHintViewModel(c.EventArgs.AdaptionHint))) .Subscribe(c => AdaptionHints.Add(CreateHintViewModel(c.EventArgs.AdaptionHint)))
.DisposeWith(d); .DisposeWith(d);
Observable.FromEventPattern<LayerAdapterHintEventArgs>(x => layer.Adapter.AdapterHintRemoved += x, x => layer.Adapter.AdapterHintRemoved -= x) Observable.FromEventPattern<LayerAdapterHintEventArgs>(x => layer.Adapter.AdapterHintRemoved += x, x => layer.Adapter.AdapterHintRemoved -= x)
.Subscribe(c => AdaptionHints.Remove(AdaptionHints.FirstOrDefault(h => h.AdaptionHint == c.EventArgs.AdaptionHint)!)) .Subscribe(c => AdaptionHints.RemoveMany(AdaptionHints.Where(h => h.AdaptionHint == c.EventArgs.AdaptionHint)))
.DisposeWith(d); .DisposeWith(d);
AdaptionHints.AddRange(Layer.Adapter.AdaptionHints.Select(CreateHintViewModel)); AdaptionHints.AddRange(Layer.Adapter.AdaptionHints.Select(CreateHintViewModel));

View File

@ -42,7 +42,7 @@ public class TimelinePropertyViewModel<T> : ActivatableViewModelBase, ITimelineP
.Subscribe(e => _keyframes.Add((LayerPropertyKeyframe<T>) e.EventArgs.Keyframe)) .Subscribe(e => _keyframes.Add((LayerPropertyKeyframe<T>) e.EventArgs.Keyframe))
.DisposeWith(d); .DisposeWith(d);
Observable.FromEventPattern<LayerPropertyKeyframeEventArgs>(x => LayerProperty.KeyframeRemoved += x, x => LayerProperty.KeyframeRemoved -= x) Observable.FromEventPattern<LayerPropertyKeyframeEventArgs>(x => LayerProperty.KeyframeRemoved += x, x => LayerProperty.KeyframeRemoved -= x)
.Subscribe(e => _keyframes.Remove((LayerPropertyKeyframe<T>) e.EventArgs.Keyframe)) .Subscribe(e => _keyframes.RemoveMany(_keyframes.Items.Where(k => k == e.EventArgs.Keyframe)))
.DisposeWith(d); .DisposeWith(d);
_keyframes.Edit(k => _keyframes.Edit(k =>

View File

@ -64,7 +64,7 @@ public class SidebarCategoryViewModel : ActivatableViewModelBase
.Subscribe(e => profileConfigurations.Add(e.EventArgs.ProfileConfiguration)) .Subscribe(e => profileConfigurations.Add(e.EventArgs.ProfileConfiguration))
.DisposeWith(d); .DisposeWith(d);
Observable.FromEventPattern<ProfileConfigurationEventArgs>(x => profileCategory.ProfileConfigurationRemoved += x, x => profileCategory.ProfileConfigurationRemoved -= x) Observable.FromEventPattern<ProfileConfigurationEventArgs>(x => profileCategory.ProfileConfigurationRemoved += x, x => profileCategory.ProfileConfigurationRemoved -= x)
.Subscribe(e => profileConfigurations.Remove(e.EventArgs.ProfileConfiguration)) .Subscribe(e => profileConfigurations.RemoveMany(profileConfigurations.Items.Where(c => c == e.EventArgs.ProfileConfiguration)))
.DisposeWith(d); .DisposeWith(d);
profileEditorService.ProfileConfiguration.Subscribe(p => SelectedProfileConfiguration = ProfileConfigurations.FirstOrDefault(c => ReferenceEquals(c.ProfileConfiguration, p))) profileEditorService.ProfileConfiguration.Subscribe(p => SelectedProfileConfiguration = ProfileConfigurations.FirstOrDefault(c => ReferenceEquals(c.ProfileConfiguration, p)))

View File

@ -50,10 +50,10 @@ public class NodeScriptViewModel : ActivatableViewModelBase
this.WhenActivated(d => this.WhenActivated(d =>
{ {
Observable.FromEventPattern<SingleValueEventArgs<INode>>(x => NodeScript.NodeAdded += x, x => NodeScript.NodeAdded -= x) Observable.FromEventPattern<SingleValueEventArgs<INode>>(x => NodeScript.NodeAdded += x, x => NodeScript.NodeAdded -= x)
.Subscribe(e => HandleNodeAdded(e.EventArgs)) .Subscribe(e => _nodeViewModels.Add(_nodeVmFactory.NodeViewModel(this, e.EventArgs.Value)))
.DisposeWith(d); .DisposeWith(d);
Observable.FromEventPattern<SingleValueEventArgs<INode>>(x => NodeScript.NodeRemoved += x, x => NodeScript.NodeRemoved -= x) Observable.FromEventPattern<SingleValueEventArgs<INode>>(x => NodeScript.NodeRemoved += x, x => NodeScript.NodeRemoved -= x)
.Subscribe(e => HandleNodeRemoved(e.EventArgs)) .Subscribe(e => _nodeViewModels.RemoveMany(_nodeViewModels.Items.Where(n => n.Node == e.EventArgs.Value)))
.DisposeWith(d); .DisposeWith(d);
}); });
@ -276,16 +276,4 @@ public class NodeScriptViewModel : ActivatableViewModelBase
private void ExecutePasteSelected() private void ExecutePasteSelected()
{ {
} }
private void HandleNodeAdded(SingleValueEventArgs<INode> eventArgs)
{
_nodeViewModels.Add(_nodeVmFactory.NodeViewModel(this, eventArgs.Value));
}
private void HandleNodeRemoved(SingleValueEventArgs<INode> eventArgs)
{
NodeViewModel? toRemove = NodeViewModels.FirstOrDefault(vm => ReferenceEquals(vm.Node, eventArgs.Value));
if (toRemove != null)
_nodeViewModels.Remove(toRemove);
}
} }

View File

@ -93,7 +93,7 @@ public class NodeViewModel : ActivatableViewModelBase
}) })
.DisposeWith(d); .DisposeWith(d);
Observable.FromEventPattern<SingleValueEventArgs<IPin>>(x => Node.PinRemoved += x, x => Node.PinRemoved -= x) Observable.FromEventPattern<SingleValueEventArgs<IPin>>(x => Node.PinRemoved += x, x => Node.PinRemoved -= x)
.Subscribe(p => nodePins!.Remove(nodePins.Items.FirstOrDefault(vm => vm.Pin == p.EventArgs.Value))) .Subscribe(p => nodePins.RemoveMany(nodePins.Items.Where(vm => vm.Pin == p.EventArgs.Value)))
.DisposeWith(d); .DisposeWith(d);
nodePins.Edit(l => nodePins.Edit(l =>
{ {
@ -118,7 +118,7 @@ public class NodeViewModel : ActivatableViewModelBase
}) })
.DisposeWith(d); .DisposeWith(d);
Observable.FromEventPattern<SingleValueEventArgs<IPinCollection>>(x => Node.PinCollectionRemoved += x, x => Node.PinCollectionRemoved -= x) Observable.FromEventPattern<SingleValueEventArgs<IPinCollection>>(x => Node.PinCollectionRemoved += x, x => Node.PinCollectionRemoved -= x)
.Subscribe(p => nodePinCollections!.Remove(nodePinCollections.Items.FirstOrDefault(vm => vm.PinCollection == p.EventArgs.Value))) .Subscribe(p => nodePinCollections.RemoveMany(nodePinCollections.Items.Where(vm => vm.PinCollection == p.EventArgs.Value)))
.DisposeWith(d); .DisposeWith(d);
nodePinCollections.Edit(l => nodePinCollections.Edit(l =>
{ {
@ -161,7 +161,7 @@ public class NodeViewModel : ActivatableViewModelBase
set => RaiseAndSetIfChanged(ref _isSelected, value); set => RaiseAndSetIfChanged(ref _isSelected, value);
} }
public ReactiveCommand<Unit,Unit> ShowBrokenState { get; } public ReactiveCommand<Unit, Unit> ShowBrokenState { get; }
public ReactiveCommand<Unit, Unit> DeleteNode { get; } public ReactiveCommand<Unit, Unit> DeleteNode { get; }
public void StartDrag(Point mouseStartPosition) public void StartDrag(Point mouseStartPosition)

View File

@ -30,7 +30,7 @@ public abstract class PinCollectionViewModel : ActivatableViewModelBase
.Subscribe(e => PinViewModels.Add(CreatePinViewModel(e.EventArgs.Value))) .Subscribe(e => PinViewModels.Add(CreatePinViewModel(e.EventArgs.Value)))
.DisposeWith(d); .DisposeWith(d);
Observable.FromEventPattern<SingleValueEventArgs<IPin>>(x => PinCollection.PinRemoved += x, x => PinCollection.PinRemoved -= x) Observable.FromEventPattern<SingleValueEventArgs<IPin>>(x => PinCollection.PinRemoved += x, x => PinCollection.PinRemoved -= x)
.Subscribe(e => PinViewModels.RemoveMany(PinViewModels.Where(p => p.Pin == e.EventArgs.Value).ToList())) .Subscribe(e => PinViewModels.RemoveMany(PinViewModels.Where(p => p.Pin == e.EventArgs.Value)))
.DisposeWith(d); .DisposeWith(d);
}); });

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Linq;
using System.Reactive; using System.Reactive;
using System.Reactive.Linq; using System.Reactive.Linq;
using Artemis.Core; using Artemis.Core;
@ -38,7 +39,7 @@ public abstract class PinViewModel : ActivatableViewModelBase
.Subscribe(e => connectedPins.Add(e.EventArgs.Value)) .Subscribe(e => connectedPins.Add(e.EventArgs.Value))
.DisposeWith(d); .DisposeWith(d);
Observable.FromEventPattern<SingleValueEventArgs<IPin>>(x => Pin.PinDisconnected += x, x => Pin.PinDisconnected -= x) Observable.FromEventPattern<SingleValueEventArgs<IPin>>(x => Pin.PinDisconnected += x, x => Pin.PinDisconnected -= x)
.Subscribe(e => connectedPins.Remove(e.EventArgs.Value)) .Subscribe(e => connectedPins.RemoveMany(connectedPins.Items.Where(p => p == e.EventArgs.Value)))
.DisposeWith(d); .DisposeWith(d);
Pin.WhenAnyValue(p => p.Type).Subscribe(_ => UpdatePinColor()).DisposeWith(d); Pin.WhenAnyValue(p => p.Type).Subscribe(_ => UpdatePinColor()).DisposeWith(d);
}); });