--- /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(), + }