Skip to content

Commit 0b4a4bc

Browse files
committed
Show component output ports
1 parent 565fd56 commit 0b4a4bc

11 files changed

Lines changed: 357 additions & 66 deletions

WpfApplication/Pipeline/OutputSelectionControl.xaml.cs

Lines changed: 1 addition & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,7 @@ public OutputSelectionControl(ComponentConfiguration configuration, InputConfigu
7171
Configurations = configurations;
7272

7373
var inputMetadata = configuration.FindPortMetadata(inputConfiguration.LocalPort);
74-
var localOutputs = configuration.FindOutputPortDataTypes(configurations);
75-
var localInputs = configuration.FindInputPortDataTypes(configurations, inputMetadata);
76-
string inputDataTypeName;
77-
if (inputMetadata.CanConnectDataType(null, localOutputs, localInputs)) {
78-
inputDataTypeName = "Any";
79-
} else {
80-
var inputPortDataType = inputMetadata.GetTransmissionDataType(null, localOutputs, localInputs);
81-
if (inputPortDataType is null) {
82-
inputDataTypeName = "Unknown";
83-
} else {
84-
inputDataTypeName = GetCSharpStyleTypeName(inputPortDataType);
85-
}
86-
}
74+
var inputDataTypeName = TypeDisplayHelpers.FindInputDataTypeName(configuration, inputMetadata, configurations);
8775
TextBlockPortDataType.Text = inputDataTypeName;
8876

8977
var selections = LegalOutputSelections(configuration, inputConfiguration, configurations);
@@ -104,47 +92,5 @@ private void ListBoxOutputs_SelectionChanged(object sender, RoutedEventArgs e) {
10492
};
10593
RemoveIllegalInputs(Configurations);
10694
}
107-
108-
private static readonly Dictionary<Type, string> TypeMappings = new Dictionary<Type, string>() {
109-
{ typeof(object), "object" },
110-
{ typeof(string), "string" },
111-
{ typeof(bool), "bool" },
112-
{ typeof(float), "float" },
113-
{ typeof(double), "double" },
114-
{ typeof(int), "int" },
115-
{ typeof(uint), "uint" },
116-
{ typeof(long), "long" },
117-
{ typeof(ulong), "ulong" },
118-
{ typeof(short), "short" },
119-
{ typeof(ushort), "ushort" },
120-
121-
};
122-
123-
private static string GetCSharpStyleTypeName(Type type) {
124-
if (TypeMappings.TryGetValue(type, out var name)) {
125-
return name;
126-
}
127-
if (type.IsArray) {
128-
return $"{GetCSharpStyleTypeName(type.GetElementType())}[]";
129-
}
130-
name = $"{type.Namespace}.{type.Name}";
131-
if (!type.IsGenericType) {
132-
return name;
133-
}
134-
var sb = new StringBuilder();
135-
var innerText = string.Join(", ", type.GetGenericArguments().Select(GetCSharpStyleTypeName));
136-
if (name.StartsWith("System.ValueTuple`")) {
137-
sb.Append('(');
138-
sb.Append(innerText);
139-
sb.Append(')');
140-
} else {
141-
sb.Append(name.Substring(0, name.IndexOf('`')));
142-
sb.Append('<');
143-
sb.Append(innerText);
144-
sb.Append('>');
145-
}
146-
var result = sb.ToString();
147-
return result;
148-
}
14995
}
15096
}

WpfApplication/Pipeline/PipelineEditorWindow.xaml

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
<ColumnDefinition />
9595
<ColumnDefinition
9696
Width="auto"
97-
MinWidth="16"/>
97+
MinWidth="16" />
9898
<ColumnDefinition
9999
Width="auto"
100100
MinWidth="16" />
@@ -153,7 +153,10 @@
153153
<Grid.RowDefinitions>
154154
<RowDefinition
155155
Height="auto" />
156-
<RowDefinition />
156+
<RowDefinition
157+
Height="1*" />
158+
<RowDefinition
159+
Height="auto"/>
157160
</Grid.RowDefinitions>
158161

159162
<GroupBox
@@ -162,9 +165,40 @@
162165

163166
<GroupBox
164167
Grid.Row="1"
165-
Header="Connection">
166-
<Grid
167-
Name="ContentControlConnection" />
168+
Header="Connection"
169+
Name="ContentControlConnection">
170+
</GroupBox>
171+
172+
<GroupBox
173+
Grid.Row="2"
174+
>
175+
<GroupBox.Header>
176+
<ToggleButton
177+
Name="ToggleButtonOutputs">
178+
Show Outputs
179+
</ToggleButton>
180+
</GroupBox.Header>
181+
182+
<ContentControl
183+
Name="OutputPortInspector">
184+
<ContentControl.Style>
185+
<Style
186+
TargetType="ContentControl">
187+
<Setter
188+
Property="Visibility"
189+
Value="Collapsed" />
190+
<Style.Triggers>
191+
<DataTrigger
192+
Binding="{Binding IsChecked, ElementName=ToggleButtonOutputs}"
193+
Value="True">
194+
<Setter
195+
Property="Visibility"
196+
Value="Visible" />
197+
</DataTrigger>
198+
</Style.Triggers>
199+
</Style>
200+
</ContentControl.Style>
201+
</ContentControl>
168202
</GroupBox>
169203
</Grid>
170204
<GridSplitter

WpfApplication/Pipeline/PipelineEditorWindow.xaml.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.Psi;
77
using OpenSense.Components;
88
using OpenSense.Pipeline;
9+
using OpenSense.WPF.Views.Editors;
910
using OpenSense.WPF.Views.Runners;
1011

1112
namespace OpenSense.WPF.Pipeline {
@@ -91,14 +92,16 @@ private void ListBoxInstances_SelectionChanged(object sender, SelectionChangedEv
9192
var configuration = (ComponentConfiguration)ListBoxInstances.SelectedItem;
9293
var configurations = ListBoxInstances.ItemsSource.Cast<ComponentConfiguration>().ToArray();
9394
ContentControlComponentBasics.Content = null;
94-
ContentControlConnection.Children.Clear();
95+
ContentControlConnection.Content = null;
9596
ContentControlConnection.DataContext = configuration;
97+
OutputPortInspector.Content = null;
98+
OutputPortInspector.DataContext = configuration;
9699
ContentControlSettings.Children.Clear();
97100
ContentControlSettings.DataContext = ListBoxInstances.SelectedItem;
98101
if (configuration != null) {
99102
ContentControlComponentBasics.Content = new InstanceBasicInformationControl(configuration);
100-
var connection = new InstanceConnectionControl(configuration, configurations);
101-
ContentControlConnection.Children.Add(connection);
103+
ContentControlConnection.Content = new InstanceConnectionControl(configuration, configurations);
104+
OutputPortInspector.Content = new OutputPortsInspector(configuration, configurations);
102105
try {
103106
var manager = new ConfigurationControlCreatorManager();//throws ReflectionTypeLoadException
104107
var control = manager.Create(configuration);

WpfApplication/Pipeline/PortSelectionWindow.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
Binding="{Binding Description}"
3333
Width="*" />
3434
<DataGridTextColumn
35-
Header="Type"
35+
Header="Kind"
3636
Binding="{Binding Aggregation, Mode=OneWay}" />
3737
</DataGrid.Columns>
3838
</DataGrid>
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics;
4+
using System.Linq;
5+
using System.Text;
6+
using OpenSense.Components;
7+
8+
namespace OpenSense.WPF.Pipeline {
9+
internal static class TypeDisplayHelpers {
10+
11+
public static string FindInputDataTypeName(ComponentConfiguration configuration, IPortMetadata inputMetadata, IReadOnlyList<ComponentConfiguration> configurations) {
12+
Debug.Assert(inputMetadata.Direction == PortDirection.Input);
13+
var localOutputs = configuration.FindOutputPortDataTypes(configurations);
14+
var localInputs = configuration.FindInputPortDataTypes(configurations, exclude: inputMetadata);
15+
string result;
16+
if (inputMetadata.CanConnectDataType(null, localOutputs, localInputs)) {
17+
result = "Any Type";
18+
} else {
19+
var inputPortDataType = inputMetadata.GetTransmissionDataType(null, localOutputs, localInputs);
20+
if (inputPortDataType is null) {
21+
result = "Type Unknown";
22+
} else {
23+
result = GetCSharpStyleTypeName(inputPortDataType);
24+
}
25+
}
26+
return result;
27+
}
28+
29+
public static string FindOutputDataTypeName(ComponentConfiguration configuration, IPortMetadata outputMetadata, IReadOnlyList<ComponentConfiguration> configurations) {
30+
Debug.Assert(outputMetadata.Direction == PortDirection.Output);
31+
var localInputs = configuration.FindInputPortDataTypes(configurations);
32+
var localOutputs = configuration.FindOutputPortDataTypes(configurations, exclude: outputMetadata);
33+
string result;
34+
if (outputMetadata.CanConnectDataType(null, localInputs, localOutputs)) {
35+
result = "Any Type";
36+
} else {
37+
var outputPortDataType = outputMetadata.GetTransmissionDataType(null, localInputs, localOutputs);
38+
if (outputPortDataType is null) {
39+
result = "Type Unknown";
40+
} else {
41+
result = GetCSharpStyleTypeName(outputPortDataType);
42+
}
43+
}
44+
return result;
45+
}
46+
47+
private static string GetCSharpStyleTypeName(Type type) {
48+
if (TypeMappings.TryGetValue(type, out var name)) {
49+
return name;
50+
}
51+
if (type.IsArray) {
52+
return $"{GetCSharpStyleTypeName(type.GetElementType())}[]";
53+
}
54+
name = $"{type.Namespace}.{type.Name}";
55+
if (!type.IsGenericType) {
56+
return name;
57+
}
58+
var sb = new StringBuilder();
59+
var innerText = string.Join(", ", type.GetGenericArguments().Select(GetCSharpStyleTypeName));
60+
if (name.StartsWith("System.ValueTuple`")) {
61+
sb.Append('(');
62+
sb.Append(innerText);
63+
sb.Append(')');
64+
} else {
65+
sb.Append(name.Substring(0, name.IndexOf('`')));
66+
sb.Append('<');
67+
sb.Append(innerText);
68+
sb.Append('>');
69+
}
70+
var result = sb.ToString();
71+
return result;
72+
}
73+
74+
private static readonly Dictionary<Type, string> TypeMappings = new Dictionary<Type, string>() {
75+
{ typeof(object), "object" },
76+
{ typeof(string), "string" },
77+
{ typeof(bool), "bool" },
78+
{ typeof(float), "float" },
79+
{ typeof(double), "double" },
80+
{ typeof(int), "int" },
81+
{ typeof(uint), "uint" },
82+
{ typeof(long), "long" },
83+
{ typeof(ulong), "ulong" },
84+
{ typeof(short), "short" },
85+
{ typeof(ushort), "ushort" },
86+
87+
};
88+
}
89+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<UserControl
2+
x:Class="OpenSense.WPF.Views.Editors.OutputPortView"
3+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7+
xmlns:local="clr-namespace:OpenSense.WPF.Views.Editors"
8+
mc:Ignorable="d"
9+
d:DesignHeight="450"
10+
d:DesignWidth="800">
11+
<UserControl.Resources>
12+
<Style
13+
x:Key="HideDescriptionStyle"
14+
TargetType="TextBlock">
15+
<Style.Triggers>
16+
<DataTrigger
17+
Binding="{Binding Description}"
18+
Value="{x:Null}">
19+
<Setter
20+
Property="Visibility"
21+
Value="Collapsed" />
22+
</DataTrigger>
23+
<DataTrigger
24+
Binding="{Binding Description}"
25+
Value="">
26+
<Setter
27+
Property="Visibility"
28+
Value="Collapsed" />
29+
</DataTrigger>
30+
</Style.Triggers>
31+
</Style>
32+
</UserControl.Resources>
33+
<Grid>
34+
<Grid.ColumnDefinitions>
35+
<ColumnDefinition />
36+
</Grid.ColumnDefinitions>
37+
38+
<Grid.RowDefinitions>
39+
<RowDefinition
40+
Height="auto" />
41+
<RowDefinition
42+
Height="auto" />
43+
<RowDefinition
44+
Height="auto" />
45+
</Grid.RowDefinitions>
46+
47+
<TextBlock
48+
Grid.Row="0"
49+
FontWeight="Bold"
50+
Text="{Binding Name}" />
51+
52+
<TextBlock
53+
Grid.Row="2"
54+
Foreground="SlateGray"
55+
Style="{StaticResource HideDescriptionStyle}"
56+
Text="{Binding Description}" />
57+
58+
<TextBlock
59+
Grid.Row="1"
60+
Text="{Binding Type}" />
61+
</Grid>
62+
</UserControl>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Windows.Controls;
2+
3+
namespace OpenSense.WPF.Views.Editors {
4+
public sealed partial class OutputPortView : UserControl {
5+
public OutputPortView() {
6+
InitializeComponent();
7+
}
8+
}
9+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#nullable enable
2+
3+
namespace OpenSense.WPF.Views.Editors {
4+
internal sealed class OutputPortViewModel {
5+
6+
public string Name { get; }
7+
8+
public string? Description { get; }
9+
10+
public string Type { get; }
11+
12+
public OutputPortViewModel(string name, string? description, string type) {
13+
Name = name;
14+
Description = description;
15+
Type = type;
16+
}
17+
}
18+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<UserControl
2+
x:Class="OpenSense.WPF.Views.Editors.OutputPortsInspector"
3+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7+
xmlns:local="clr-namespace:OpenSense.WPF.Views.Editors"
8+
mc:Ignorable="d"
9+
d:DesignHeight="450"
10+
d:DesignWidth="800"
11+
Unloaded="UserControl_Unloaded">
12+
<Grid>
13+
<TextBlock
14+
Visibility="Collapsed"
15+
d:Visibility="Visible"
16+
Name="TextBlockNoOutputs"
17+
VerticalAlignment="Center"
18+
HorizontalAlignment="Center">
19+
No Outpus
20+
</TextBlock>
21+
22+
<ScrollViewer
23+
Visibility="Visible"
24+
VerticalScrollBarVisibility="Auto"
25+
HorizontalScrollBarVisibility="Auto">
26+
<ItemsControl
27+
Grid.Column="0"
28+
Name="ListBoxPorts">
29+
<ItemsControl.ItemTemplate>
30+
<DataTemplate>
31+
<local:OutputPortView
32+
Margin="5" />
33+
</DataTemplate>
34+
</ItemsControl.ItemTemplate>
35+
</ItemsControl>
36+
</ScrollViewer>
37+
</Grid>
38+
</UserControl>

0 commit comments

Comments
 (0)