Files
bluflame/intromat/Intromat/Views/CodeGenNetworkView.xaml.cs
2026-04-18 22:31:51 +02:00

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; }
}
}