using System; using System.Collections.Generic; using System.Linq; using System.Reactive.Disposables; using System.Reactive.Linq; using System.Windows; using System.Windows.Controls; using Intromat.ViewModels; using NodeNetwork.ViewModels; using NodeNetwork.Views; using ReactiveUI; namespace Intromat.Views { /// /// Interaction logic for CodeGenNetworkView.xaml /// public partial class CodeGenNetworkView : IViewFor { private readonly MenuItem _groupNodesButton; private readonly MenuItem _openGroupButton; private readonly MenuItem _ungroupNodesButton; public CodeGenNetworkView() { InitializeComponent(); var nodeMenu = ((ContextMenu)Resources["nodeMenu"]).Items.OfType().ToList(); _groupNodesButton = nodeMenu.First(c => c.Name == nameof(_groupNodesButton)); _ungroupNodesButton = nodeMenu.First(c => c.Name == nameof(_ungroupNodesButton)); _openGroupButton = nodeMenu.First(c => c.Name == nameof(_openGroupButton)); this.WhenActivated(d => { Observable.FromEventPattern(handler => _network.NodeMoveStart += handler, handler => _network.NodeMoveStart -= handler) .Select(e => e.EventArgs.Nodes.ToDictionary(node => node, node => node.Position)) .Zip(Observable.FromEventPattern(handler => _network.NodeMoveEnd += handler, handler => _network.NodeMoveEnd -= handler)) .Select(pair => pair.Second.EventArgs.Nodes.ToDictionary(node => node, node => (pair.First[node], node.Position))) .Subscribe(RecordNodeDragAction) .DisposeWith(d); var networkViewModel = ViewModel!; _network.ViewModel = networkViewModel; this.BindCommand(networkViewModel, vm => vm.GroupNodes, v => v._groupNodesButton).DisposeWith(d); this.BindCommand(networkViewModel, vm => vm.UngroupNodes, v => v._ungroupNodesButton).DisposeWith(d); this.BindCommand(networkViewModel, vm => vm.OpenGroup, v => v._openGroupButton).DisposeWith(d); }); } private void RecordNodeDragAction(IDictionary nodePositions) { var undoRedo = ViewModel!.Document.MainViewModel.UndoRedo; undoRedo.PushGroup(ViewModel.Document); foreach (var (node, (before, after)) in nodePositions) undoRedo.Record(new UndoItem(ViewModel.Document, node, v => v.Position, before, after)); undoRedo.PopGroup(); } object? IViewFor.ViewModel { get => ViewModel; set => ViewModel = (CodeGenNetworkViewModel?)value; } public CodeGenNetworkViewModel? ViewModel { get; set; } } }