using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reactive.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using DynamicData; using NodeNetwork; using NodeNetwork.Toolkit; using NodeNetwork.Toolkit.Layout.ForceDirected; using NodeNetwork.Toolkit.ValueNode; using NodeNetwork.ViewModels; using NodeNetwork.Views; using ReactiveUI; namespace StressTest { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private readonly NetworkViewModel _network; public MainWindow() { InitializeComponent(); NNViewRegistrar.RegisterSplat(); _network = new NetworkViewModel(); _network.Validator = network => { bool containsLoops = GraphAlgorithms.FindLoops(network).Any(); if (containsLoops) { return new NetworkValidationResult(false, false, new ErrorMessageViewModel("Network contains loops!")); } return new NetworkValidationResult(true, true, null); }; _network.Nodes.Add(CreateNode()); NetworkView.ViewModel = _network; this.WhenAnyValue(v => v.ShowOutputChecky.IsChecked).Subscribe(isChecked => { _network.Nodes.Items.First().Outputs.Items.ElementAt(0).Visibility = isChecked.Value ? EndpointVisibility.AlwaysVisible : EndpointVisibility.AlwaysHidden; }); } public NodeViewModel CreateNode() { var input = new ValueNodeInputViewModel { Name = "A" }; var output = new ValueNodeOutputViewModel { Name = "B", Value = Observable.CombineLatest(input.ValueChanged, Observable.Return(-1), (i1, i2) => (int?)(i1 ?? i2)+1) }; NodeViewModel node = new NodeViewModel(); node.Inputs.Add(input); node.Outputs.Add(output); output.Value.Subscribe(v => node.Name = v.ToString()); return node; } private void GenerateNodes(object sender, RoutedEventArgs e) { _network.Nodes.Clear(); int maxX = 10; int maxY = 10; for (int x = 0; x < maxX; x++) { for (int y = 0; y < maxY; y++) { NodeViewModel node = CreateNode(); node.Position = new Point(x * 200, y * 200); _network.Nodes.Add(node); Debug.WriteLine($"Added node {(x*maxY)+y}"); } } } private void GenerateConnections(object sender, RoutedEventArgs e) { var connections = _network.Nodes.Items.Zip(_network.Nodes.Items.Skip(1), (node1, node2) => _network.ConnectionFactory(node2.Inputs.Items.ElementAt(0), node1.Outputs.Items.ElementAt(0))); _network.Connections.AddRange(connections); } private void Clear(object sender, RoutedEventArgs e) { _network.Nodes.Clear(); _network.Connections.Clear(); } private void AutoLayout(object sender, RoutedEventArgs e) { var layout = new ForceDirectedLayouter(); layout.Layout(new Configuration { Network = _network }, 1000); } } }