--- a/src/eric7/MicroPython/WifiDialogs/WifiStatusDialog.py Mon May 05 10:17:49 2025 +0200 +++ b/src/eric7/MicroPython/WifiDialogs/WifiStatusDialog.py Mon May 05 17:40:08 2025 +0200 @@ -13,6 +13,7 @@ from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem from eric7.EricGui import EricPixmapCache +from eric7.SystemUtilities.NetworkUtilities import ipv6AddressScope from .Ui_WifiStatusDialog import Ui_WifiStatusDialog @@ -75,6 +76,11 @@ QTreeWidgetItem( self.statusTree, [self.tr("Country"), overallStatus["country"]] ) + with contextlib.suppress(KeyError): + QTreeWidgetItem( + self.statusTree, + [self.tr("Preferred IP Version"), str(overallStatus["prefer"])], + ) # populate status of client interface if clientStatus: @@ -96,17 +102,8 @@ ) with contextlib.suppress(KeyError): QTreeWidgetItem(header, [self.tr("Status"), clientStatus["status"]]) - QTreeWidgetItem( - header, [self.tr("IPv4 Address"), clientStatus["ifconfig"][0]] - ) - QTreeWidgetItem( - header, [self.tr("Netmask"), clientStatus["ifconfig"][1]] - ) - QTreeWidgetItem( - header, [self.tr("Gateway"), clientStatus["ifconfig"][2]] - ) - QTreeWidgetItem(header, [self.tr("DNS"), clientStatus["ifconfig"][3]]) - QTreeWidgetItem(header, [self.tr("MAC-Address"), clientStatus["mac"]]) + with contextlib.suppress(KeyError): + QTreeWidgetItem(header, [self.tr("SSID"), clientStatus["essid"]]) with contextlib.suppress(KeyError): QTreeWidgetItem( header, [self.tr("Channel"), str(clientStatus["channel"])] @@ -123,7 +120,35 @@ self.tr("{0} dBm").format(clientStatus["txpower"]), ], ) + QTreeWidgetItem(header, [self.tr("MAC-Address"), clientStatus["mac"]]) + # IPv4 specific data + ip4Header = self.__createSubheader(header, self.tr("IPv4")) + QTreeWidgetItem( + ip4Header, [self.tr("Address"), clientStatus["ifconfig"][0]] + ) + QTreeWidgetItem( + ip4Header, [self.tr("Netmask"), clientStatus["ifconfig"][1]] + ) + QTreeWidgetItem( + ip4Header, [self.tr("Gateway"), clientStatus["ifconfig"][2]] + ) + QTreeWidgetItem( + ip4Header, [self.tr("DNS"), clientStatus["ifconfig"][3]] + ) + + # IPv6 specific data + if clientStatus["ipv6_addr"]: + ip6Header = self.__createSubheader(header, self.tr("IPv6")) + ip6AddrHeader = self.__createSubheader( + ip6Header, self.tr("Addresses"), underlined=False + ) + for addr in sorted(clientStatus["ipv6_addr"]): + QTreeWidgetItem( + ip6AddrHeader, [addr.lower(), ipv6AddressScope(addr)] + ) + + # data about the connected access point if "ap_ssid" in clientStatus: apHeader = self.__createSubheader( header, self.tr("Connected Access Point") @@ -171,23 +196,11 @@ with contextlib.suppress(KeyError): QTreeWidgetItem(header, [self.tr("Status"), apStatus["status"]]) with contextlib.suppress(KeyError): - QTreeWidgetItem( - header, [self.tr("IPv4 Address"), apStatus["ifconfig"][0]] - ) - QTreeWidgetItem( - header, [self.tr("Netmask"), apStatus["ifconfig"][1]] - ) - QTreeWidgetItem( - header, [self.tr("Gateway"), apStatus["ifconfig"][2]] - ) - QTreeWidgetItem(header, [self.tr("DNS"), apStatus["ifconfig"][3]]) - with contextlib.suppress(KeyError): QTreeWidgetItem(header, [self.tr("SSID"), apStatus["essid"]]) with contextlib.suppress(KeyError): QTreeWidgetItem( header, [self.tr("Security"), apStatus["ap_security"]] ) - QTreeWidgetItem(header, [self.tr("MAC-Address"), apStatus["mac"]]) with contextlib.suppress(KeyError): QTreeWidgetItem( header, [self.tr("Channel"), str(apStatus["channel"])] @@ -202,6 +215,34 @@ self.tr("{0} dBm").format(apStatus["txpower"]), ], ) + QTreeWidgetItem(header, [self.tr("MAC-Address"), apStatus["mac"]]) + + # IPv4 specific data + ip4Header = self.__createSubheader(header, self.tr("IPv4")) + with contextlib.suppress(KeyError): + QTreeWidgetItem( + ip4Header, [self.tr("Address"), apStatus["ifconfig"][0]] + ) + QTreeWidgetItem( + ip4Header, [self.tr("Netmask"), apStatus["ifconfig"][1]] + ) + QTreeWidgetItem( + ip4Header, [self.tr("Gateway"), apStatus["ifconfig"][2]] + ) + QTreeWidgetItem( + ip4Header, [self.tr("DNS"), apStatus["ifconfig"][3]] + ) + + # IPv6 specific data + if clientStatus["ipv6_addr"]: + ip6Header = self.__createSubheader(header, self.tr("IPv6")) + ip6AddrHeader = self.__createSubheader( + ip6Header, self.tr("Addresses"), underlined=False + ) + for addr in sorted(apStatus["ipv6_addr"]): + QTreeWidgetItem( + ip6AddrHeader, [addr.lower(), ipv6AddressScope(addr)] + ) for col in range(self.statusTree.columnCount()): self.statusTree.resizeColumnToContents(col) @@ -224,12 +265,11 @@ font = headerItem.font(0) font.setBold(True) - headerItem.setFont(0, font) return headerItem - def __createSubheader(self, parent, text): + def __createSubheader(self, parent, text, underlined=True): """ Private method to create a subheader item. @@ -237,6 +277,8 @@ @type QTreeWidgetItem @param text text for the header item @type str + @param underlined flag indicating an underlined header (defaults to True) + @type bool (optional) @return reference to the created header item @rtype QTreeWidgetItem """ @@ -244,8 +286,9 @@ headerItem.setExpanded(True) headerItem.setFirstColumnSpanned(True) - font = headerItem.font(0) - font.setUnderline(True) - headerItem.setFont(0, font) + if underlined: + font = headerItem.font(0) + font.setUnderline(True) + headerItem.setFont(0, font) return headerItem