src/eric7/MicroPython/EthernetDialogs/EthernetStatusDialog.py

Tue, 06 May 2025 11:08:30 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 06 May 2025 11:08:30 +0200
branch
eric7
changeset 11268
3dba24293ccc
parent 11263
28f0ead11a82
permissions
-rw-r--r--

Changed the 'show()' logic of the Ethernet Status dialog.

# -*- coding: utf-8 -*-

# Copyright (c) 2023 - 2025 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing a dialog to show Ethernet related status information.
"""

from PyQt6.QtCore import Qt, pyqtSlot
from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem

from eric7.EricGui import EricPixmapCache
from eric7.EricGui.EricOverrideCursor import EricOverrideCursor
from eric7.SystemUtilities.NetworkUtilities import ipv6AddressScope

from .Ui_EthernetStatusDialog import Ui_EthernetStatusDialog


class EthernetStatusDialog(QDialog, Ui_EthernetStatusDialog):
    """
    Class implementing a dialog to show Ethernet related status information.
    """

    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

    @pyqtSlot()
    def show(self):
        """
        Public slot to show the dialog and populate the status.
        """
        super().show()

        self.__showStatus()

    @pyqtSlot()
    def __showStatus(self):
        """
        Private slot to show the current WiFi status.
        """
        # clear old data
        self.statusTree.clear()

        # get the status
        with EricOverrideCursor():
            try:
                status, addressInfo = self.__mpy.getDevice().getEthernetStatus()
            except Exception as exc:
                self.__mpy.showError("getEthernetStatus()", str(exc))
                return

        for topic, value in status:
            QTreeWidgetItem(self.statusTree, [topic, str(value)])

        if addressInfo["ipv4"]:
            header = self.__createHeader(self.statusTree, self.tr("IPv4"))
            QTreeWidgetItem(header, [self.tr("Address"), addressInfo["ipv4"][0]])
            QTreeWidgetItem(header, [self.tr("Netmask"), addressInfo["ipv4"][1]])
            QTreeWidgetItem(header, [self.tr("Gateway"), addressInfo["ipv4"][2]])
            QTreeWidgetItem(header, [self.tr("DNS"), addressInfo["ipv4"][3]])

        if addressInfo["ipv6"]:
            header = self.__createHeader(self.statusTree, self.tr("IPv6"))
            addrHeader = self.__createHeader(
                header, self.tr("Addresses"), underlined=False
            )
            for addr in sorted(addressInfo["ipv6"]):
                QTreeWidgetItem(addrHeader, [addr.lower(), ipv6AddressScope(addr)])

        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, parent, text, underlined=True):
        """
        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
        @param underlined flag indicating an underlined header (defaults to True)
        @type bool (optional)
        @return reference to the created header item
        @rtype QTreeWidgetItem
        """
        headerItem = QTreeWidgetItem(parent, [text])
        headerItem.setExpanded(True)
        headerItem.setFirstColumnSpanned(True)

        if underlined:
            font = headerItem.font(0)
            font.setUnderline(True)
            headerItem.setFont(0, font)

        return headerItem

eric ide

mercurial