Skip to content

Commit 05d6666

Browse files
Feature: More child dialogs (#3234)
* Feature: More child dialogs * Feature: PuTTY connect dialog * Feature: Migrate dialogs * Update Website/docs/changelog/next-release.md Co-authored-by: Copilot <[email protected]> * Fix: Copilot suggestion --------- Co-authored-by: Copilot <[email protected]>
1 parent f6c4b9c commit 05d6666

18 files changed

+265
-217
lines changed

Source/NETworkManager/Resources/Styles/ChildWindowStyles.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<Setter Property="TitleBarNonActiveBackground" Value="Transparent" />
1111
<Setter Property="OverlayBrush" Value="{DynamicResource ResourceKey=MahApps.Brushes.Gray.SemiTransparent}" />
1212
<Setter Property="TitleForeground" Value="{DynamicResource ResourceKey=MahApps.Brushes.Gray3}" />
13-
<Setter Property="ChildWindowWidth" Value="450" />
13+
<Setter Property="ChildWindowWidth" Value="500" />
1414
<Setter Property="ChildWindowMaxHeight" Value="500" />
1515
</Style>
1616
</ResourceDictionary>

Source/NETworkManager/ViewModels/PowerShellConnectViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class PowerShellConnectViewModel : ViewModelBase
1818

1919
private bool _enableRemoteConsole;
2020

21-
private List<ExecutionPolicy> _executionPolicies = new();
21+
private List<ExecutionPolicy> _executionPolicies = [];
2222

2323
private ExecutionPolicy _executionPolicy;
2424

Source/NETworkManager/ViewModels/PowerShellHostViewModel.cs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Dragablz;
22
using log4net;
33
using MahApps.Metro.Controls.Dialogs;
4+
using MahApps.Metro.SimpleChildWindow;
45
using NETworkManager.Controls;
56
using NETworkManager.Localization.Resources;
67
using NETworkManager.Models;
@@ -579,16 +580,15 @@ private void TryFindExecutable()
579580
Log.Warn("Install PowerShell or configure the path in the settings.");
580581
}
581582

582-
private async Task Connect(string host = null)
583+
private Task Connect(string host = null)
583584
{
584-
var customDialog = new CustomDialog
585-
{
586-
Title = Strings.Connect
587-
};
585+
var childWindow = new PowerShellConnectChildWindow();
588586

589-
var connectViewModel = new PowerShellConnectViewModel(async instance =>
587+
var childWindowViewModel = new PowerShellConnectViewModel(instance =>
590588
{
591-
await _dialogCoordinator.HideMetroDialogAsync(this, customDialog);
589+
childWindow.IsOpen = false;
590+
ConfigurationManager.Current.IsChildWindowOpen = false;
591+
592592
ConfigurationManager.OnDialogClose();
593593

594594
// Create profile info
@@ -606,21 +606,24 @@ private async Task Connect(string host = null)
606606
// Otherwise, in some cases, incorrect values are taken over.
607607
AddHostToHistory(instance.Host);
608608

609-
// Connect
610609
Connect(sessionInfo);
611-
}, async _ =>
610+
}, _ =>
612611
{
613-
await _dialogCoordinator.HideMetroDialogAsync(this, customDialog);
612+
childWindow.IsOpen = false;
613+
ConfigurationManager.Current.IsChildWindowOpen = false;
614+
614615
ConfigurationManager.OnDialogClose();
615616
}, host);
616617

617-
customDialog.Content = new PowerShellConnectDialog
618-
{
619-
DataContext = connectViewModel
620-
};
618+
childWindow.Title = Strings.Connect;
619+
620+
childWindow.DataContext = childWindowViewModel;
621+
622+
ConfigurationManager.Current.IsChildWindowOpen = true;
621623

622624
ConfigurationManager.OnDialogOpen();
623-
await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog);
625+
626+
return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow);
624627
}
625628

626629
private void ConnectProfile()

Source/NETworkManager/ViewModels/PuTTYHostViewModel.cs

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Dragablz;
22
using log4net;
33
using MahApps.Metro.Controls.Dialogs;
4+
using MahApps.Metro.SimpleChildWindow;
45
using NETworkManager.Controls;
56
using NETworkManager.Localization.Resources;
67
using NETworkManager.Models;
@@ -239,7 +240,7 @@ public bool IsProfileFilterSet
239240
OnPropertyChanged();
240241
}
241242
}
242-
243+
243244
private readonly GroupExpanderStateStore _groupExpanderStateStore = new();
244245
public GroupExpanderStateStore GroupExpanderStateStore => _groupExpanderStateStore;
245246

@@ -504,7 +505,7 @@ public ICommand TextBoxSearchLostFocusCommand
504505
private void OpenProfileFilterAction()
505506
{
506507
ConfigurationManager.Current.IsProfileFilterPopupOpen = true;
507-
508+
508509
ProfileFilterIsOpen = true;
509510
}
510511

@@ -524,7 +525,7 @@ private void ClearProfileFilterAction()
524525
_searchDisabled = true;
525526
Search = string.Empty;
526527
_searchDisabled = false;
527-
528+
528529
foreach (var tag in ProfileFilterTags)
529530
tag.IsSelected = false;
530531

@@ -547,7 +548,7 @@ private void CollapseAllProfileGroupsAction()
547548
{
548549
SetIsExpandedForAllProfileGroups(false);
549550
}
550-
551+
551552
public ICommand OpenSettingsCommand => new RelayCommand(_ => OpenSettingsAction());
552553

553554
private static void OpenSettingsAction()
@@ -588,16 +589,15 @@ private void TryFindExecutable()
588589
Log.Warn("Install PuTTY or configure the path in the settings.");
589590
}
590591

591-
private async Task Connect(string host = null)
592+
private Task Connect(string host = null)
592593
{
593-
var customDialog = new CustomDialog
594-
{
595-
Title = Strings.Connect
596-
};
594+
var childWindow = new PuTTYConnectChildWindow();
597595

598-
var connectViewModel = new PuTTYConnectViewModel(async instance =>
596+
var childWindowViewModel = new PuTTYConnectViewModel(instance =>
599597
{
600-
await _dialogCoordinator.HideMetroDialogAsync(this, customDialog);
598+
childWindow.IsOpen = false;
599+
ConfigurationManager.Current.IsChildWindowOpen = false;
600+
601601
ConfigurationManager.OnDialogClose();
602602

603603
// Create profile info
@@ -630,19 +630,23 @@ private async Task Connect(string host = null)
630630
AddProfileToHistory(instance.Profile);
631631

632632
Connect(sessionInfo);
633-
}, async _ =>
633+
}, _ =>
634634
{
635-
await _dialogCoordinator.HideMetroDialogAsync(this, customDialog);
635+
childWindow.IsOpen = false;
636+
ConfigurationManager.Current.IsChildWindowOpen = false;
637+
636638
ConfigurationManager.OnDialogClose();
637639
}, host);
638640

639-
customDialog.Content = new PuTTYConnectDialog
640-
{
641-
DataContext = connectViewModel
642-
};
641+
childWindow.Title = Strings.Connect;
642+
643+
childWindow.DataContext = childWindowViewModel;
644+
645+
ConfigurationManager.Current.IsChildWindowOpen = true;
643646

644647
ConfigurationManager.OnDialogOpen();
645-
await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog);
648+
649+
return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow);
646650
}
647651

648652
private void ConnectProfile()
@@ -660,7 +664,7 @@ private void ConnectProfileExternal()
660664
ProcessStartInfo info = new()
661665
{
662666
FileName = SettingsManager.Current.PuTTY_ApplicationFilePath,
663-
Arguments = Models.PuTTY.PuTTY.BuildCommandLine(sessionInfo)
667+
Arguments = PuTTY.BuildCommandLine(sessionInfo)
664668
};
665669

666670
Process.Start(info);
@@ -761,7 +765,7 @@ private void SetIsExpandedForAllProfileGroups(bool isExpanded)
761765
foreach (var group in Profiles.Groups.Cast<CollectionViewGroup>())
762766
GroupExpanderStateStore[group.Name.ToString()] = isExpanded;
763767
}
764-
768+
765769
private void ResizeProfile(bool dueToChangedSize)
766770
{
767771
_canProfileWidthChange = false;
@@ -907,7 +911,7 @@ public void OnProfileFilterClosed()
907911
{
908912
ConfigurationManager.Current.IsProfileFilterPopupOpen = false;
909913
}
910-
914+
911915
public void OnProfileManagerDialogOpen()
912916
{
913917
ConfigurationManager.OnDialogOpen();

Source/NETworkManager/ViewModels/RemoteDesktopHostViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ private static void CloseItemAction(ItemActionCallbackArgs<TabablzControl> args)
527527
// Connect via Dialog
528528
private Task Connect(string host = null)
529529
{
530-
var childWindow = new RemoteDesktopConnectChildWindow(Application.Current.MainWindow);
530+
var childWindow = new RemoteDesktopConnectChildWindow();
531531

532532
var childWindowViewModel = new RemoteDesktopConnectViewModel(instance =>
533533
{
@@ -606,7 +606,7 @@ private Task ConnectProfileAs()
606606

607607
var sessionInfo = RemoteDesktop.CreateSessionInfo(profileInfo);
608608

609-
var childWindow = new RemoteDesktopConnectChildWindow(Application.Current.MainWindow);
609+
var childWindow = new RemoteDesktopConnectChildWindow();
610610

611611
var childWindowViewModel = new RemoteDesktopConnectViewModel(instance =>
612612
{

Source/NETworkManager/ViewModels/WebConsoleHostViewModel.cs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Dragablz;
22
using MahApps.Metro.Controls.Dialogs;
3+
using MahApps.Metro.SimpleChildWindow;
34
using Microsoft.Web.WebView2.Core;
45
using NETworkManager.Controls;
56
using NETworkManager.Localization.Resources;
@@ -485,16 +486,15 @@ private static void OpenWebsiteAction(object url)
485486

486487
#region Methods
487488

488-
private async Task Connect()
489+
private Task Connect()
489490
{
490-
var customDialog = new CustomDialog
491-
{
492-
Title = Strings.Connect
493-
};
491+
var childWindow = new WebConsoleConnectChildWindow();
494492

495-
var connectViewModel = new WebConsoleConnectViewModel(async instance =>
493+
var childWindowViewModel = new WebConsoleConnectViewModel(instance =>
496494
{
497-
await _dialogCoordinator.HideMetroDialogAsync(this, customDialog);
495+
childWindow.IsOpen = false;
496+
ConfigurationManager.Current.IsChildWindowOpen = false;
497+
498498
ConfigurationManager.OnDialogClose();
499499

500500
// Create profile info
@@ -509,19 +509,23 @@ private async Task Connect()
509509
AddUrlToHistory(instance.Url);
510510

511511
Connect(info);
512-
}, async _ =>
512+
}, _ =>
513513
{
514-
await _dialogCoordinator.HideMetroDialogAsync(this, customDialog);
514+
childWindow.IsOpen = false;
515+
ConfigurationManager.Current.IsChildWindowOpen = false;
516+
515517
ConfigurationManager.OnDialogClose();
516518
});
517519

518-
customDialog.Content = new WebConsoleConnectDialog
519-
{
520-
DataContext = connectViewModel
521-
};
520+
childWindow.Title = Strings.Connect;
521+
522+
childWindow.DataContext = childWindowViewModel;
523+
524+
ConfigurationManager.Current.IsChildWindowOpen = true;
522525

523526
ConfigurationManager.OnDialogOpen();
524-
await _dialogCoordinator.ShowMetroDialogAsync(this, customDialog);
527+
528+
return (Application.Current.MainWindow as MainWindow).ShowChildWindowAsync(childWindow);
525529
}
526530

527531
private void ConnectProfile()

Source/NETworkManager/Views/PowerShellConnectDialog.xaml renamed to Source/NETworkManager/Views/PowerShellConnectChildWindow.xaml

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
1-
<UserControl x:Class="NETworkManager.Views.PowerShellConnectDialog"
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:mah="http://metro.mahapps.com/winfx/xaml/controls"
8-
xmlns:viewModels="clr-namespace:NETworkManager.ViewModels"
9-
xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization"
10-
xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters"
11-
mc:Ignorable="d" Loaded="UserControl_Loaded"
12-
d:DataContext="{d:DesignInstance viewModels:PowerShellConnectViewModel}">
13-
<UserControl.Resources>
1+
<simpleChildWindow:ChildWindow x:Class="NETworkManager.Views.PowerShellConnectChildWindow"
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:mah="http://metro.mahapps.com/winfx/xaml/controls"
8+
xmlns:viewModels="clr-namespace:NETworkManager.ViewModels"
9+
xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization"
10+
xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters"
11+
xmlns:simpleChildWindow="clr-namespace:MahApps.Metro.SimpleChildWindow;assembly=MahApps.Metro.SimpleChildWindow"
12+
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
13+
CloseButtonCommand="{Binding Path=CancelCommand}"
14+
Style="{StaticResource DefaultChildWindow}"
15+
Loaded="ChildWindow_OnLoaded"
16+
mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:PowerShellConnectViewModel}">
17+
<simpleChildWindow:ChildWindow.Resources>
1418
<converters:BooleanReverseToVisibilityCollapsedConverter x:Key="BooleanReverseToVisibilityCollapsedConverter" />
1519
<converters:BooleanToVisibilityCollapsedConverter x:Key="BooleanToVisibilityCollapsedConverter" />
16-
</UserControl.Resources>
17-
<Grid Margin="0,20">
20+
</simpleChildWindow:ChildWindow.Resources>
21+
<Grid Margin="10">
1822
<Grid.RowDefinitions>
1923
<RowDefinition Height="Auto" />
2024
<RowDefinition Height="Auto" />
@@ -42,7 +46,7 @@
4246
</Grid.RowDefinitions>
4347
<TextBlock Grid.Column="0" Grid.Row="0" Text="{x:Static localization:Strings.RemoteConsole}" />
4448
<mah:ToggleSwitch Grid.Column="2" Grid.Row="0" OffContent="" OnContent=""
45-
IsOn="{Binding EnableRemoteConsole}" />
49+
IsOn="{Binding EnableRemoteConsole}" />
4650
<TextBlock Grid.Column="0" Grid.Row="2">
4751
<TextBlock.Style>
4852
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource CenterTextBlock}">
@@ -56,10 +60,10 @@
5660
</TextBlock.Style>
5761
</TextBlock>
5862
<ComboBox x:Name="ComboBoxHost" Grid.Column="2" Grid.Row="2" ItemsSource="{Binding HostHistoryView}"
59-
mah:TextBoxHelper.Watermark="{x:Static localization:StaticStrings.ExampleHostname}"
60-
IsEnabled="{Binding EnableRemoteConsole}"
61-
Visibility="{Binding EnableRemoteConsole, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}"
62-
Style="{StaticResource EditableComboBox}">
63+
mah:TextBoxHelper.Watermark="{x:Static localization:StaticStrings.ExampleHostname}"
64+
IsEnabled="{Binding EnableRemoteConsole}"
65+
Visibility="{Binding EnableRemoteConsole, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}"
66+
Style="{StaticResource EditableComboBox}">
6367
<ComboBox.Text>
6468
<Binding Path="Host" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
6569
<Binding.ValidationRules>
@@ -70,20 +74,20 @@
7074
</ComboBox.Text>
7175
</ComboBox>
7276
<TextBox x:Name="TextBoxCommand" Grid.Column="2" Grid.Row="2"
73-
Text="{Binding Command, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
74-
Visibility="{Binding EnableRemoteConsole, Converter={StaticResource BooleanReverseToVisibilityCollapsedConverter}}"
75-
Style="{StaticResource DefaultTextBox}" />
77+
Text="{Binding Command, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
78+
Visibility="{Binding EnableRemoteConsole, Converter={StaticResource BooleanReverseToVisibilityCollapsedConverter}}"
79+
Style="{StaticResource DefaultTextBox}" />
7680
<TextBlock Grid.Column="0" Grid.Row="4" Text="{x:Static localization:Strings.AdditionalCommandLine}" />
7781
<TextBox x:Name="TextBoxAdditionalCommandLine" Grid.Column="2" Grid.Row="4"
78-
Text="{Binding AdditionalCommandLine, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
79-
Style="{StaticResource DefaultTextBox}" />
82+
Text="{Binding AdditionalCommandLine, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
83+
Style="{StaticResource DefaultTextBox}" />
8084
<TextBlock Grid.Column="0" Grid.Row="6" Text="{x:Static localization:Strings.ExecutionPolicy}" />
8185
<ComboBox x:Name="ComboBoxTypes" Grid.Column="2" Grid.Row="6" ItemsSource="{Binding ExecutionPolicies}"
82-
SelectedItem="{Binding ExecutionPolicy}" />
86+
SelectedItem="{Binding ExecutionPolicy}" />
8387
</Grid>
8488
<StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Right">
8589
<Button Content="{x:Static localization:Strings.Connect}" Command="{Binding ConnectCommand}"
86-
IsDefault="True" Margin="0,0,10,0">
90+
IsDefault="True" Margin="0,0,10,0">
8791
<Button.Style>
8892
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource HighlightedButton}">
8993
<Setter Property="IsEnabled" Value="True" />
@@ -92,7 +96,7 @@
9296
<MultiDataTrigger.Conditions>
9397
<Condition Binding="{Binding EnableRemoteConsole}" Value="True" />
9498
<Condition Binding="{Binding Path=(Validation.HasError), ElementName=ComboBoxHost}"
95-
Value="True" />
99+
Value="True" />
96100
</MultiDataTrigger.Conditions>
97101
<MultiDataTrigger.Setters>
98102
<Setter Property="IsEnabled" Value="False" />
@@ -103,7 +107,7 @@
103107
</Button.Style>
104108
</Button>
105109
<Button Content="{x:Static localization:Strings.Cancel}" Command="{Binding CancelCommand}" IsCancel="True"
106-
Style="{StaticResource DefaultButton}" />
110+
Style="{StaticResource DefaultButton}" />
107111
</StackPanel>
108112
</Grid>
109-
</UserControl>
113+
</simpleChildWindow:ChildWindow>

0 commit comments

Comments
 (0)