From 6a93b2461299bfc1dd6553c2c8b4949f1bad1606 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Thu, 24 Jul 2025 00:49:32 +0200 Subject: [PATCH 1/2] Feature: Hide IPv4/6, DNS and DHCP info if adapter is down --- ...oleansAndToVisibilityCollapsedConverter.cs | 20 ++ ...oleansOrToVisibilityCollapsedConverter.cs} | 2 +- .../Network/NetworkInterface.cs | 4 + .../NETworkManager/Views/IPScannerView.xaml | 8 +- .../Views/NetworkInterfaceView.xaml | 319 +++++++++++++++--- 5 files changed, 293 insertions(+), 60 deletions(-) create mode 100644 Source/NETworkManager.Converters/BooleansAndToVisibilityCollapsedConverter.cs rename Source/NETworkManager.Converters/{BooleanToVisibilityCollapsedMultiConverter.cs => BooleansOrToVisibilityCollapsedConverter.cs} (85%) diff --git a/Source/NETworkManager.Converters/BooleansAndToVisibilityCollapsedConverter.cs b/Source/NETworkManager.Converters/BooleansAndToVisibilityCollapsedConverter.cs new file mode 100644 index 0000000000..27f1a39ca4 --- /dev/null +++ b/Source/NETworkManager.Converters/BooleansAndToVisibilityCollapsedConverter.cs @@ -0,0 +1,20 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Windows; +using System.Windows.Data; + +namespace NETworkManager.Converters; + +public sealed class BooleansAndToVisibilityCollapsedConverter : IMultiValueConverter +{ + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) + { + return values.OfType().All(b => b) ? Visibility.Visible : Visibility.Collapsed; + } + + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Source/NETworkManager.Converters/BooleanToVisibilityCollapsedMultiConverter.cs b/Source/NETworkManager.Converters/BooleansOrToVisibilityCollapsedConverter.cs similarity index 85% rename from Source/NETworkManager.Converters/BooleanToVisibilityCollapsedMultiConverter.cs rename to Source/NETworkManager.Converters/BooleansOrToVisibilityCollapsedConverter.cs index e7e6aa7c79..c9b4403798 100644 --- a/Source/NETworkManager.Converters/BooleanToVisibilityCollapsedMultiConverter.cs +++ b/Source/NETworkManager.Converters/BooleansOrToVisibilityCollapsedConverter.cs @@ -6,7 +6,7 @@ namespace NETworkManager.Converters; -public sealed class BooleanToVisibilityCollapsedMultiConverter : IMultiValueConverter +public sealed class BooleansOrToVisibilityCollapsedConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { diff --git a/Source/NETworkManager.Models/Network/NetworkInterface.cs b/Source/NETworkManager.Models/Network/NetworkInterface.cs index ebf51903e0..1cd51bc80c 100644 --- a/Source/NETworkManager.Models/Network/NetworkInterface.cs +++ b/Source/NETworkManager.Models/Network/NetworkInterface.cs @@ -54,6 +54,7 @@ public static List GetNetworkInterfaces() var ipProperties = networkInterface.GetIPProperties(); foreach (var unicastIPAddrInfo in ipProperties.UnicastAddresses) + { switch (unicastIPAddrInfo.Address.AddressFamily) { case AddressFamily.InterNetwork: @@ -74,11 +75,13 @@ public static List GetNetworkInterfaces() listIPv6Address.Add(unicastIPAddrInfo.Address); break; } + } var listIPv4Gateway = new List(); var listIPv6Gateway = new List(); foreach (var gatewayIPAddrInfo in ipProperties.GatewayAddresses) + { switch (gatewayIPAddrInfo.Address.AddressFamily) { case AddressFamily.InterNetwork: @@ -88,6 +91,7 @@ public static List GetNetworkInterfaces() listIPv6Gateway.Add(gatewayIPAddrInfo.Address); break; } + } // Check if autoconfiguration for DNS is enabled (only via registry key) var nameServerKey = diff --git a/Source/NETworkManager/Views/IPScannerView.xaml b/Source/NETworkManager/Views/IPScannerView.xaml index c7a9051a78..29e97fb8b9 100644 --- a/Source/NETworkManager/Views/IPScannerView.xaml +++ b/Source/NETworkManager/Views/IPScannerView.xaml @@ -24,7 +24,7 @@ - + @@ -518,7 +518,7 @@ SortMemberPath="Hostname" MinWidth="150"> - + - + - + + @@ -222,98 +223,302 @@ - - - + + + - - + + - + - + + Text="{x:Static localization:Strings.IPv4ProtocolAvailable}"> + + + + + + + Text="{Binding SelectedNetworkInterface.IPv4ProtocolAvailable, Converter={StaticResource BooleanToStringConverter}}"> + + + + + + + Text="{x:Static localization:Strings.IPv4Address}"> + + + + + + + + Text="{Binding SelectedNetworkInterface.IPv4Address, Converter={StaticResource IPAddressSubnetmaskTupleArrayToStringConverter}}"> + + + + + + + + Text="{x:Static localization:Strings.IPv4DefaultGateway}"> + + + + + + + + Text="{Binding SelectedNetworkInterface.IPv4Gateway, Converter={StaticResource IPAddressArrayToStringConverter}}"> + + + + + + + + Text="{x:Static localization:Strings.DHCPEnabled}"> + + + + + + + Text="{Binding SelectedNetworkInterface.DhcpEnabled, Converter={StaticResource BooleanToStringConverter}}"> + + + + + + + Text="{x:Static localization:Strings.DHCPServer}"> + + + + + + + + Text="{Binding SelectedNetworkInterface.DhcpServer, Converter={StaticResource IPAddressArrayToStringConverter}}"> + + + + + + + + Text="{x:Static localization:Strings.DHCPLeaseObtained}"> + + + + + + + + Text="{Binding SelectedNetworkInterface.DhcpLeaseObtained}"> + + + + + + + + Text="{x:Static localization:Strings.DHCPLeaseExpires}"> + + + + + + + + Text="{Binding SelectedNetworkInterface.DhcpLeaseExpires}"> + + + + + + + + Text="{x:Static localization:Strings.IPv6ProtocolAvailable}"> + + + + + + + Text="{Binding SelectedNetworkInterface.IPv6ProtocolAvailable, Converter={StaticResource BooleanToStringConverter}}"> + + + + + + + Text="{x:Static localization:Strings.IPv6AddressLinkLocal}"> + + + + + + + + Text="{Binding SelectedNetworkInterface.IPv6AddressLinkLocal, Converter={StaticResource IPAddressArrayToStringConverter}}"> + + + + + + + + Text="{x:Static localization:Strings.IPv6Address}"> + + + + + + + + Text="{Binding SelectedNetworkInterface.IPv6Address, Converter={StaticResource IPAddressArrayToStringConverter}}"> + + + + + + + + Text="{x:Static localization:Strings.IPv6DefaultGateway}"> + + + + + + + + Text="{Binding SelectedNetworkInterface.IPv6Gateway , Converter={StaticResource IPAddressArrayToStringConverter}}"> + + + + + + + + Text="{x:Static localization:Strings.DNSAutoconfiguration}"> + + + + + + + Text="{Binding SelectedNetworkInterface.DNSAutoconfigurationEnabled, Converter={StaticResource BooleanToStringConverter}}"> + + + + + + + Text="{x:Static localization:Strings.DNSSuffix}"> + + + + + + + Text="{Binding SelectedNetworkInterface.DNSSuffix}"> + + + + + + + Text="{x:Static localization:Strings.DNSServers}"> + + + + + + + Text="{Binding SelectedNetworkInterface.DNSServer, Converter={StaticResource IPAddressArrayToStringConverter}}"> + + + + + + - - - + + + - + From 392506c64bb3879f3805cba0e44d19845f19f1b7 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Thu, 24 Jul 2025 00:52:27 +0200 Subject: [PATCH 2/2] Docs: #3111 #3114 --- Website/docs/changelog/next-release.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Website/docs/changelog/next-release.md b/Website/docs/changelog/next-release.md index c05a6d58db..ce58f49c27 100644 --- a/Website/docs/changelog/next-release.md +++ b/Website/docs/changelog/next-release.md @@ -46,6 +46,10 @@ Release date: **xx.xx.2025** - Redesign export dialog. [#3090](https://github.com/BornToBeRoot/NETworkManager/pull/3090) - Add upgrade dialog when updating from a previous version. [#3077](https://github.com/BornToBeRoot/NETworkManager/pull/3077) +**Network Interface** + +- Hide (outdated) IPv4/IPv6, DHCP, and DNS informations if adapter is not connected (Status is `down`). [#3114](https://github.com/BornToBeRoot/NETworkManager/pull/3114) + **WiFi** - Redesign refresh button/view. [#3012](https://github.com/BornToBeRoot/NETworkManager/pull/3012)