Sun, 09 Mar 2025 14:16:35 +0100
MicroPython Interface
- Changed the WiFi and Bluetooth status dialogs to non-modal windows with a 'Refresh' button.
# -*- coding: utf-8 -*- # Copyright (c) 2023 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> # """ Module implementing a dialog to show the WiFi status of the connected device. """ import contextlib from PyQt6.QtCore import Qt, pyqtSlot from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem from eric7.EricGui import EricPixmapCache from .Ui_WifiStatusDialog import Ui_WifiStatusDialog class WifiStatusDialog(QDialog, Ui_WifiStatusDialog): """ Class implementing a dialog to show the WiFi status of the connected device. """ def __init__(self, microPython, parent=None): """ Constructor @param microPython reference to the MicroPython widget @type MicroPythonWidget @param parent reference to the parent widget (defaults to None) @type QWidget (optional) """ super().__init__(parent) self.setupUi(self) self.setWindowFlags(Qt.WindowType.Window) self.statusTree.setColumnCount(2) self.refreshButton.setIcon(EricPixmapCache.getIcon("reload")) self.refreshButton.clicked.connect(self.__showStatus) self.__mpy = microPython self.__showStatus() @pyqtSlot() def __showStatus(self): """ Private slot to show the current WiFi status. """ # clear old data self.statusTree.clear() # get the status try: clientStatus, apStatus, overallStatus = self.__mpy.getDevice().getWifiData() except Exception as exc: self.__mpy.showError("getWifiData()", str(exc)) return # populate overall status QTreeWidgetItem( self.statusTree, [ self.tr("Active"), self.tr("Yes") if overallStatus["active"] else self.tr("No"), ], ) with contextlib.suppress(KeyError): QTreeWidgetItem( self.statusTree, [self.tr("Hostname"), overallStatus["hostname"]] ) with contextlib.suppress(KeyError): QTreeWidgetItem( self.statusTree, [self.tr("Country"), overallStatus["country"]] ) # populate status of client interface if clientStatus: header = self.__createHeader(self.tr("Client")) QTreeWidgetItem( header, [ self.tr("Active"), self.tr("Yes") if clientStatus["active"] else self.tr("No"), ], ) if clientStatus["active"]: QTreeWidgetItem( header, [ self.tr("Connected"), self.tr("Yes") if clientStatus["connected"] else self.tr("No"), ], ) 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("Channel"), str(clientStatus["channel"])] ) with contextlib.suppress(KeyError): QTreeWidgetItem( header, [self.tr("Country"), clientStatus["country"]] ) with contextlib.suppress(KeyError): QTreeWidgetItem( header, [ self.tr("Tx-Power"), self.tr("{0} dBm").format(clientStatus["txpower"]), ], ) if "ap_ssid" in clientStatus: apHeader = self.__createSubheader( header, self.tr("Connected Access Point") ) QTreeWidgetItem( apHeader, [self.tr("Name"), clientStatus["ap_ssid"]] ) with contextlib.suppress(KeyError): QTreeWidgetItem( apHeader, [self.tr("Channel"), str(clientStatus["ap_channel"])], ) QTreeWidgetItem( apHeader, [self.tr("MAC-Address"), clientStatus["ap_bssid"]] ) QTreeWidgetItem( apHeader, [self.tr("RSSI [dBm]"), str(clientStatus["ap_rssi"])] ) QTreeWidgetItem( apHeader, [self.tr("Security"), clientStatus["ap_security"]] ) with contextlib.suppress(KeyError): QTreeWidgetItem( apHeader, [self.tr("Country"), clientStatus["ap_country"]] ) # populate status of access point interface if apStatus: header = self.__createHeader(self.tr("Access Point")) QTreeWidgetItem( header, [ self.tr("Active"), self.tr("Yes") if apStatus["active"] else self.tr("No"), ], ) if apStatus["active"]: QTreeWidgetItem( header, [ self.tr("Connected"), self.tr("Yes") if apStatus["connected"] else self.tr("No"), ], ) 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"]]) QTreeWidgetItem(header, [self.tr("MAC-Address"), apStatus["mac"]]) with contextlib.suppress(KeyError): QTreeWidgetItem( header, [self.tr("Channel"), str(apStatus["channel"])] ) with contextlib.suppress(KeyError): QTreeWidgetItem(header, [self.tr("Country"), apStatus["country"]]) with contextlib.suppress(KeyError): QTreeWidgetItem( header, [ self.tr("Tx-Power"), self.tr("{0} dBm").format(apStatus["txpower"]), ], ) for col in range(self.statusTree.columnCount()): self.statusTree.resizeColumnToContents(col) self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True) self.buttonBox.setFocus(Qt.FocusReason.OtherFocusReason) def __createHeader(self, headerText): """ Private method to create a header item. @param headerText text for the header item @type str @return reference to the created header item @rtype QTreeWidgetItem """ headerItem = QTreeWidgetItem(self.statusTree, [headerText]) headerItem.setExpanded(True) headerItem.setFirstColumnSpanned(True) font = headerItem.font(0) font.setBold(True) headerItem.setFont(0, font) return headerItem def __createSubheader(self, parent, text): """ Private method to create a subheader item. @param parent reference to the parent item @type QTreeWidgetItem @param text text for the header item @type str @return reference to the created header item @rtype QTreeWidgetItem """ headerItem = QTreeWidgetItem(parent, [text]) headerItem.setExpanded(True) headerItem.setFirstColumnSpanned(True) font = headerItem.font(0) font.setUnderline(True) headerItem.setFont(0, font) return headerItem