Skip to content

Commit 1a2489e

Browse files
authored
Hide apps from MainWindow (#139)
* Rewrite ApplicationInfo/Settings * Hide/Show applications * Translation added
1 parent 4dd4a5c commit 1a2489e

20 files changed

+537
-166
lines changed
Lines changed: 4 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,19 @@
1-
using MahApps.Metro.IconPacks;
2-
using System.Windows.Controls;
3-
4-
namespace NETworkManager
1+
namespace NETworkManager
52
{
63
public class ApplicationViewInfo
74
{
85
public ApplicationViewManager.Name Name { get; set; }
9-
public string TranslatedName { get; set; }
10-
public Canvas Icon { get; set; }
6+
public bool IsVisible { get; set; }
117

128
public ApplicationViewInfo()
139
{
1410

1511
}
1612

17-
public ApplicationViewInfo(ApplicationViewManager.Name name, Canvas icon)
18-
{
19-
Name = name;
20-
TranslatedName = ApplicationViewManager.GetTranslatedNameByName(name);
21-
Icon = icon;
22-
}
23-
24-
public ApplicationViewInfo(ApplicationViewManager.Name name, PackIconModern packIconModern)
25-
{
26-
Name = name;
27-
TranslatedName = ApplicationViewManager.GetTranslatedNameByName(name);
28-
var canvas = new Canvas();
29-
canvas.Children.Add(packIconModern);
30-
Icon = canvas;
31-
}
32-
33-
public ApplicationViewInfo(ApplicationViewManager.Name name, PackIconMaterial packIconMaterial)
34-
{
35-
Name = name;
36-
TranslatedName = ApplicationViewManager.GetTranslatedNameByName(name);
37-
var canvas = new Canvas();
38-
canvas.Children.Add(packIconMaterial);
39-
Icon = canvas;
40-
}
41-
42-
public ApplicationViewInfo(ApplicationViewManager.Name name, PackIconMaterialLight packIconMaterialLight)
43-
{
44-
Name = name;
45-
TranslatedName = ApplicationViewManager.GetTranslatedNameByName(name);
46-
var canvas = new Canvas();
47-
canvas.Children.Add(packIconMaterialLight);
48-
Icon = canvas;
49-
}
50-
51-
public ApplicationViewInfo(ApplicationViewManager.Name name, PackIconFontAwesome packIconFontAwesome)
52-
{
53-
Name = name;
54-
TranslatedName = ApplicationViewManager.GetTranslatedNameByName(name);
55-
var canvas = new Canvas();
56-
canvas.Children.Add(packIconFontAwesome);
57-
Icon = canvas;
58-
}
59-
60-
public ApplicationViewInfo(ApplicationViewManager.Name name, PackIconOcticons packIconOcticons)
13+
public ApplicationViewInfo(ApplicationViewManager.Name name)
6114
{
6215
Name = name;
63-
TranslatedName = ApplicationViewManager.GetTranslatedNameByName(name);
64-
var canvas = new Canvas();
65-
canvas.Children.Add(packIconOcticons);
66-
Icon = canvas;
16+
IsVisible = true;
6717
}
6818
}
6919
}

Source/NETworkManager/ApplicationViewManager.cs

Lines changed: 77 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,25 @@
1-
using MahApps.Metro.IconPacks;
1+
using System;
22
using System.Collections.Generic;
3+
using System.Windows.Controls;
4+
using MahApps.Metro.IconPacks;
35

46
namespace NETworkManager
57
{
68
public static class ApplicationViewManager
79
{
810
// List of all applications
9-
public static List<ApplicationViewInfo> List => new List<ApplicationViewInfo>
11+
public static List<ApplicationViewInfo> GetList()
1012
{
11-
new ApplicationViewInfo(Name.NetworkInterface, new PackIconModern { Kind = PackIconModernKind.Network }),
12-
new ApplicationViewInfo(Name.IPScanner, new PackIconMaterial { Kind = PackIconMaterialKind.Sitemap }),
13-
new ApplicationViewInfo(Name.PortScanner, new PackIconModern { Kind = PackIconModernKind.NetworkPort}),
14-
new ApplicationViewInfo(Name.Ping, new PackIconMaterial { Kind = PackIconMaterialKind.LanConnect }),
15-
new ApplicationViewInfo(Name.Traceroute, new PackIconModern { Kind = PackIconModernKind.TransitConnection }),
16-
new ApplicationViewInfo(Name.DNSLookup, new PackIconMaterial { Kind= PackIconMaterialKind.SearchWeb }),
17-
new ApplicationViewInfo(Name.RemoteDesktop, new PackIconMaterial{ Kind = PackIconMaterialKind.RemoteDesktop }),
18-
new ApplicationViewInfo(Name.PuTTY, new PackIconOcticons {Kind = PackIconOcticonsKind.Terminal }),
19-
new ApplicationViewInfo(Name.SNMP, new PackIconMaterial {Kind = PackIconMaterialKind.Switch }),
20-
new ApplicationViewInfo(Name.WakeOnLAN, new PackIconMaterial { Kind = PackIconMaterialKind.Power }),
21-
new ApplicationViewInfo(Name.HTTPHeaders, new PackIconMaterial { Kind = PackIconMaterialKind.Web }),
22-
new ApplicationViewInfo(Name.SubnetCalculator, new PackIconModern { Kind = PackIconModernKind.Calculator }),
23-
new ApplicationViewInfo(Name.Lookup, new PackIconMaterial { Kind = PackIconMaterialKind.Magnify }),
24-
new ApplicationViewInfo(Name.Connections, new PackIconModern {Kind = PackIconModernKind.Connect }),
25-
new ApplicationViewInfo(Name.Listeners, new PackIconMaterial {Kind = PackIconMaterialKind.Wan}),
26-
new ApplicationViewInfo(Name.ARPTable, new PackIconMaterial { Kind = PackIconMaterialKind.TableOfContents })
27-
};
13+
var list = new List<ApplicationViewInfo>();
14+
15+
foreach (Name name in Enum.GetValues(typeof(Name)))
16+
{
17+
if (name != Name.None)
18+
list.Add(new ApplicationViewInfo(name));
19+
}
20+
21+
return list;
22+
}
2823

2924
public static string GetTranslatedNameByName(Name name)
3025
{
@@ -63,8 +58,70 @@ public static string GetTranslatedNameByName(Name name)
6358
case Name.ARPTable:
6459
return Resources.Localization.Strings.ARPTable;
6560
default:
66-
return "";
61+
return "Name not found!";
62+
}
63+
}
64+
65+
public static Canvas GetIconByName(Name name)
66+
{
67+
var canvas = new Canvas();
68+
69+
switch (name)
70+
{
71+
case Name.NetworkInterface:
72+
canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Network });
73+
break;
74+
case Name.IPScanner:
75+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Sitemap });
76+
break;
77+
case Name.PortScanner:
78+
canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.NetworkPort });
79+
break;
80+
case Name.Ping:
81+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.LanConnect });
82+
break;
83+
case Name.Traceroute:
84+
canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.TransitConnection });
85+
break;
86+
case Name.DNSLookup:
87+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.SearchWeb });
88+
break;
89+
case Name.RemoteDesktop:
90+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.RemoteDesktop });
91+
break;
92+
case Name.PuTTY:
93+
canvas.Children.Add(new PackIconOcticons { Kind = PackIconOcticonsKind.Terminal });
94+
break;
95+
case Name.SNMP:
96+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Switch });
97+
break;
98+
case Name.WakeOnLAN:
99+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Power });
100+
break;
101+
case Name.HTTPHeaders:
102+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Web });
103+
break;
104+
case Name.SubnetCalculator:
105+
canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Calculator });
106+
break;
107+
case Name.Lookup:
108+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Magnify });
109+
break;
110+
case Name.Connections:
111+
canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.Connect });
112+
break;
113+
case Name.Listeners:
114+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.Wan });
115+
break;
116+
case Name.ARPTable:
117+
canvas.Children.Add(new PackIconMaterial { Kind = PackIconMaterialKind.TableOfContents });
118+
break;
119+
default:
120+
canvas.Children.Add(new PackIconModern { Kind = PackIconModernKind.SmileyFrown });
121+
break;
67122
}
123+
124+
return canvas;
68125
}
69126

70127
public enum Name
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Windows.Data;
4+
5+
namespace NETworkManager.Converters
6+
{
7+
public sealed class ApplicationNameToIconConverter : IValueConverter
8+
{
9+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
10+
{
11+
if (!(value is ApplicationViewManager.Name name))
12+
return null;
13+
14+
return ApplicationViewManager.GetIconByName(name);
15+
}
16+
17+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
18+
{
19+
throw new NotImplementedException();
20+
}
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Windows.Data;
4+
5+
namespace NETworkManager.Converters
6+
{
7+
public sealed class ApplicationNameToTranslatedStringConverter : IValueConverter
8+
{
9+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
10+
{
11+
if (!(value is ApplicationViewManager.Name name))
12+
return "-/-";
13+
14+
return ApplicationViewManager.GetTranslatedNameByName(name);
15+
}
16+
17+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
18+
{
19+
throw new NotImplementedException();
20+
}
21+
}
22+
}

Source/NETworkManager/MainWindow.xaml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
d:DataContext="{d:DesignInstance networkManager:MainWindow}">
1717
<mahAppsControls:MetroWindow.Resources>
1818
<converters:BooleanToVisibilityCollapsedConverter x:Key="BooleanToVisibilityCollapsedConverter" />
19+
<converters:ApplicationNameToTranslatedStringConverter x:Key="ApplicationNameToTranslatedStringConverter" />
20+
<converters:ApplicationNameToIconConverter x:Key="ApplicationNameToIconConverter" />
1921
<!-- ReSharper disable once Xaml.RedundantResource, because MainWindow uses FindResource("ContextMenuNotifyIcon") -->
2022
<ContextMenu x:Key="ContextMenuNotifyIcon" MinWidth="200" Opened="ContextMenu_Opened" x:Shared="False">
2123
<MenuItem Header="{x:Static localization:Strings.Show}" Command="{Binding ShowWindowCommand}">
@@ -334,7 +336,7 @@
334336
</Grid.ColumnDefinitions>
335337
<Grid.Style>
336338
<Style TargetType="{x:Type Grid}">
337-
<Setter Property="ToolTip" Value="{Binding TranslatedName}" />
339+
<Setter Property="ToolTip" Value="{Binding Name, Converter={StaticResource ApplicationNameToTranslatedStringConverter}}" />
338340
<Style.Triggers>
339341
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.ExpandApplicationView}" Value="True">
340342
<Setter Property="ToolTip" Value="{x:Null}" />
@@ -362,7 +364,7 @@
362364
</Grid.Style>
363365
<Rectangle Grid.Column="0" Width="24" Height="24">
364366
<Rectangle.OpacityMask>
365-
<VisualBrush Stretch="Uniform" Visual="{Binding Icon}" />
367+
<VisualBrush Stretch="Uniform" Visual="{Binding Name, Converter={StaticResource ApplicationNameToIconConverter}}" />
366368
</Rectangle.OpacityMask>
367369
<Rectangle.Style>
368370
<Style TargetType="{x:Type Rectangle}">
@@ -378,7 +380,7 @@
378380
</Style>
379381
</Rectangle.Style>
380382
</Rectangle>
381-
<TextBlock Grid.Column="1" Text="{Binding TranslatedName}">
383+
<TextBlock Grid.Column="1" Text="{Binding Name, Converter={StaticResource ApplicationNameToTranslatedStringConverter}}">
382384
<TextBlock.Style>
383385
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource HeaderTextBlock}">
384386
<Setter Property="Foreground" Value="{DynamicResource GrayBrush3}" />
@@ -590,7 +592,7 @@
590592
</Style.Triggers>
591593
</Style>
592594
</Border.Style>
593-
<TextBlock VerticalAlignment="Center" Height="48" TextAlignment="Center" FontSize="22" Style="{StaticResource HeaderTextBlock}" Text="{Binding SelectedApplication.TranslatedName}" Foreground="{DynamicResource GrayBrush3}" Margin="0" />
595+
<TextBlock VerticalAlignment="Center" Height="48" TextAlignment="Center" FontSize="22" Style="{StaticResource HeaderTextBlock}" Text="{Binding SelectedApplication.Name, Converter={StaticResource ApplicationNameToTranslatedStringConverter}}" Foreground="{DynamicResource GrayBrush3}" Margin="0" />
594596
</Border>
595597
<ContentControl x:Name="ContentControlApplication" Grid.Row="1" Focusable="False">
596598
<ContentControl.Style>

Source/NETworkManager/MainWindow.xaml.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
using System.Runtime.InteropServices;
1515
using System.Windows.Interop;
1616
using System.Collections.Generic;
17-
using System.Globalization;
17+
using System.Collections.ObjectModel;
1818
using NETworkManager.Utilities;
1919
using System.Runtime.CompilerServices;
2020
using System.Windows.Markup;
@@ -297,7 +297,7 @@ protected override async void OnContentRendered(EventArgs e)
297297

298298
ConfigurationManager.Current.IsDialogOpen = true;
299299

300-
await this.ShowMessageAsync(NETworkManager.Resources.Localization.Strings.SettingsHaveBeenReset, NETworkManager.Resources.Localization.Strings.SettingsFileFoundWasCorruptOrNotCompatibleMessage , MessageDialogStyle.Affirmative, settings);
300+
await this.ShowMessageAsync(NETworkManager.Resources.Localization.Strings.SettingsHaveBeenReset, NETworkManager.Resources.Localization.Strings.SettingsFileFoundWasCorruptOrNotCompatibleMessage, MessageDialogStyle.Affirmative, settings);
301301

302302
ConfigurationManager.Current.IsDialogOpen = false;
303303
}
@@ -313,22 +313,31 @@ protected override async void OnContentRendered(EventArgs e)
313313

314314
private void LoadApplicationList()
315315
{
316-
Applications = CollectionViewSource.GetDefaultView(ApplicationViewManager.List);
316+
// Need to add items here... if in SettingsInfo/Constructor --> same item will appear multiple times...
317+
if (SettingsManager.Current.General_ApplicationList.Count == 0)
318+
SettingsManager.Current.General_ApplicationList = new ObservableCollection<ApplicationViewInfo>(ApplicationViewManager.GetList());
319+
320+
Applications = new CollectionViewSource { Source = SettingsManager.Current.General_ApplicationList }.View;
317321

318322
Applications.SortDescriptions.Add(new SortDescription(nameof(ApplicationViewInfo.Name), ListSortDirection.Ascending)); // Always have the same order, even if it is translated...
319323
Applications.Filter = o =>
320324
{
325+
if (!(o is ApplicationViewInfo info))
326+
return false;
327+
321328
if (string.IsNullOrEmpty(Search))
322-
return true;
329+
return info.IsVisible;
323330

324331
var regex = new Regex(@" |-");
325332

326333
var search = regex.Replace(Search, "");
327334

328335
// Search by TranslatedName and Name
329-
return o is ApplicationViewInfo info && (regex.Replace(info.TranslatedName, "").IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || regex.Replace(info.Name.ToString(), "").IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0);
336+
return info.IsVisible && (regex.Replace(ApplicationViewManager.GetTranslatedNameByName(info.Name), "").IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 || regex.Replace(info.Name.ToString(), "").IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0);
330337
};
331338

339+
SettingsManager.Current.General_ApplicationList.CollectionChanged += (sender, args) => Applications.Refresh();
340+
332341
// Get application from settings
333342
SelectedApplication = Applications.SourceCollection.Cast<ApplicationViewInfo>().FirstOrDefault(x => x.Name == SettingsManager.Current.General_DefaultApplicationViewName);
334343

Source/NETworkManager/Models/Settings/SettingsInfo.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,23 @@ public int General_HistoryListEntries
5858
}
5959
}
6060

61+
private ObservableCollection<ApplicationViewInfo> _general_ApplicationList = new ObservableCollection<ApplicationViewInfo>();
62+
public ObservableCollection<ApplicationViewInfo> General_ApplicationList
63+
{
64+
get => _general_ApplicationList;
65+
set
66+
{
67+
if(value == _general_ApplicationList)
68+
return;
69+
70+
_general_ApplicationList = value;
71+
72+
OnPropertyChanged();
73+
74+
SettingsChanged = true;
75+
}
76+
}
77+
6178
// Window
6279
private bool _window_ConfirmClose;
6380
public bool Window_ConfirmClose
@@ -2408,6 +2425,9 @@ public AutoRefreshTimeInfo ARPTable_AutoRefreshTime
24082425
#region Constructor
24092426
public SettingsInfo()
24102427
{
2428+
// General
2429+
General_ApplicationList.CollectionChanged += CollectionChanged;
2430+
24112431
// IP Scanner
24122432
IPScanner_IPRangeHistory.CollectionChanged += CollectionChanged;
24132433

Source/NETworkManager/Models/Settings/SettingsManager.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public static void Load()
101101

102102
using (var fileStream = new FileStream(GetSettingsFilePath(), FileMode.Open))
103103
{
104-
settingsInfo = (SettingsInfo)(xmlSerializer.Deserialize(fileStream));
104+
settingsInfo = (SettingsInfo)xmlSerializer.Deserialize(fileStream);
105105
}
106106

107107
Current = settingsInfo;
@@ -143,7 +143,7 @@ private static void MoveSettings(string sourceLocation, string targedLocation, b
143143
// Create the dircetory and copy the files to the new location
144144
Directory.CreateDirectory(targedLocation);
145145

146-
foreach (string file in sourceFiles)
146+
foreach (var file in sourceFiles)
147147
{
148148
// Skip if file exists and user don't want to overwrite it
149149
if (!overwrite && (filesTargedLocation ?? throw new ArgumentNullException(nameof(filesTargedLocation))).Any(x => Path.GetFileName(x) == Path.GetFileName(file)))
@@ -153,7 +153,7 @@ private static void MoveSettings(string sourceLocation, string targedLocation, b
153153
}
154154

155155
// Delete the old files
156-
foreach (string file in sourceFiles)
156+
foreach (var file in sourceFiles)
157157
File.Delete(file);
158158

159159
// Delete the folder, if it is not the default settings locations and does not contain any files or directories

0 commit comments

Comments
 (0)