Skip to content

Commit c8d1e16

Browse files
committed
Design: Migrate dns server to child window
1 parent 581d83b commit c8d1e16

File tree

3 files changed

+275
-34
lines changed

3 files changed

+275
-34
lines changed

Source/NETworkManager/ViewModels/DNSLookupSettingsViewModel.cs

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ private void LoadSettings()
367367
}
368368

369369
#endregion
370-
370+
371371
#region ICommand & Actions
372372

373373
/// <summary>
@@ -418,56 +418,62 @@ private void DeleteDNSServerAction()
418418
/// </summary>
419419
private async Task AddDNSServer()
420420
{
421-
var customDialog = new CustomDialog
422-
{
423-
Title = Strings.AddDNSServer
424-
};
421+
var childWindow = new ServerConnectionInfoProfileChildWindow();
425422

426-
var viewModel = new ServerConnectionInfoProfileViewModel(instance =>
427-
{
428-
_dialogCoordinator.HideMetroDialogAsync(this, customDialog);
423+
var childWindowViewModel = new ServerConnectionInfoProfileViewModel(instance =>
424+
{
425+
childWindow.IsOpen = false;
426+
ConfigurationManager.Current.IsChildWindowOpen = false;
429427

430-
SettingsManager.Current.DNSLookup_DNSServers.Add(
431-
new DNSServerConnectionInfoProfile(instance.Name, instance.Servers.ToList()));
432-
}, _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); },
433-
(ServerInfoProfileNames, false, true),
428+
SettingsManager.Current.DNSLookup_DNSServers.Add(
429+
new DNSServerConnectionInfoProfile(instance.Name, [.. instance.Servers]));
430+
}, _ =>
431+
{
432+
childWindow.IsOpen = false;
433+
ConfigurationManager.Current.IsChildWindowOpen = false;
434+
},
435+
(ServerInfoProfileNames, false, false),
434436
_profileDialogDefaultValues);
435437

436-
customDialog.Content = new ServerConnectionInfoProfileDialog
437-
{
438-
DataContext = viewModel
439-
};
438+
childWindow.Title = Strings.AddDNSServer;
439+
440+
childWindow.DataContext = childWindowViewModel;
441+
442+
ConfigurationManager.Current.IsChildWindowOpen = true;
440443

441-
await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog);
444+
await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow);
442445
}
443446

444447
/// <summary>
445448
/// Edits the selected DNS server.
446449
/// </summary>
447450
public async Task EditDNSServer()
448451
{
449-
var customDialog = new CustomDialog
450-
{
451-
Title = Strings.EditDNSServer
452-
};
452+
var childWindow = new ServerConnectionInfoProfileChildWindow();
453453

454-
var viewModel = new ServerConnectionInfoProfileViewModel(instance =>
455-
{
456-
_dialogCoordinator.HideMetroDialogAsync(this, customDialog);
454+
var childWindowViewModel = new ServerConnectionInfoProfileViewModel(instance =>
455+
{
456+
childWindow.IsOpen = false;
457+
ConfigurationManager.Current.IsChildWindowOpen = false;
457458

458-
SettingsManager.Current.DNSLookup_DNSServers.Remove(SelectedDNSServer);
459-
SettingsManager.Current.DNSLookup_DNSServers.Add(
460-
new DNSServerConnectionInfoProfile(instance.Name, instance.Servers.ToList()));
461-
}, _ => { _dialogCoordinator.HideMetroDialogAsync(this, customDialog); },
462-
(ServerInfoProfileNames, true, true),
459+
SettingsManager.Current.DNSLookup_DNSServers.Remove(SelectedDNSServer);
460+
SettingsManager.Current.DNSLookup_DNSServers.Add(
461+
new DNSServerConnectionInfoProfile(instance.Name, [.. instance.Servers]));
462+
}, _ =>
463+
{
464+
childWindow.IsOpen = false;
465+
ConfigurationManager.Current.IsChildWindowOpen = false;
466+
},
467+
(ServerInfoProfileNames, true, false),
463468
_profileDialogDefaultValues, SelectedDNSServer);
464469

465-
customDialog.Content = new ServerConnectionInfoProfileDialog
466-
{
467-
DataContext = viewModel
468-
};
470+
childWindow.Title = Strings.EditDNSServer;
471+
472+
childWindow.DataContext = childWindowViewModel;
473+
474+
ConfigurationManager.Current.IsChildWindowOpen = true;
469475

470-
await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog);
476+
await (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow);
471477
}
472478

473479
/// <summary>
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
<simpleChildWindow:ChildWindow x:Class="NETworkManager.Views.ServerConnectionInfoProfileChildWindow"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
xmlns:validators="clr-namespace:NETworkManager.Validators;assembly=NETworkManager.Validators"
7+
xmlns:wpfHelpers="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF"
8+
xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls"
9+
xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models"
10+
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
11+
xmlns:viewModels="clr-namespace:NETworkManager.ViewModels"
12+
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
13+
xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization"
14+
xmlns:interactivity="http://schemas.microsoft.com/xaml/behaviors"
15+
xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters"
16+
xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow"
17+
CloseButtonCommand="{Binding Path=CancelCommand}"
18+
Style="{StaticResource DefaultChildWindow}"
19+
Loaded="ChildWindow_OnLoaded"
20+
mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:ServerConnectionInfoProfileViewModel}">
21+
<Grid Margin="10">
22+
<Grid.RowDefinitions>
23+
<RowDefinition Height="Auto" />
24+
<RowDefinition Height="10" />
25+
<RowDefinition Height="*" />
26+
<RowDefinition Height="10" />
27+
<RowDefinition Height="Auto" />
28+
<RowDefinition Height="10" />
29+
<RowDefinition Height="Auto" />
30+
</Grid.RowDefinitions>
31+
<Grid Grid.Row="0">
32+
<Grid.Resources>
33+
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource CenterTextBlock}" />
34+
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource DefaultTextBox}" />
35+
</Grid.Resources>
36+
<Grid.ColumnDefinitions>
37+
<ColumnDefinition Width="1*" />
38+
<ColumnDefinition Width="10" />
39+
<ColumnDefinition Width="1*" />
40+
</Grid.ColumnDefinitions>
41+
<Grid.RowDefinitions>
42+
<RowDefinition Height="Auto" />
43+
</Grid.RowDefinitions>
44+
<TextBlock Grid.Column="0" Grid.Row="0" Text="{x:Static localization:Strings.Name}" />
45+
<TextBox x:Name="TextBoxName" Grid.Column="2" Grid.Row="0"
46+
mah:TextBoxHelper.Watermark="{x:Static localization:StaticStrings.ExampleGroupServers}">
47+
<TextBox.Resources>
48+
<wpfHelpers:BindingProxy x:Key="BindingProxy" Data="{Binding}" />
49+
</TextBox.Resources>
50+
<TextBox.Text>
51+
<Binding Path="Name" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
52+
<Binding.ValidationRules>
53+
<validators:EmptyValidator ValidatesOnTargetUpdated="True" />
54+
<validators:IsNameUnique ValidatesOnTargetUpdated="True">
55+
<validators:IsNameUnique.Wrapper>
56+
<validators:IsNameUniqueDependencyObjectWrapper
57+
UsedNames="{Binding Data.UsedNames, Source={StaticResource BindingProxy}}" />
58+
</validators:IsNameUnique.Wrapper>
59+
</validators:IsNameUnique>
60+
</Binding.ValidationRules>
61+
</Binding>
62+
</TextBox.Text>
63+
</TextBox>
64+
</Grid>
65+
<controls:MultiSelectDataGrid x:Name="DataGridServers" Grid.Column="0" Grid.Row="2"
66+
ItemsSource="{Binding Servers}"
67+
SelectedItemsList="{Binding SelectedServers, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
68+
<controls:MultiSelectDataGrid.Resources>
69+
<ContextMenu x:Key="ContextMenu" Opened="ContextMenu_Opened" MinWidth="150">
70+
<MenuItem Header="{x:Static localization:Strings.Delete}" Command="{Binding DeleteServerCommand}">
71+
<MenuItem.Icon>
72+
<Rectangle Width="16" Height="16" Fill="{DynamicResource MahApps.Brushes.Gray3}">
73+
<Rectangle.OpacityMask>
74+
<VisualBrush Stretch="Uniform" Visual="{iconPacks:Material Kind=Close}" />
75+
</Rectangle.OpacityMask>
76+
</Rectangle>
77+
</MenuItem.Icon>
78+
</MenuItem>
79+
</ContextMenu>
80+
</controls:MultiSelectDataGrid.Resources>
81+
<controls:MultiSelectDataGrid.Columns>
82+
<DataGridTextColumn Header="{x:Static localization:Strings.Server}"
83+
Binding="{Binding (network:ServerConnectionInfo.Server)}"
84+
SortMemberPath="Server"
85+
Width="250" />
86+
<DataGridTextColumn Header="{x:Static localization:Strings.Port}"
87+
SortMemberPath="Port"
88+
Binding="{Binding (network:ServerConnectionInfo.Port)}"
89+
Width="*" />
90+
</controls:MultiSelectDataGrid.Columns>
91+
<controls:MultiSelectDataGrid.InputBindings>
92+
<KeyBinding Command="{Binding DeleteServerCommand}" Key="Delete" />
93+
</controls:MultiSelectDataGrid.InputBindings>
94+
<controls:MultiSelectDataGrid.RowStyle>
95+
<Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource MahApps.Styles.DataGridRow}">
96+
<Setter Property="ContextMenu" Value="{StaticResource ContextMenu}" />
97+
</Style>
98+
</controls:MultiSelectDataGrid.RowStyle>
99+
</controls:MultiSelectDataGrid>
100+
<Grid Grid.Column="0" Grid.Row="4">
101+
<Grid.ColumnDefinitions>
102+
<ColumnDefinition Width="240" />
103+
<ColumnDefinition Width="10" />
104+
<ColumnDefinition Width="*" />
105+
<ColumnDefinition Width="10" />
106+
<ColumnDefinition Width="Auto" />
107+
</Grid.ColumnDefinitions>
108+
<TextBox x:Name="TextBoxServer" Grid.Column="0" Grid.Row="0"
109+
mah:TextBoxHelper.Watermark="{Binding ServerWatermark}">
110+
<TextBox.Resources>
111+
<wpfHelpers:BindingProxy x:Key="BindingProxy" Data="{Binding}" />
112+
</TextBox.Resources>
113+
<TextBox.Text>
114+
<Binding Path="Server" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
115+
<Binding.ValidationRules>
116+
<validators:EmptyValidator ValidatesOnTargetUpdated="True" />
117+
<validators:ServerValidator ValidatesOnTargetUpdated="True">
118+
<validators:ServerValidator.Wrapper>
119+
<validators:ServerDependencyObjectWrapper
120+
AllowOnlyIPAddress="{Binding Data.AllowOnlyIPAddress, Source={StaticResource BindingProxy}}" />
121+
</validators:ServerValidator.Wrapper>
122+
</validators:ServerValidator>
123+
</Binding.ValidationRules>
124+
</Binding>
125+
</TextBox.Text>
126+
</TextBox>
127+
<TextBox x:Name="TextBoxPort" Grid.Column="2" Grid.Row="0"
128+
mah:TextBoxHelper.Watermark="{Binding PortWatermark}">
129+
<TextBox.Text>
130+
<Binding Path="Port" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
131+
<Binding.ValidationRules>
132+
<validators:PortValidator ValidatesOnTargetUpdated="True" />
133+
</Binding.ValidationRules>
134+
</Binding>
135+
</TextBox.Text>
136+
</TextBox>
137+
<Button Grid.Column="4" Grid.Row="0" Command="{Binding AddServerCommand}"
138+
ToolTip="{x:Static localization:Strings.AddServer}">
139+
<Button.Resources>
140+
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ImageButton}">
141+
<Setter Property="MinHeight" Value="0" />
142+
<Setter Property="MinWidth" Value="0" />
143+
<Setter Property="Width" Value="{Binding ElementName=TextBoxPort, Path=ActualHeight}" />
144+
<Setter Property="Height" Value="{Binding ElementName=TextBoxPort, Path=ActualHeight}" />
145+
<Style.Triggers>
146+
<MultiDataTrigger>
147+
<MultiDataTrigger.Conditions>
148+
<Condition
149+
Binding="{Binding Path=(Validation.HasError), ElementName=TextBoxServer}"
150+
Value="True" />
151+
</MultiDataTrigger.Conditions>
152+
<MultiDataTrigger.Setters>
153+
<Setter Property="IsEnabled" Value="False" />
154+
</MultiDataTrigger.Setters>
155+
</MultiDataTrigger>
156+
<MultiDataTrigger>
157+
<MultiDataTrigger.Conditions>
158+
<Condition Binding="{Binding Path=(Validation.HasError), ElementName=TextBoxPort}"
159+
Value="True" />
160+
</MultiDataTrigger.Conditions>
161+
<MultiDataTrigger.Setters>
162+
<Setter Property="IsEnabled" Value="False" />
163+
</MultiDataTrigger.Setters>
164+
</MultiDataTrigger>
165+
</Style.Triggers>
166+
</Style>
167+
</Button.Resources>
168+
<Rectangle Width="16" Height="16" Fill="{DynamicResource MahApps.Brushes.Gray3}">
169+
<Rectangle.OpacityMask>
170+
<VisualBrush Stretch="Uniform" Visual="{iconPacks:Material Kind=Plus}" />
171+
</Rectangle.OpacityMask>
172+
</Rectangle>
173+
</Button>
174+
</Grid>
175+
<StackPanel Grid.Column="0" Grid.Row="6" Orientation="Horizontal" HorizontalAlignment="Right" MinWidth="80">
176+
<Button Content="{x:Static localization:Strings.Save}" Command="{Binding SaveCommand}" IsDefault="True"
177+
Margin="0,0,10,0">
178+
<Button.Style>
179+
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource HighlightedButton}">
180+
<Style.Triggers>
181+
<MultiDataTrigger>
182+
<MultiDataTrigger.Conditions>
183+
<Condition Binding="{Binding Path=(Validation.HasError), ElementName=TextBoxName}"
184+
Value="True" />
185+
</MultiDataTrigger.Conditions>
186+
<MultiDataTrigger.Setters>
187+
<Setter Property="IsEnabled" Value="False" />
188+
</MultiDataTrigger.Setters>
189+
</MultiDataTrigger>
190+
<MultiDataTrigger>
191+
<MultiDataTrigger.Conditions>
192+
<Condition Binding="{Binding Path=Servers.Count}" Value="0" />
193+
</MultiDataTrigger.Conditions>
194+
<MultiDataTrigger.Setters>
195+
<Setter Property="IsEnabled" Value="False" />
196+
</MultiDataTrigger.Setters>
197+
</MultiDataTrigger>
198+
</Style.Triggers>
199+
</Style>
200+
</Button.Style>
201+
</Button>
202+
<Button Content="{x:Static localization:Strings.Cancel}" Command="{Binding CancelCommand}" IsCancel="True"
203+
Style="{StaticResource DefaultButton}" />
204+
</StackPanel>
205+
</Grid>
206+
</simpleChildWindow:ChildWindow>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using NETworkManager.ViewModels;
2+
using System;
3+
using System.Windows;
4+
using System.Windows.Controls;
5+
using System.Windows.Threading;
6+
7+
namespace NETworkManager.Views;
8+
9+
public partial class ServerConnectionInfoProfileChildWindow
10+
{
11+
public ServerConnectionInfoProfileChildWindow()
12+
{
13+
InitializeComponent();
14+
}
15+
16+
private void ChildWindow_OnLoaded(object sender, RoutedEventArgs e)
17+
{
18+
Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(delegate
19+
{
20+
TextBoxName.Focus();
21+
}));
22+
}
23+
24+
private void ContextMenu_Opened(object sender, RoutedEventArgs e)
25+
{
26+
if (sender is ContextMenu menu)
27+
menu.DataContext = (ServerConnectionInfoProfileViewModel)DataContext;
28+
}
29+
}

0 commit comments

Comments
 (0)