--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/eric7/MicroPython/WifiDialogs/WifiNetworksWindow.py Mon Feb 20 11:42:45 2023 +0100 @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog showing the available WiFi networks. +""" + +from PyQt6.QtCore import Qt, QTimer, pyqtSlot +from PyQt6.QtWidgets import QHeaderView, QTreeWidgetItem, QWidget + +from eric7.EricGui.EricOverrideCursor import EricOverrideCursor +from eric7.EricWidgets import EricMessageBox + +from .Ui_WifiNetworksWindow import Ui_WifiNetworksWindow + + +class WifiNetworksWindow(QWidget, Ui_WifiNetworksWindow): + """ + Class implementing a dialog showing the available WiFi networks. + """ + + def __init__(self, device, parent=None): + """ + Constructor + + @param device reference to the connected device + @type BaseDevice + @param parent reference to the parent widget (defaults to None) + @type QWidget (optional) + """ + super().__init__(parent) + self.setupUi(self) + + windowFlags = self.windowFlags() + windowFlags |= Qt.WindowType.Window + windowFlags |= Qt.WindowType.WindowContextHelpButtonHint + self.setWindowFlags(windowFlags) + + self.__device = device + + self.__scanTimer = QTimer(self) + self.__scanTimer.timeout.connect(self.scanNetworks) + + self.scanButton.clicked.connect(self.scanNetworks) + + self.networkList.sortByColumn(0, Qt.SortOrder.AscendingOrder) + + def scanNetworks(self): + """ + Private method to ask the device for a network scan and display the result. + """ + self.networkList.clear() + self.statusLabel.clear() + + if not self.periodicCheckBox.isChecked(): + self.scanButton.setEnabled(False) + with EricOverrideCursor(): + networks, error = self.__device.scanNetworks() + if not self.periodicCheckBox.isChecked(): + self.scanButton.setEnabled(True) + + if error: + EricMessageBox.warning( + self, + self.tr("Scan WiFi Networks"), + self.tr( + """<p>The scan for available WiFi networks failed.</p>""" + """<p>Reason: {0}</p>"""), + ) + if self.periodicCheckBox.isChecked(): + self.periodicCheckBox.setChecked(False) + + else: + self.statusLabel.setText( + self.tr("<p>Detected <b>%n</b> network(s).</p>", "", len(networks)) + ) + for network in networks: + itm = QTreeWidgetItem( + self.networkList, + [ + network[0], + str(network[2]), + network[1], + str(network[3]), + network[4] + ], + ) + itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter) + itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter) + itm.setTextAlignment(3, Qt.AlignmentFlag.AlignHCenter) + + self.__resizeColumns() + self.__resort() + + def __resort(self): + """ + Private method to resort the networks list. + """ + self.networkList.sortItems( + self.networkList.sortColumn(), + self.networkList.header().sortIndicatorOrder(), + ) + + def __resizeColumns(self): + """ + Private method to resize the columns of the result list. + """ + self.networkList.header().resizeSections( + QHeaderView.ResizeMode.ResizeToContents + ) + self.networkList.header().setStretchLastSection(True) + + def closeEvent(self, evt): + """ + Public method to handle a window close event. + + @param evt reference to the close event + @type QCloseEvent + """ + self.__scanTimer.stop() + + @pyqtSlot(bool) + def on_periodicCheckBox_toggled(self, checked): + """ + Private slot handling the selection of a periodic scan. + + @param checked flag indicating a periodic scan + @type bool + """ + self.scanButton.setEnabled(not checked) + if checked: + self.__scanTimer.setInterval(self.intervalSpinBox.value() * 1000) + self.__scanTimer.start() + else: + self.__scanTimer.stop() + + @pyqtSlot(int) + def on_intervalSpinBox_valueChanged(self, interval): + """ + Private slot handling a change of the periodic scan interval. + + @param interval periodic scan interval + @type int + """ + if self.periodicCheckBox.isChecked(): + self.__scanTimer.setInterval(interval* 1000)