68 lines
3.0 KiB
C#
68 lines
3.0 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for CodeGenNetworkView.xaml
|
|
/// </summary>
|
|
public partial class CodeGenNetworkView : IViewFor<CodeGenNetworkViewModel>
|
|
{
|
|
private readonly MenuItem _groupNodesButton;
|
|
private readonly MenuItem _openGroupButton;
|
|
private readonly MenuItem _ungroupNodesButton;
|
|
|
|
public CodeGenNetworkView()
|
|
{
|
|
InitializeComponent();
|
|
|
|
var nodeMenu = ((ContextMenu)Resources["nodeMenu"]).Items.OfType<MenuItem>().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<NetworkView.NodeMoveStartDelegate, NetworkView.NodeMoveStartEventArgs>(handler => _network.NodeMoveStart += handler, handler => _network.NodeMoveStart -= handler)
|
|
.Select(e => e.EventArgs.Nodes.ToDictionary(node => node, node => node.Position))
|
|
.Zip(Observable.FromEventPattern<NetworkView.NodeMoveEndDelegate, NetworkView.NodeMoveEndEventArgs>(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<NodeViewModel, (Point, Point)> nodePositions)
|
|
{
|
|
var undoRedo = ViewModel!.Document.MainViewModel.UndoRedo;
|
|
undoRedo.PushGroup(ViewModel.Document);
|
|
foreach (var (node, (before, after)) in nodePositions)
|
|
undoRedo.Record(new UndoItem<NodeViewModel, Point>(ViewModel.Document, node, v => v.Position, before, after));
|
|
undoRedo.PopGroup();
|
|
}
|
|
|
|
object? IViewFor.ViewModel
|
|
{
|
|
get => ViewModel;
|
|
set => ViewModel = (CodeGenNetworkViewModel?)value;
|
|
}
|
|
|
|
public CodeGenNetworkViewModel? ViewModel { get; set; }
|
|
}
|
|
}
|