eric6/MicroPython/AddEditDevicesDialog.py

changeset 8080
218ca8019eb8
child 8110
c5af1d1d2a78
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/MicroPython/AddEditDevicesDialog.py	Sat Feb 06 19:17:25 2021 +0100
@@ -0,0 +1,126 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to add or edit data of unknown MicroPython
+devices.
+"""
+
+from PyQt5.QtCore import pyqtSlot, Qt, QUrl, QUrlQuery
+from PyQt5.QtGui import QDesktopServices
+from PyQt5.QtWidgets import QDialog, QDialogButtonBox
+
+from .Ui_AddEditDevicesDialog import Ui_AddEditDevicesDialog
+
+from .MicroPythonDevices import getSupportedDevices
+
+from UI.Info import BugAddress
+
+
+class AddEditDevicesDialog(QDialog, Ui_AddEditDevicesDialog):
+    """
+    Class implementing a dialog to add or edit data of unknown MicroPython
+    devices.
+    """
+    def __init__(self, vid=0, pid=0, description=0, deviceData=None,
+                 parent=None):
+        """
+        Constructor
+        
+        Note: Either vid and pid and description or deviceData dictionary
+        must be given.
+        
+        @param vid vendor ID of the device (defaults to 0)
+        @type int (optional)
+        @param pid product ID of the device (defaults to 0)
+        @type int (optional)
+        @param description description for the device (defaults to "")
+        @type str (optional)
+        @param deviceData type of the device (defaults to None)
+        @type dict (optional)
+        @param parent reference to the parent widget (defaults to None)
+        @type QWidget (optional)
+        """
+        super(AddEditDevicesDialog, self).__init__(parent)
+        self.setupUi(self)
+        
+        # populate the device type combo box
+        self.deviceTypeComboBox.addItem("", "")
+        for board, desc in sorted(getSupportedDevices(), key=lambda x: x[1]):
+            self.deviceTypeComboBox.addItem(desc, board)
+        
+        if deviceData is not None:
+            self.vidEdit.setText("0x{0:04x}".format(deviceData["vid"]))
+            self.pidEdit.setText("0x{0:04x}".format(deviceData["pid"]))
+            self.descriptionEdit.setText(deviceData["description"])
+            self.deviceTypeComboBox.setCurrentIndex(
+                self.deviceTypeComboBox.findData(deviceData["type"]))
+            self.dataVolumeEdit.setText(deviceData["data_volume"])
+            self.flashVolumeEdit.setText(deviceData["flash_volume"])
+        else:
+            self.vidEdit.setText("0x{0:04x}".format(vid))
+            self.pidEdit.setText("0x{0:04x}".format(pid))
+            self.descriptionEdit.setText(description)
+            self.deviceTypeComboBox.setCurrentText("")
+            self.dataVolumeEdit.setText("")
+            self.flashVolumeEdit.setText("")
+        
+        self.deviceTypeComboBox.setFocus(Qt.OtherFocusReason)
+        
+        msh = self.minimumSizeHint()
+        self.resize(max(self.width(), msh.width()), msh.height())
+    
+    @pyqtSlot(int)
+    def on_deviceTypeComboBox_currentIndexChanged(self, index):
+        """
+        Private slot to handle the selection of a device type.
+        
+        @param index index of the current item
+        @type int
+        """
+        board = self.deviceTypeComboBox.currentData()
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(bool(board))
+        self.reportButton.setEnabled(bool(board))
+    
+    @pyqtSlot()
+    def on_reportButton_clicked(self):
+        """
+        Private slot to report the entered data to the eric-bugs email address.
+        """
+        body = "\r\n".join([
+            "This is an unknow MicroPython device. Please add it.",
+            "",
+            "VID: {0}".format(self.vidEdit.text()),
+            "PID: {0}".format(self.pidEdit.text()),
+            "Description: {0}".format(self.descriptionEdit.text()),
+            "Device Type: {0}".format(self.deviceTypeComboBox.currentData()),
+            "Data Volume: {0}".format(self.dataVolumeEdit.text().strip()),
+            "Flash Volume: {0}".format(self.flashVolumeEdit.text().strip()),
+        ])
+        
+        urlQuery = QUrlQuery()
+        urlQuery.addQueryItem("subject", "Unsupported MicroPython Device")
+        urlQuery.addQueryItem("body", body)
+        
+        url = QUrl("mailto:{0}".format(BugAddress))
+        url.setQuery(urlQuery)
+        
+        QDesktopServices.openUrl(url)
+    
+    def getDeviceDict(self):
+        """
+        Public method to get the entered data as a dictionary.
+        
+        @return dictionary containing the entered data
+        @rtype dict
+        """
+        return {
+            "vid": int(self.vidEdit.text(), 16),
+            "pid": int(self.pidEdit.text(), 16),
+            "description": self.descriptionEdit.text(),
+            "type": self.deviceTypeComboBox.currentData(),
+            "data_volume": self.dataVolumeEdit.text().strip(),
+            "flash_volume": self.flashVolumeEdit.text().strip(),
+        }

eric ide

mercurial