Skip to content

Commit b7e9ba3

Browse files
authored
Feature: Migrate profile to simplechildwindow (#3087)
* Feature: Migrate to simplechildwindow * Chore: Adjust some colors & validations * Feature: Improve design / dialogs * Chore: Cleanup * Feature: Delete dialog added * Feature: Update OK Delete Info Dialog design * Docs: #3087 * Fix: Profile file name case insensitive * Update DNSLookup.cs
1 parent 4f02daf commit b7e9ba3

File tree

54 files changed

+790
-1183
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+790
-1183
lines changed

Source/NETworkManager.Models/Network/DNSLookup.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,6 @@ private void ProcessDnsAnswers(IEnumerable<DnsResourceRecord> answers, NameServe
232232
if (answers is not DnsResourceRecord[] dnsResourceRecords)
233233
return;
234234

235-
Debug.WriteLine(dnsResourceRecords);
236-
237235
// A
238236
foreach (var record in dnsResourceRecords.OfType<ARecord>())
239237
OnRecordReceived(new DNSLookupRecordReceivedArgs(

Source/NETworkManager.Profiles/IProfileManagerMinimal.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ public interface IProfileManagerMinimal
1111
/// </summary>
1212
public void OnProfileManagerDialogOpen()
1313
{
14+
1415
}
1516

1617
/// <summary>
1718
/// Event is fired when a dialog in the <see cref="ProfileManager" /> is closed.
1819
/// </summary>
1920
public void OnProfileManagerDialogClose()
2021
{
22+
2123
}
22-
}
24+
}

Source/NETworkManager.Utilities.WPF/BindingProxy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ protected override Freezable CreateInstanceCore()
1717
{
1818
return new BindingProxy();
1919
}
20-
}
20+
}

Source/NETworkManager.Validators/ProfileFileUniqueValidator.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Globalization;
1+
using System;
2+
using System.Globalization;
23
using System.Linq;
34
using System.Windows.Controls;
45
using NETworkManager.Localization.Resources;
@@ -10,7 +11,8 @@ public class ProfileFileUniqueValidator : ValidationRule
1011
{
1112
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
1213
{
13-
return ProfileManager.ProfileFiles.Any(x => x.Name == value as string)
14+
return ProfileManager.ProfileFiles.Any(x =>
15+
string.Equals(x.Name, value as string, StringComparison.OrdinalIgnoreCase))
1416
? new ValidationResult(false, Strings.ProfileNameAlreadyExists)
1517
: ValidationResult.ValidResult;
1618
}

Source/NETworkManager/MainWindow.xaml

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -238,16 +238,25 @@
238238
</StackPanel>
239239
</Button>
240240
<Button Command="{Binding OpenWebsiteCommand}"
241-
ToolTip="{x:Static localization:Strings.ToolTip_SupportThisProjectWithADonation}"
242-
CommandParameter="{x:Static resources:Resources.NETworkManager_DonateUrl}"
243-
Cursor="Hand"
244-
Focusable="False">
241+
ToolTip="{x:Static localization:Strings.ToolTip_SupportThisProjectWithADonation}"
242+
CommandParameter="{x:Static resources:Resources.NETworkManager_DonateUrl}"
243+
Cursor="Hand"
244+
Focusable="False">
245245
<StackPanel Orientation="Horizontal">
246-
<Rectangle Width="20" Height="20"
247-
Fill="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Foreground}">
246+
<Rectangle Width="20" Height="20">
248247
<Rectangle.OpacityMask>
249248
<VisualBrush Stretch="Uniform" Visual="{iconPacks:Material Kind=Heart}" />
250249
</Rectangle.OpacityMask>
250+
<Rectangle.Style>
251+
<Style TargetType="Rectangle">
252+
<Setter Property="Fill" Value="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Foreground}" />
253+
<Style.Triggers>
254+
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Button}}, Path=IsMouseOver}" Value="True">
255+
<Setter Property="Fill" Value="#b95353" />
256+
</DataTrigger>
257+
</Style.Triggers>
258+
</Style>
259+
</Rectangle.Style>
251260
</Rectangle>
252261
</StackPanel>
253262
</Button>

Source/NETworkManager/MainWindow.xaml.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,6 @@ await this.ShowMessageAsync(Strings.SettingsHaveBeenReset,
472472
// Show welcome dialog
473473
if (SettingsManager.Current.WelcomeDialog_Show)
474474
{
475-
476475
var childWindow = new WelcomeChildWindow();
477476

478477
var viewModel = new WelcomeViewModel(instance =>
@@ -1443,6 +1442,8 @@ private async void LoadProfile(ProfileFileInfo info, bool showWrongPassword = fa
14431442
ProfileManager.Unload();
14441443
}, info.Name, showWrongPassword);
14451444

1445+
childWindow.Title = Strings.UnlockProfileFile;
1446+
14461447
childWindow.DataContext = viewModel;
14471448

14481449
ConfigurationManager.OnDialogOpen();

Source/NETworkManager/NETworkManager.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@
141141
<XamlRuntime>Wpf</XamlRuntime>
142142
<SubType>Designer</SubType>
143143
</Page>
144+
<Page Update="Views\OKCancelInfoMessageChildWindow.xaml">
145+
<Generator>MSBuild:Compile</Generator>
146+
<XamlRuntime>Wpf</XamlRuntime>
147+
<SubType>Designer</SubType>
148+
</Page>
144149
</ItemGroup>
145150
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
146151
<Exec Command="PowerShell.exe -ExecutionPolicy Bypass -NoProfile -File &quot;$(ProjectDir)..\..\Scripts\PreBuildEventCommandLine.ps1&quot; &quot;$(TargetDir)&quot;" />

Source/NETworkManager/ProfileDialogManager.cs

Lines changed: 96 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@
99
using NETworkManager.Views;
1010
using System;
1111
using System.Collections.Generic;
12+
using System.Configuration;
13+
using System.Diagnostics;
1214
using System.Security;
1315
using System.Threading.Tasks;
1416
using System.Windows;
17+
using MahApps.Metro.SimpleChildWindow;
1518

1619
namespace NETworkManager;
1720

@@ -306,7 +309,7 @@ private static GroupInfo ParseGroupInfo(GroupViewModel instance)
306309
{
307310
Name = name,
308311
Description = instance.Description?.Trim(),
309-
312+
310313
Profiles = profiles,
311314

312315
// Remote Desktop
@@ -466,133 +469,138 @@ private static GroupInfo ParseGroupInfo(GroupViewModel instance)
466469

467470
#region Dialog to add, edit, copy as and delete profile
468471

469-
public static Task ShowAddProfileDialog(object context, IProfileManagerMinimal viewModel,
470-
IDialogCoordinator dialogCoordinator, ProfileInfo profile = null, string group = null,
472+
public static Task ShowAddProfileDialog(Window parentWindow, IProfileManagerMinimal viewModel,
473+
ProfileInfo profile = null, string group = null,
471474
ApplicationName applicationName = ApplicationName.None)
472475
{
473-
CustomDialog customDialog = new()
474-
{
475-
Title = Strings.AddProfile,
476-
Style = (Style)Application.Current.FindResource(DialogResourceKey)
477-
};
476+
var childWindow = new ProfileChildWindow(parentWindow);
478477

479-
ProfileViewModel profileViewModel = new(async instance =>
478+
ProfileViewModel childWindowViewModel = new(instance =>
480479
{
481-
await dialogCoordinator.HideMetroDialogAsync(context, customDialog);
480+
childWindow.IsOpen = false;
481+
Settings.ConfigurationManager.Current.IsChildWindowOpen = false;
482+
482483
viewModel.OnProfileManagerDialogClose();
483484

484485
ProfileManager.AddProfile(ParseProfileInfo(instance));
485-
}, async _ =>
486+
}, _ =>
486487
{
487-
await dialogCoordinator.HideMetroDialogAsync(context, customDialog);
488+
Debug.WriteLine("Profile dialog closed without saving");
489+
490+
childWindow.IsOpen = false;
491+
Settings.ConfigurationManager.Current.IsChildWindowOpen = false;
492+
488493
viewModel.OnProfileManagerDialogClose();
489494
}, ProfileManager.GetGroupNames(), group, ProfileEditMode.Add, profile, applicationName);
490495

491-
customDialog.Content = new ProfileDialog
492-
{
493-
DataContext = profileViewModel
494-
};
496+
childWindow.Title = Strings.AddProfile;
495497

496-
viewModel.OnProfileManagerDialogOpen();
498+
childWindow.DataContext = childWindowViewModel;
497499

498-
return dialogCoordinator.ShowMetroDialogAsync(context, customDialog);
500+
viewModel.OnProfileManagerDialogOpen();
501+
502+
Settings.ConfigurationManager.Current.IsChildWindowOpen = true;
503+
504+
return parentWindow.ShowChildWindowAsync(childWindow);
499505
}
500506

501-
public static Task ShowEditProfileDialog(IProfileManagerMinimal viewModel,
502-
IDialogCoordinator dialogCoordinator, ProfileInfo profile)
507+
public static Task ShowEditProfileDialog(Window parentWindow, IProfileManagerMinimal viewModel,
508+
ProfileInfo profile)
503509
{
504-
CustomDialog customDialog = new()
505-
{
506-
Title = Strings.EditProfile,
507-
Style = (Style)Application.Current.FindResource(DialogResourceKey)
508-
};
510+
var childWindow = new ProfileChildWindow(parentWindow);
509511

510-
ProfileViewModel profileViewModel = new(async instance =>
512+
ProfileViewModel childWindowViewModel = new(instance =>
511513
{
512-
await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog);
514+
childWindow.IsOpen = false;
515+
Settings.ConfigurationManager.Current.IsChildWindowOpen = false;
516+
513517
viewModel.OnProfileManagerDialogClose();
514518

515519
ProfileManager.ReplaceProfile(profile, ParseProfileInfo(instance));
516-
}, async _ =>
520+
}, _ =>
517521
{
518-
await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog);
522+
childWindow.IsOpen = false;
523+
Settings.ConfigurationManager.Current.IsChildWindowOpen = false;
524+
519525
viewModel.OnProfileManagerDialogClose();
520526
}, ProfileManager.GetGroupNames(), profile.Group, ProfileEditMode.Edit, profile);
521527

522-
customDialog.Content = new ProfileDialog
523-
{
524-
DataContext = profileViewModel
525-
};
528+
childWindow.Title = Strings.EditProfile;
526529

527-
viewModel.OnProfileManagerDialogOpen();
530+
childWindow.DataContext = childWindowViewModel;
528531

529-
return dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog);
532+
viewModel.OnProfileManagerDialogOpen();
533+
534+
Settings.ConfigurationManager.Current.IsChildWindowOpen = true;
535+
536+
return parentWindow.ShowChildWindowAsync(childWindow);
530537
}
531538

532-
public static Task ShowCopyAsProfileDialog(IProfileManagerMinimal viewModel,
533-
IDialogCoordinator dialogCoordinator, ProfileInfo profile)
539+
public static Task ShowCopyAsProfileDialog(Window parentWindow, IProfileManagerMinimal viewModel,
540+
ProfileInfo profile)
534541
{
535-
CustomDialog customDialog = new()
536-
{
537-
Title = Strings.CopyProfile,
538-
Style = (Style)Application.Current.FindResource(DialogResourceKey)
539-
};
542+
var childWindow = new ProfileChildWindow(parentWindow);
540543

541-
ProfileViewModel profileViewModel = new(async instance =>
544+
ProfileViewModel childWindowViewModel = new(instance =>
542545
{
543-
await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog);
546+
childWindow.IsOpen = false;
547+
Settings.ConfigurationManager.Current.IsChildWindowOpen = false;
548+
544549
viewModel.OnProfileManagerDialogClose();
545550

546551
ProfileManager.AddProfile(ParseProfileInfo(instance));
547-
}, async _ =>
552+
}, _ =>
548553
{
549-
await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog);
554+
childWindow.IsOpen = false;
555+
Settings.ConfigurationManager.Current.IsChildWindowOpen = false;
556+
550557
viewModel.OnProfileManagerDialogClose();
551558
}, ProfileManager.GetGroupNames(), profile.Group, ProfileEditMode.Copy, profile);
552559

553-
customDialog.Content = new ProfileDialog
554-
{
555-
DataContext = profileViewModel
556-
};
557-
560+
childWindow.Title = Strings.CopyProfile;
561+
562+
childWindow.DataContext = childWindowViewModel;
563+
558564
viewModel.OnProfileManagerDialogOpen();
565+
566+
Settings.ConfigurationManager.Current.IsChildWindowOpen = true;
559567

560-
return dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog);
568+
return parentWindow.ShowChildWindowAsync(childWindow);
561569
}
562570

563-
public static Task ShowDeleteProfileDialog(IProfileManagerMinimal viewModel,
564-
IDialogCoordinator dialogCoordinator, IList<ProfileInfo> profiles)
571+
public static Task ShowDeleteProfileDialog(Window parentWindow, IProfileManagerMinimal viewModel,
572+
IList<ProfileInfo> profiles)
565573
{
566-
CustomDialog customDialog = new()
567-
{
568-
Title = profiles.Count == 1
569-
? Strings.DeleteProfile
570-
: Strings.DeleteProfiles
571-
};
572-
573-
ConfirmDeleteViewModel confirmDeleteViewModel = new(async _ =>
574+
var childWindow = new OKCancelInfoMessageChildWindow();
575+
576+
OKCancelInfoMessageViewModel childWindowViewModel = new(_ =>
574577
{
575-
await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog);
578+
childWindow.IsOpen = false;
579+
Settings.ConfigurationManager.Current.IsChildWindowOpen = false;
580+
576581
viewModel.OnProfileManagerDialogClose();
577582

578583
ProfileManager.RemoveProfiles(profiles);
579-
}, async _ =>
584+
}, _ =>
580585
{
581-
await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog);
586+
childWindow.IsOpen = false;
587+
Settings.ConfigurationManager.Current.IsChildWindowOpen = false;
588+
582589
viewModel.OnProfileManagerDialogClose();
583590
},
584591
profiles.Count == 1
585592
? Strings.DeleteProfileMessage
586593
: Strings.DeleteProfilesMessage);
587594

588-
customDialog.Content = new ConfirmDeleteDialog
589-
{
590-
DataContext = confirmDeleteViewModel
591-
};
595+
childWindow.Title = Strings.DeleteProfile;
596+
597+
childWindow.DataContext = childWindowViewModel;
592598

593599
viewModel.OnProfileManagerDialogOpen();
600+
601+
Settings.ConfigurationManager.Current.IsChildWindowOpen = true;
594602

595-
return dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog);
603+
return parentWindow.ShowChildWindowAsync(childWindow);
596604
}
597605

598606
#endregion
@@ -660,34 +668,36 @@ public static Task ShowEditGroupDialog(IProfileManagerMinimal viewModel, IDialog
660668
return dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog);
661669
}
662670

663-
public static Task ShowDeleteGroupDialog(IProfileManagerMinimal viewModel,
664-
IDialogCoordinator dialogCoordinator, GroupInfo group)
671+
public static Task ShowDeleteGroupDialog(Window parentWindow, IProfileManagerMinimal viewModel,
672+
GroupInfo group)
665673
{
666-
CustomDialog customDialog = new()
674+
var childWindow = new OKCancelInfoMessageChildWindow();
675+
676+
OKCancelInfoMessageViewModel childWindowViewModel = new(_ =>
667677
{
668-
Title = Strings.DeleteGroup
669-
};
670-
671-
ConfirmDeleteViewModel confirmDeleteViewModel = new(async _ =>
672-
{
673-
await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog);
678+
childWindow.IsOpen = false;
679+
Settings.ConfigurationManager.Current.IsChildWindowOpen = false;
680+
674681
viewModel.OnProfileManagerDialogClose();
675682

676683
ProfileManager.RemoveGroup(group);
677-
}, async _ =>
684+
}, _ =>
678685
{
679-
await dialogCoordinator.HideMetroDialogAsync(viewModel, customDialog);
686+
childWindow.IsOpen = false;
687+
Settings.ConfigurationManager.Current.IsChildWindowOpen = false;
688+
680689
viewModel.OnProfileManagerDialogClose();
681690
}, Strings.DeleteGroupMessage);
682691

683-
customDialog.Content = new ConfirmDeleteDialog
684-
{
685-
DataContext = confirmDeleteViewModel
686-
};
692+
childWindow.Title = Strings.DeleteGroup;
693+
694+
childWindow.DataContext = childWindowViewModel;
687695

688696
viewModel.OnProfileManagerDialogOpen();
689697

690-
return dialogCoordinator.ShowMetroDialogAsync(viewModel, customDialog);
698+
Settings.ConfigurationManager.Current.IsChildWindowOpen = true;
699+
700+
return parentWindow.ShowChildWindowAsync(childWindow);
691701
}
692702

693703
#endregion

0 commit comments

Comments
 (0)