port from perforce

This commit is contained in:
2026-04-18 22:31:51 +02:00
commit 8d0ab5b7cc
8409 changed files with 3972376 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:NodeNetwork.Views"
xmlns:controls="clr-namespace:NodeNetwork.Views.Controls">
<Style TargetType="{x:Type views:ConnectionView}">
<Setter Property="RegularBrush" Value="White"/>
<Setter Property="ErrorBrush" Value="DarkRed"/>
<Setter Property="HighlightBrush" Value="Yellow"/>
<Setter Property="MarkedForDeleteBrush" Value="Red"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="views:ConnectionView">
<controls:FillPanel>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="{x:Static views:ConnectionView.HighlightVisualStatesGroup}">
<VisualState Name="{x:Static views:ConnectionView.HighlightedState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="HighlightPath" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState Name="{x:Static views:ConnectionView.NonHighlightedState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="HighlightPath" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup Name="{x:Static views:ConnectionView.ErrorVisualStatesGroup}">
<VisualState Name="{x:Static views:ConnectionView.ErrorState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="ErrorPath" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState Name="{x:Static views:ConnectionView.NonErrorState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="ErrorPath" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup Name="{x:Static views:ConnectionView.MarkedForDeleteVisualStatesGroup}">
<VisualState Name="{x:Static views:ConnectionView.MarkedForDeleteState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="DeleteMarkPath" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState Name="{x:Static views:ConnectionView.NotMarkedForDeleteState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="DeleteMarkPath" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Path x:Name="RegularPath" StrokeThickness="2" IsHitTestVisible="False" Stroke="{TemplateBinding RegularBrush}" Data="{TemplateBinding Geometry}"/>
<Path x:Name="ErrorPath" StrokeThickness="2" IsHitTestVisible="False" Stroke="{TemplateBinding ErrorBrush}" Data="{TemplateBinding Geometry}"/>
<Path x:Name="DeleteMarkPath" StrokeThickness="2" IsHitTestVisible="False" Stroke="{TemplateBinding MarkedForDeleteBrush}" Data="{TemplateBinding Geometry}"/>
<Path x:Name="HighlightPath" StrokeThickness="2" IsHitTestVisible="False" Stroke="{TemplateBinding HighlightBrush}" Data="{TemplateBinding Geometry}"/>
</controls:FillPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,53 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:reactiveUi="http://reactiveui.net"
xmlns:wpf="clr-namespace:NodeNetwork.Utilities.WPF">
<wpf:NullVisibilityConverter x:Key="NullConverter"/>
<ControlTemplate x:Key="LeftAlignedEndpoint">
<Grid Margin="-10, 0, 0, 5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="5"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center">
<Image x:Name="Icon" MaxWidth="20" MaxHeight="20" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0,0,5,0" Visibility="{Binding Icon, Mode=OneWay, Converter={StaticResource NullConverter}}"/>
<TextBlock x:Name="NameLabel" TextTrimming="CharacterEllipsis" FontSize="14" Width="auto" Foreground="White" VerticalAlignment="Center"/>
</StackPanel>
<reactiveUi:ViewModelViewHost x:Name="EndpointHost" Grid.Column="0" Grid.Row="0" Margin="0,4.9,10,4.9" Width="20" Height="20"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" IsTabStop="False"/>
<reactiveUi:ViewModelViewHost x:Name="EditorHost" Grid.Column="1" VerticalContentAlignment="Center" IsTabStop="False"/>
</Grid>
</ControlTemplate>
<ControlTemplate x:Key="RightAlignedEndpoint">
<Grid Margin="0, 0, -10, 5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Right">
<TextBlock x:Name="NameLabel" TextTrimming="CharacterEllipsis" FontSize="14" Width="auto" Foreground="White" VerticalAlignment="Center"/>
<Image x:Name="Icon" MaxWidth="20" MaxHeight="20" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5,0,0,0" Visibility="{Binding Icon, Mode=OneWay, Converter={StaticResource NullConverter}}"/>
</StackPanel>
<reactiveUi:ViewModelViewHost x:Name="EndpointHost" Grid.Column="2" Grid.Row="0" Margin="10,4.9,0,4.9" Width="20" Height="20"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" IsTabStop="False"/>
<reactiveUi:ViewModelViewHost x:Name="EditorHost" Grid.Column="1" VerticalContentAlignment="Center" HorizontalContentAlignment="Right" HorizontalAlignment="Right" IsTabStop="False"/>
</Grid>
</ControlTemplate>
</ResourceDictionary>

View File

@@ -0,0 +1,102 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:reactiveUi="http://reactiveui.net"
xmlns:views="clr-namespace:NodeNetwork.Views"
xmlns:viewModels="clr-namespace:NodeNetwork.ViewModels">
<Style TargetType="{x:Type views:EndpointGroupView}">
<Setter Property="Background" Value="#20000000"/>
<Setter Property="Foreground" Value="#FFFFFF"/>
<Setter Property="TitleFontFamily" Value="Segoe UI SemiLight"/>
<Setter Property="TitleFontSize" Value="18"/>
<Setter Property="IsTabStop" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="views:EndpointGroupView">
<Grid Margin="0,5,0,0">
<Canvas Background="{TemplateBinding Background}" IsHitTestVisible="False"/>
<StackPanel Orientation="Vertical">
<DockPanel Margin="0,5,0,0">
<TextBlock x:Name="NameLabel" TextTrimming="CharacterEllipsis" FontSize="{TemplateBinding TitleFontSize}" FontFamily="{TemplateBinding TitleFontFamily}"
Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" Margin="20,0,10,0">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DockPanel>
<DockPanel>
<ItemsControl x:Name="InputsList" IsTabStop="False">
<ItemsControl.Style>
<Style TargetType="ItemsControl">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=EndpointsStackingOrientation, RelativeSource={RelativeSource AncestorType={x:Type views:NodeView}}}" Value="Vertical">
<Setter Property="DockPanel.Dock" Value="Top" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=EndpointsStackingOrientation, RelativeSource={RelativeSource AncestorType={x:Type views:NodeView}}}" Value="Horizontal">
<Setter Property="DockPanel.Dock" Value="Left" />
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="viewModels:NodeInputViewModel">
<reactiveUi:ViewModelViewHost ViewModel="{Binding}"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
IsTabStop="False" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl x:Name="OutputsList" IsTabStop="False">
<ItemsControl.Style>
<Style TargetType="ItemsControl">
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=EndpointsStackingOrientation, RelativeSource={RelativeSource AncestorType={x:Type views:NodeView}}}"
Value="Vertical">
<Setter Property="DockPanel.Dock" Value="Bottom" />
</DataTrigger>
<DataTrigger
Binding="{Binding Path=EndpointsStackingOrientation, RelativeSource={RelativeSource AncestorType={x:Type views:NodeView}}}"
Value="Horizontal">
<Setter Property="DockPanel.Dock" Value="Right" />
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="viewModels:NodeOutputViewModel">
<reactiveUi:ViewModelViewHost ViewModel="{Binding}"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
IsTabStop="False" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DockPanel>
<ItemsControl x:Name="EndpointGroupsList" IsTabStop="False">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="viewModels:EndpointGroupViewModel">
<reactiveUi:ViewModelViewHost ViewModel="{Binding}"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
IsTabStop="False" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,26 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:NodeNetwork.Views">
<Style TargetType="{x:Type views:ErrorMessageView}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="views:ErrorMessageView">
<Border Background="#EEE" CornerRadius="3">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Width="36" Height="36" Margin="5">
<Ellipse Fill="#ef513a"/>
<Line Stroke="White" StrokeThickness="3" X1="12" Y1="12" X2="24" Y2="24"/>
<Line Stroke="White" StrokeThickness="3" X1="24" Y1="12" X2="12" Y2="24"/>
</Grid>
<TextBlock Grid.Column="1" x:Name="TextBlock" Margin="5" TextWrapping="Wrap" FontSize="18" FontWeight="Normal" Foreground="#ef513a" VerticalAlignment="Center"/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,13 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/NodeNetwork;component/Themes/ConnectionView.xaml"/>
<ResourceDictionary Source="pack://application:,,,/NodeNetwork;component/Themes/PendingConnectionView.xaml"/>
<ResourceDictionary Source="pack://application:,,,/NodeNetwork;component/Themes/ErrorMessageView.xaml"/>
<ResourceDictionary Source="pack://application:,,,/NodeNetwork;component/Themes/NodeEndpointEditorView.xaml"/>
<ResourceDictionary Source="pack://application:,,,/NodeNetwork;component/Themes/NodeView.xaml"/>
<ResourceDictionary Source="pack://application:,,,/NodeNetwork;component/Themes/NodeInputView.xaml"/>
<ResourceDictionary Source="pack://application:,,,/NodeNetwork;component/Themes/NodeOutputView.xaml"/>
<ResourceDictionary Source="pack://application:,,,/NodeNetwork;component/Themes/PortView.xaml"/>
<ResourceDictionary Source="pack://application:,,,/NodeNetwork;component/Themes/EndpointGroupView.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

View File

@@ -0,0 +1,13 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:NodeNetwork.Views">
<Style TargetType="{x:Type views:NodeEndpointEditorView}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="views:NodeEndpointEditorView">
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,24 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:NodeNetwork.Views"
xmlns:viewModels="clr-namespace:NodeNetwork.ViewModels">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Endpoint.xaml" />
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type views:NodeInputView}">
<Setter Property="IsTabStop" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=PortPosition}" Value="{x:Static viewModels:PortPosition.Left}">
<DataTrigger.Setters>
<Setter Property="Template" Value="{StaticResource LeftAlignedEndpoint}"/>
</DataTrigger.Setters>
</DataTrigger>
<DataTrigger Binding="{Binding Path=PortPosition}" Value="{x:Static viewModels:PortPosition.Right}">
<DataTrigger.Setters>
<Setter Property="Template" Value="{StaticResource RightAlignedEndpoint}"/>
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,24 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:NodeNetwork.Views"
xmlns:viewModels="clr-namespace:NodeNetwork.ViewModels">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Endpoint.xaml" />
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type views:NodeOutputView}">
<Setter Property="IsTabStop" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=PortPosition}" Value="{x:Static viewModels:PortPosition.Left}">
<DataTrigger.Setters>
<Setter Property="Template" Value="{StaticResource LeftAlignedEndpoint}"/>
</DataTrigger.Setters>
</DataTrigger>
<DataTrigger Binding="{Binding Path=PortPosition}" Value="{x:Static viewModels:PortPosition.Right}">
<DataTrigger.Setters>
<Setter Property="Template" Value="{StaticResource RightAlignedEndpoint}"/>
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,175 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:NodeNetwork.Views"
xmlns:controls="clr-namespace:NodeNetwork.Views.Controls"
xmlns:viewModels="clr-namespace:NodeNetwork.ViewModels"
xmlns:reactiveUi="http://reactiveui.net">
<Style TargetType="{x:Type views:NodeView}">
<Setter Property="Background" Value="#5D9CEC"/>
<Setter Property="Foreground" Value="#FFFFFF"/>
<Setter Property="TitleFontFamily" Value="Segoe UI Semibold"/>
<Setter Property="TitleFontSize" Value="18"/>
<Setter Property="BorderBrush" Value="Orange"/>
<Setter Property="CornerRadius" Value="4"/>
<Setter Property="ArrowSize" Value="20"/>
<Setter Property="EndpointsStackingOrientation" Value="Vertical"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="views:NodeView">
<controls:FillPanel x:Name="Container">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="{x:Static views:NodeView.SelectedVisualStatesGroup}">
<VisualState Name="{x:Static views:NodeView.SelectedState}">
<Storyboard>
<ThicknessAnimation Duration="0" To="-3"
Storyboard.TargetName="Container" Storyboard.TargetProperty="Margin"/>
<ThicknessAnimation Duration="0" To="3" Storyboard.TargetName="Border" Storyboard.TargetProperty="BorderThickness"/>
</Storyboard>
</VisualState>
<VisualState Name="{x:Static views:NodeView.UnselectedState}">
<Storyboard>
<ThicknessAnimation Duration="0" To="0" Storyboard.TargetName="Container" Storyboard.TargetProperty="Margin"/>
<ThicknessAnimation Duration="0" To="0" Storyboard.TargetName="Border" Storyboard.TargetProperty="BorderThickness"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border x:Name="Border" Margin="10,0,10,0" CornerRadius="{TemplateBinding CornerRadius}"
MinWidth="100" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}">
<Grid>
<Thumb VerticalAlignment="Bottom" Height="10" x:Name="ResizeVerticalThumb" Cursor="SizeNS">
<Thumb.Template>
<ControlTemplate>
<Canvas Background="White" Opacity="0"/>
</ControlTemplate>
</Thumb.Template>
<Thumb.Style>
<Style TargetType="Thumb">
<Style.Triggers>
<DataTrigger Binding="{Binding Resizable}" Value="Horizontal">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Resizable}" Value="None">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Thumb.Style>
</Thumb>
<Thumb HorizontalAlignment="Right" Width="10" x:Name="ResizeHorizontalThumb" Cursor="SizeWE">
<Thumb.Template>
<ControlTemplate>
<Canvas Background="White" Opacity="0"/>
</ControlTemplate>
</Thumb.Template>
<Thumb.Style>
<Style TargetType="Thumb">
<Style.Triggers>
<DataTrigger Binding="{Binding Resizable}" Value="Vertical">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Resizable}" Value="None">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Thumb.Style>
</Thumb>
<Thumb HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="10" Height="10" x:Name="ResizeDiagonalThumb" Cursor="SizeNWSE">
<Thumb.Template>
<ControlTemplate>
<Canvas Background="White" Opacity="0"/>
</ControlTemplate>
</Thumb.Template>
<Thumb.Style>
<Style TargetType="Thumb">
<Style.Triggers>
<DataTrigger Binding="{Binding Resizable}" Value="Vertical">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Resizable}" Value="Horizontal">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Resizable}" Value="None">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Thumb.Style>
</Thumb>
<StackPanel>
<Canvas x:Name="HeaderTopMargin" Width="auto" Height="10"/>
<DockPanel>
<Image x:Name="HeaderIcon" MaxWidth="{TemplateBinding ArrowSize}" MaxHeight="{TemplateBinding ArrowSize}" DockPanel.Dock="Left" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10,0,0,0"/>
<TextBlock x:Name="NameLabel" TextWrapping="Wrap" Background="Transparent" Foreground="{TemplateBinding Foreground}" DockPanel.Dock="Left" HorizontalAlignment="Left" VerticalAlignment="Center" TextAlignment="Center"
FontFamily="{TemplateBinding TitleFontFamily}" FontSize="{TemplateBinding TitleFontSize}" Margin="10,0,0,0"/>
<controls:ArrowToggleButton x:Name="CollapseButton" Width="{TemplateBinding ArrowSize}" Height="{TemplateBinding ArrowSize}" DockPanel.Dock="Right" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="20,0,10,0"/>
</DockPanel>
<Canvas x:Name="HeaderBottomMargin" Width="auto" Height="3"/>
<ContentPresenter x:Name="LeadingControlPresenter" Style="{TemplateBinding LeadingControlPresenterStyle}"/>
<DockPanel>
<ItemsControl x:Name="InputsList" IsTabStop="False">
<ItemsControl.Style>
<Style TargetType="ItemsControl">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=EndpointsStackingOrientation, RelativeSource={RelativeSource AncestorType={x:Type views:NodeView}}}" Value="Vertical">
<Setter Property="DockPanel.Dock" Value="Top"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=EndpointsStackingOrientation, RelativeSource={RelativeSource AncestorType={x:Type views:NodeView}}}" Value="Horizontal">
<Setter Property="DockPanel.Dock" Value="Left"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="viewModels:NodeInputViewModel">
<reactiveUi:ViewModelViewHost ViewModel="{Binding}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" IsTabStop="False"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl x:Name="OutputsList" IsTabStop="False">
<ItemsControl.Style>
<Style TargetType="ItemsControl">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=EndpointsStackingOrientation, RelativeSource={RelativeSource AncestorType={x:Type views:NodeView}}}" Value="Vertical">
<Setter Property="DockPanel.Dock" Value="Bottom"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=EndpointsStackingOrientation, RelativeSource={RelativeSource AncestorType={x:Type views:NodeView}}}" Value="Horizontal">
<Setter Property="DockPanel.Dock" Value="Right"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="viewModels:NodeOutputViewModel">
<reactiveUi:ViewModelViewHost ViewModel="{Binding}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" IsTabStop="False"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DockPanel>
<ItemsControl x:Name="EndpointGroupsList" IsTabStop="False">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="viewModels:EndpointGroupViewModel">
<reactiveUi:ViewModelViewHost ViewModel="{Binding}"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
IsTabStop="False" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ContentPresenter x:Name="TrailingControlPresenter" Style="{TemplateBinding TrailingControlPresenterStyle}"/>
<Canvas x:Name="BottomMargin" Width="auto" Height="5"/>
</StackPanel>
</Grid>
</Border>
</controls:FillPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,44 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:NodeNetwork.Views"
xmlns:controls="clr-namespace:NodeNetwork.Views.Controls">
<Style TargetType="{x:Type views:PendingConnectionView}">
<Setter Property="RegularBrush" Value="#C8FFFFFF"/>
<Setter Property="ErrorBrush" Value="#C8FF0000"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="views:PendingConnectionView">
<controls:FillPanel>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="{x:Static views:PendingConnectionView.ErrorVisualStatesGroup}">
<VisualState Name="{x:Static views:PendingConnectionView.ErrorState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="RegularPath" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="ErrorPath" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState Name="{x:Static views:PendingConnectionView.NonErrorState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="RegularPath" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="ErrorPath" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Path x:Name="RegularPath" StrokeThickness="2" IsHitTestVisible="False" Stroke="{TemplateBinding RegularBrush}" Data="{TemplateBinding Geometry}"/>
<Path x:Name="ErrorPath" StrokeThickness="2" IsHitTestVisible="False" Stroke="{TemplateBinding ErrorBrush}" Data="{TemplateBinding Geometry}"/>
</controls:FillPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,78 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:NodeNetwork.Views"
xmlns:controls="clr-namespace:NodeNetwork.Views.Controls">
<Style TargetType="{x:Type views:PortView}">
<Setter Property="RegularStroke" Value="#9E9E9E"/>
<Setter Property="RegularFill" Value="#E0E0E0"/>
<Setter Property="ConnectedStroke" Value="#AEAEAE"/>
<Setter Property="ConnectedFill" Value="#F0F0F0"/>
<Setter Property="HighlightStroke" Value="#30FFFFFF"/>
<Setter Property="HighlightFill" Value="#30FFFFFF"/>
<Setter Property="ErrorStroke" Value="#F44336"/>
<Setter Property="ErrorFill" Value="#FFCDD2"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="views:PortView">
<controls:FillPanel>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="{x:Static views:PortView.ConnectedVisualStatesGroup}">
<VisualState Name="{x:Static views:PortView.ConnectedState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="ConnectedEllipse" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState Name="{x:Static views:PortView.DisconnectedState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="ConnectedEllipse" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup Name="{x:Static views:PortView.HighlightVisualStatesGroup}">
<VisualState Name="{x:Static views:PortView.HighlightedState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="HighlightEllipse" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState Name="{x:Static views:PortView.NonHighlightedState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="HighlightEllipse" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup Name="{x:Static views:PortView.ErrorVisualStatesGroup}">
<VisualState Name="{x:Static views:PortView.ErrorState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="ErrorEllipse" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState Name="{x:Static views:PortView.NonErrorState}">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="ErrorEllipse" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Ellipse Name="RegularEllipse" StrokeThickness="2" Stroke="{TemplateBinding RegularStroke}" Fill="{TemplateBinding RegularFill}"/>
<Ellipse Name="ConnectedEllipse" StrokeThickness="2" Stroke="{TemplateBinding ConnectedStroke}" Fill="{TemplateBinding ConnectedFill}"/>
<Ellipse Name="ErrorEllipse" StrokeThickness="2" Stroke="{TemplateBinding ErrorStroke}" Fill="{TemplateBinding ErrorFill}"/>
<Ellipse Name="HighlightEllipse" StrokeThickness="2" Stroke="{TemplateBinding HighlightStroke}" Fill="{TemplateBinding HighlightFill}"/>
</controls:FillPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>