mirror of
https://github.com/egmont11/NetworkDiagram.git
synced 2026-07-24 07:09:43 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b54df1fd4c |
+3
@@ -3,7 +3,10 @@
|
|||||||
<component name="AvaloniaProject">
|
<component name="AvaloniaProject">
|
||||||
<option name="projectPerEditor">
|
<option name="projectPerEditor">
|
||||||
<map>
|
<map>
|
||||||
|
<entry key="NetworkDiagram/EditDeviceWindow.axaml" value="NetworkDiagram/NetworkDiagram.csproj" />
|
||||||
<entry key="NetworkDiagram/ExportOptionsWindow.axaml" value="NetworkDiagram/NetworkDiagram.csproj" />
|
<entry key="NetworkDiagram/ExportOptionsWindow.axaml" value="NetworkDiagram/NetworkDiagram.csproj" />
|
||||||
|
<entry key="NetworkDiagram/Localization/Strings.cs.axaml" value="NetworkDiagram/NetworkDiagram.csproj" />
|
||||||
|
<entry key="NetworkDiagram/Localization/Strings.en.axaml" value="NetworkDiagram/NetworkDiagram.csproj" />
|
||||||
<entry key="NetworkDiagram/MainWindow.axaml" value="NetworkDiagram/NetworkDiagram.csproj" />
|
<entry key="NetworkDiagram/MainWindow.axaml" value="NetworkDiagram/NetworkDiagram.csproj" />
|
||||||
<entry key="NetworkDiagramAvalonia/App.axaml" value="NetworkDiagramAvalonia/NetworkDiagramAvalonia.csproj" />
|
<entry key="NetworkDiagramAvalonia/App.axaml" value="NetworkDiagramAvalonia/NetworkDiagramAvalonia.csproj" />
|
||||||
<entry key="NetworkDiagramAvalonia/Views/MainWindow.axaml" value="NetworkDiagramAvalonia/NetworkDiagramAvalonia.csproj" />
|
<entry key="NetworkDiagramAvalonia/Views/MainWindow.axaml" value="NetworkDiagramAvalonia/NetworkDiagramAvalonia.csproj" />
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
<option name="locations">
|
<option name="locations">
|
||||||
<list>
|
<list>
|
||||||
<option value="$PROJECT_DIR$/NetworkDiagram/bin/Release/net10.0-windows/win-x64/publish" />
|
<option value="$PROJECT_DIR$/NetworkDiagram/bin/Release/net10.0-windows/win-x64/publish" />
|
||||||
|
<option value="$PROJECT_DIR$/NetworkDiagram/bin/Release/net10.0/linux-x64/publish" />
|
||||||
|
<option value="$PROJECT_DIR$/NetworkDiagram/bin/Release/net10.0/linux-arm64/publish" />
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
Binary file not shown.
@@ -5,16 +5,20 @@
|
|||||||
WindowStartupLocation="CenterOwner" CanResize="False"
|
WindowStartupLocation="CenterOwner" CanResize="False"
|
||||||
Background="{DynamicResource BgWhite}"
|
Background="{DynamicResource BgWhite}"
|
||||||
Icon="/Assets/router.jpg">
|
Icon="/Assets/router.jpg">
|
||||||
<Grid Margin="25" RowDefinitions="Auto,Auto,Auto,*,Auto">
|
<Grid Margin="25" RowDefinitions="Auto,Auto,Auto,Auto,Auto,*,Auto">
|
||||||
|
|
||||||
<TextBlock Text="{DynamicResource DeviceNameLabel}" Margin="0,0,0,8" FontWeight="SemiBold" Foreground="{DynamicResource PrimaryBlue}"/>
|
<TextBlock Text="{DynamicResource DeviceNameLabel}" Margin="0,0,0,8" FontWeight="SemiBold" Foreground="{DynamicResource PrimaryBlue}"/>
|
||||||
<TextBox x:Name="NameBox" Grid.Row="1" Margin="0,0,0,20"/>
|
<TextBox x:Name="NameBox" Grid.Row="1" Margin="0,0,0,15"/>
|
||||||
|
|
||||||
<TextBlock Grid.Row="2" Text="{DynamicResource IpLabel}" Margin="0,0,0,8" FontWeight="SemiBold" Foreground="{DynamicResource PrimaryBlue}"/>
|
<TextBlock Grid.Row="2" Text="{DynamicResource DescLabel}" Margin="0,0,0,8" FontWeight="SemiBold" Foreground="{DynamicResource PrimaryBlue}"/>
|
||||||
<TextBox x:Name="IpBox" Grid.Row="3" Margin="0,0,0,25"
|
<TextBox x:Name="DescBox" Grid.Row="3" Margin="0,0,0,15"
|
||||||
AcceptsReturn="True" VerticalContentAlignment="Top" MinHeight="80"/>
|
AcceptsReturn="True" VerticalContentAlignment="Top" MinHeight="60"/>
|
||||||
|
|
||||||
<StackPanel Grid.Row="4" Orientation="Horizontal" HorizontalAlignment="Right">
|
<TextBlock Grid.Row="4" Text="{DynamicResource IpLabel}" Margin="0,0,0,8" FontWeight="SemiBold" Foreground="{DynamicResource PrimaryBlue}"/>
|
||||||
|
<TextBox x:Name="IpBox" Grid.Row="5" Margin="0,0,0,25"
|
||||||
|
AcceptsReturn="True" VerticalContentAlignment="Top" MinHeight="60"/>
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="6" Orientation="Horizontal" HorizontalAlignment="Right">
|
||||||
<Button Content="{DynamicResource CancelBtn}" Classes="SecondaryButtonStyle" Click="Cancel_Click" Width="90" Margin="0,0,12,0"/>
|
<Button Content="{DynamicResource CancelBtn}" Classes="SecondaryButtonStyle" Click="Cancel_Click" Width="90" Margin="0,0,12,0"/>
|
||||||
<Button Content="{DynamicResource SaveDialogBtn}" Classes="ModernButtonStyle" Click="Save_Click" Width="90"/>
|
<Button Content="{DynamicResource SaveDialogBtn}" Classes="ModernButtonStyle" Click="Save_Click" Width="90"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|||||||
@@ -19,12 +19,14 @@ namespace NetworkDiagram
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
_device = device;
|
_device = device;
|
||||||
NameBox.Text = device.Name;
|
NameBox.Text = device.Name;
|
||||||
|
DescBox.Text = device.Description;
|
||||||
IpBox.Text = string.Join(Environment.NewLine, device.IpAddresses);
|
IpBox.Text = string.Join(Environment.NewLine, device.IpAddresses);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Save_Click(object? sender, RoutedEventArgs e)
|
private void Save_Click(object? sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
_device.Name = NameBox.Text ?? string.Empty;
|
_device.Name = NameBox.Text ?? string.Empty;
|
||||||
|
_device.Description = DescBox.Text ?? string.Empty;
|
||||||
_device.IpAddresses = (IpBox.Text ?? string.Empty)
|
_device.IpAddresses = (IpBox.Text ?? string.Empty)
|
||||||
.Split(new[] { Environment.NewLine, "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries)
|
.Split(new[] { Environment.NewLine, "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|||||||
@@ -11,9 +11,10 @@
|
|||||||
<x:String x:Key="DevicesHeader">Zařízení</x:String>
|
<x:String x:Key="DevicesHeader">Zařízení</x:String>
|
||||||
|
|
||||||
<!-- Edit Dialog -->
|
<!-- Edit Dialog -->
|
||||||
<x:String x:Key="EditTitle">Upravit zařízení</x:String>
|
<x:String x:Key="EditTitle">Upravit Zařízení</x:String>
|
||||||
<x:String x:Key="DeviceNameLabel">Název zařízení:</x:String>
|
<x:String x:Key="DeviceNameLabel">Název zařízení:</x:String>
|
||||||
<x:String x:Key="IpLabel">IP adresy (jedna na řádek):</x:String>
|
<x:String x:Key="DescLabel">Popis:</x:String>
|
||||||
|
<x:String x:Key="IpLabel">IP Adresy (jedna na řádek):</x:String>
|
||||||
<x:String x:Key="CancelBtn">Zrušit</x:String>
|
<x:String x:Key="CancelBtn">Zrušit</x:String>
|
||||||
<x:String x:Key="SaveDialogBtn">Uložit</x:String>
|
<x:String x:Key="SaveDialogBtn">Uložit</x:String>
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
<!-- Edit Dialog -->
|
<!-- Edit Dialog -->
|
||||||
<x:String x:Key="EditTitle">Edit Device</x:String>
|
<x:String x:Key="EditTitle">Edit Device</x:String>
|
||||||
<x:String x:Key="DeviceNameLabel">Device Name:</x:String>
|
<x:String x:Key="DeviceNameLabel">Device Name:</x:String>
|
||||||
|
<x:String x:Key="DescLabel">Description:</x:String>
|
||||||
<x:String x:Key="IpLabel">IP Addresses (one per line):</x:String>
|
<x:String x:Key="IpLabel">IP Addresses (one per line):</x:String>
|
||||||
<x:String x:Key="CancelBtn">Cancel</x:String>
|
<x:String x:Key="CancelBtn">Cancel</x:String>
|
||||||
<x:String x:Key="SaveDialogBtn">Save</x:String>
|
<x:String x:Key="SaveDialogBtn">Save</x:String>
|
||||||
|
|||||||
@@ -342,6 +342,11 @@ namespace NetworkDiagram
|
|||||||
nameText.Bind(TextBlock.TextProperty, new Avalonia.Data.Binding("Name"));
|
nameText.Bind(TextBlock.TextProperty, new Avalonia.Data.Binding("Name"));
|
||||||
stack.Children.Add(nameText);
|
stack.Children.Add(nameText);
|
||||||
|
|
||||||
|
var descText = new TextBlock { FontSize = 11, FontStyle = FontStyle.Italic, HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center, TextWrapping = TextWrapping.Wrap, TextAlignment = TextAlignment.Center, Opacity = 0.8 };
|
||||||
|
descText.Bind(TextBlock.TextProperty, new Avalonia.Data.Binding("Description"));
|
||||||
|
descText.Bind(TextBlock.IsVisibleProperty, new Avalonia.Data.Binding("Description") { Converter = Avalonia.Data.Converters.StringConverters.IsNotNullOrEmpty });
|
||||||
|
stack.Children.Add(descText);
|
||||||
|
|
||||||
var ips = new ItemsControl();
|
var ips = new ItemsControl();
|
||||||
ips.Bind(ItemsControl.ItemsSourceProperty, new Avalonia.Data.Binding("IpAddresses"));
|
ips.Bind(ItemsControl.ItemsSourceProperty, new Avalonia.Data.Binding("IpAddresses"));
|
||||||
|
|
||||||
@@ -796,31 +801,60 @@ namespace NetworkDiagram
|
|||||||
Background = Brushes.White,
|
Background = Brushes.White,
|
||||||
BorderBrush = (IBrush)Application.Current!.FindResource("GridBlue")!,
|
BorderBrush = (IBrush)Application.Current!.FindResource("GridBlue")!,
|
||||||
BorderThickness = new Thickness(1),
|
BorderThickness = new Thickness(1),
|
||||||
Width = original.Bounds.Width > 0 ? original.Bounds.Width : 120,
|
MinWidth = 100,
|
||||||
Height = original.Bounds.Height > 0 ? original.Bounds.Height : 100,
|
MinHeight = 80,
|
||||||
DataContext = device
|
MaxWidth = 180
|
||||||
};
|
};
|
||||||
|
|
||||||
var stack = new StackPanel { Spacing = 4 };
|
var stack = new StackPanel { Spacing = 4 };
|
||||||
|
|
||||||
var img = new Image { Width = 64, Height = 64 };
|
var img = new Image { Width = 64, Height = 64 };
|
||||||
img.Bind(Image.SourceProperty, new Avalonia.Data.Binding("IconPath") { Converter = ImageConverter.Instance });
|
if (ImageConverter.Instance.Convert(device.IconPath, typeof(IImage), null, System.Globalization.CultureInfo.CurrentCulture) is IImage iimg)
|
||||||
|
{
|
||||||
|
img.Source = iimg;
|
||||||
|
}
|
||||||
|
|
||||||
|
var primaryBlue = Application.Current!.FindResource("PrimaryBlue");
|
||||||
var txt = new TextBlock {
|
var txt = new TextBlock {
|
||||||
Text = device.Name,
|
Text = device.Name,
|
||||||
FontWeight = FontWeight.Bold,
|
FontWeight = FontWeight.Bold,
|
||||||
|
FontSize = 12,
|
||||||
HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center,
|
HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center,
|
||||||
Foreground = (IBrush)Application.Current!.FindResource("PrimaryBlue")!
|
TextWrapping = TextWrapping.Wrap,
|
||||||
|
TextAlignment = TextAlignment.Center
|
||||||
};
|
};
|
||||||
|
if (primaryBlue is IBrush brush) txt.Foreground = brush;
|
||||||
|
|
||||||
stack.Children.Add(img);
|
stack.Children.Add(img);
|
||||||
stack.Children.Add(txt);
|
stack.Children.Add(txt);
|
||||||
|
|
||||||
var ips = new ItemsControl { ItemsSource = device.IpAddresses };
|
if (!string.IsNullOrWhiteSpace(device.Description))
|
||||||
ips.ItemTemplate = new FuncDataTemplate<string>((val, _) => new TextBlock {
|
{
|
||||||
Text = val, FontSize = 10, HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center,
|
var desc = new TextBlock {
|
||||||
Foreground = (IBrush)Application.Current!.FindResource("AccentBlue")!
|
Text = device.Description,
|
||||||
});
|
FontSize = 11,
|
||||||
stack.Children.Add(ips);
|
FontStyle = FontStyle.Italic,
|
||||||
|
HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center,
|
||||||
|
TextWrapping = TextWrapping.Wrap,
|
||||||
|
TextAlignment = TextAlignment.Center,
|
||||||
|
Opacity = 0.8,
|
||||||
|
Foreground = Brushes.Black
|
||||||
|
};
|
||||||
|
stack.Children.Add(desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
var accentBlue = Application.Current!.FindResource("AccentBlue");
|
||||||
|
foreach (var ip in device.IpAddresses)
|
||||||
|
{
|
||||||
|
var tb = new TextBlock {
|
||||||
|
Text = ip,
|
||||||
|
FontSize = 10,
|
||||||
|
HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center,
|
||||||
|
TextWrapping = TextWrapping.Wrap
|
||||||
|
};
|
||||||
|
if (accentBlue is IBrush b) tb.Foreground = b;
|
||||||
|
stack.Children.Add(tb);
|
||||||
|
}
|
||||||
|
|
||||||
clone.Child = stack;
|
clone.Child = stack;
|
||||||
Canvas.SetLeft(clone, device.X - minX);
|
Canvas.SetLeft(clone, device.X - minX);
|
||||||
|
|||||||
@@ -38,6 +38,19 @@ namespace NetworkDiagram.Models
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string _description = string.Empty;
|
||||||
|
|
||||||
|
[JsonPropertyName("Description")]
|
||||||
|
public string Description
|
||||||
|
{
|
||||||
|
get => _description;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_description = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[JsonPropertyName("TemplateName")]
|
[JsonPropertyName("TemplateName")]
|
||||||
public string TemplateName { get; set; } = string.Empty;
|
public string TemplateName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user