port from perforce
This commit is contained in:
67
intromat/Intromat/Views/CodeGenNetworkView.xaml.cs
Normal file
67
intromat/Intromat/Views/CodeGenNetworkView.xaml.cs
Normal file
@@ -0,0 +1,67 @@
|
||||
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; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user