from json import dumps import json from PySide6 import QtWidgets, QtGui, QtCore, QtSerialPort from SettingsDialog_ui import Ui_SettingsDialog class SettingsWindow(QtWidgets.QDialog): def __init__(self, settings: dict): super().__init__() self.ui = Ui_SettingsDialog() self.ui.setupUi(self) self.setWindowModality(QtCore.Qt.ApplicationModal) # self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.setupListOptions() self.setupConnectionOption() self.setupFontsOption() self.setupDisplayOption() if settings: self.connectionOption = settings["connection"] self.fontsOption = settings["fonts"] self.displayOption = settings["display"] else: self.saveConnectionSettings() self.saveFontSettings() self.saveDisplaySettings() self.applyConnectionSettings() self.applyFontSettings() self.applyDisplaySettings() def setupListOptions(self): self.ui.lstview_options.addItems(["Connection", "Fonts", "Display"]) self.ui.lstview_options.itemClicked.connect(self.on_listItemClicked) self.ui.lstview_options.setCurrentRow(0) self.ui.stackedWidget.setCurrentIndex(0) def setupConnectionOption(self): self.connectionOption = dict() self.on_refreshPortsClicked() font = self.ui.cb_port.font() font.setPointSize(8) self.ui.cb_port.setFont(font) self.ui.cb_baudrate.addItems([str(baudrate) for baudrate in QtSerialPort.QSerialPortInfo.standardBaudRates()]) self.ui.cb_baudrate.setCurrentText("9600") self.ui.cb_databits.addItems([data_bits[4:] for data_bits in QtSerialPort.QSerialPort.DataBits.values]) self.ui.cb_databits.setCurrentText("8") self.ui.cb_stopbits.addItems([stop_bits for stop_bits in QtSerialPort.QSerialPort.StopBits.values]) self.ui.cb_stopbits.setCurrentText("OneStop") self.ui.cb_parity.addItems([parity for parity in QtSerialPort.QSerialPort.Parity.values]) self.ui.cb_parity.setCurrentText("NoParity") self.ui.btn_refreshports.clicked.connect(self.on_refreshPortsClicked) def setupFontsOption(self): FONTSIZE = [str(x) for x in range(6,22) if (x<12 or x%2 == 0)] self.fontsOption = {"terminal": {}, "echo": {}} self._fontColor = {"terminal": (0,0,0), "echo": (0,0,0)} self._backgroundTerminalColor = (255,255,255) self.ui.cb_terminalFont.currentFontChanged.connect(lambda arg: self.on_fontFamilyChanged(arg, "terminal")) self.ui.cb_terminalFontSize.addItems(FONTSIZE) self.ui.cb_terminalFontSize.setCurrentIndex(4) self.ui.cb_terminalFontSize.currentIndexChanged.connect(lambda arg: self.on_fontSizeChanged(arg, "terminal")) self.ui.btn_terminalFontColor.clicked.connect(lambda: self.on_fontColorClicked("terminal")) self.ui.btn_terminalBackgroundColor.clicked.connect(self.on_backgroundTerminalColorClicked) self.ui.cb_echoFontSize.addItems(FONTSIZE) self.ui.cb_echoFontSize.setCurrentIndex(4) self.ui.btn_echoFontColor.clicked.connect(lambda: self.on_fontColorClicked("echo")) def setupDisplayOption(self): self.displayOption = dict() def saveConnectionSettings(self): self.connectionOption["com_port"] = self.ui.cb_port.currentText() self.connectionOption["baudrate"] = self.ui.cb_baudrate.currentText() self.connectionOption["data_bits"] = self.ui.cb_databits.currentText() self.connectionOption["stop_bits"] = self.ui.cb_stopbits.currentText() self.connectionOption["parity"] = self.ui.cb_parity.currentText() def saveFontSettings(self): self.fontsOption["terminal"]["font_family"] = self.ui.cb_terminalFont.currentText() self.fontsOption["terminal"]["font_size"] = self.ui.cb_terminalFontSize.currentText() self.fontsOption["terminal"]["bold"] = self.ui.btn_terminalFontBold.isChecked() self.fontsOption["terminal"]["italic"] = self.ui.btn_terminalFontItalic.isChecked() self.fontsOption["terminal"]["underline"] = self.ui.btn_terminalFontUnderline.isChecked() self.fontsOption["terminal"]["fg_color"] = self._fontColor["terminal"] self.fontsOption["terminal"]["bg_color"] = self._backgroundTerminalColor self.fontsOption["echo"]["enable"] = self.ui.gbox_echoFont.isChecked() self.fontsOption["echo"]["font_family"] = self.ui.cb_echoFont.currentText() self.fontsOption["echo"]["font_size"] = self.ui.cb_echoFontSize.currentText() self.fontsOption["echo"]["bold"] = self.ui.btn_echoFontBold.isChecked() self.fontsOption["echo"]["italic"] = self.ui.btn_echoFontItalic.isChecked() self.fontsOption["echo"]["underline"] = self.ui.btn_echoFontUnderline.isChecked() self.fontsOption["echo"]["fg_color"] = self._fontColor["echo"] def applyConnectionSettings(self): self.on_refreshPortsClicked() cb_port_items = [self.ui.cb_port.itemText(i) for i in range(self.ui.cb_port.count())] if self.connectionOption["com_port"] in cb_port_items: self.ui.cb_port.setCurrentText(self.connectionOption["com_port"]) self.ui.cb_baudrate.setCurrentText(self.connectionOption["baudrate"]) self.ui.cb_databits.setCurrentText(self.connectionOption["data_bits"]) self.ui.cb_stopbits.setCurrentText(self.connectionOption["stop_bits"]) self.ui.cb_parity.setCurrentText(self.connectionOption["parity"]) def applyFontSettings(self): self.ui.cb_terminalFont.setCurrentText(self.fontsOption["terminal"]["font_family"]) self.ui.cb_terminalFontSize.setCurrentText(self.fontsOption["terminal"]["font_size"]) self.ui.btn_terminalFontBold.setChecked(self.fontsOption["terminal"]["bold"]) self.ui.btn_terminalFontItalic.setChecked(self.fontsOption["terminal"]["italic"]) self.ui.btn_terminalFontUnderline.setChecked(self.fontsOption["terminal"]["underline"]) self._fontColor["terminal"] = self.fontsOption["terminal"]["fg_color"] self._backgroundTerminalColor = self.fontsOption["terminal"]["bg_color"] self.ui.gbox_echoFont.setChecked(self.fontsOption["echo"]["enable"]) self.ui.cb_echoFont.setCurrentText(self.fontsOption["echo"]["font_family"]) self.ui.cb_echoFontSize.setCurrentText(self.fontsOption["echo"]["font_size"]) self.ui.btn_echoFontBold.setChecked(self.fontsOption["echo"]["bold"]) self.ui.btn_echoFontItalic.setChecked(self.fontsOption["echo"]["italic"]) self.ui.btn_echoFontUnderline.setChecked(self.fontsOption["echo"]["underline"]) self._fontColor["echo"] = self.fontsOption["echo"]["fg_color"] def applyDisplaySettings(self): pass def saveDisplaySettings(self): pass def showEvent(self, arg__1: QtGui.QShowEvent) -> None: self.applyConnectionSettings() self.applyFontSettings() return super().showEvent(arg__1) def accept(self) -> None: self.saveConnectionSettings() self.saveFontSettings() self.saveDisplaySettings() return super().accept() def getSettings(self): return { "connection": self.connectionOption, "fonts" : self.fontsOption, "display" : self.displayOption } def on_listItemClicked(self, item: QtWidgets.QListWidgetItem): self.ui.stackedWidget.setCurrentIndex(self.ui.lstview_options.currentRow()) def on_refreshPortsClicked(self): self.ui.cb_port.clear() for info in QtSerialPort.QSerialPortInfo.availablePorts(): self.ui.cb_port.addItem(f"{info.portName()} ({info.description()}, {info.manufacturer()})", info.portName()) def on_fontFamilyChanged(self, font: QtGui.QFont, sender: str): if self.ui.gbox_echoFont.isChecked(): self.ui.cb_echoFont.setCurrentText(self.ui.cb_terminalFont.currentText()) def on_fontSizeChanged(self, index: int, sender: str): if not self.ui.gbox_echoFont.isChecked(): self.ui.cb_echoFontSize.setCurrentText(self.ui.cb_terminalFontSize.currentText()) def on_fontColorClicked(self, sender: str): current_color: QtGui.QColor = QtGui.QColor(*self.fontsOption[sender]["fg_color"]) new_color: QtGui.QColor = QtWidgets.QColorDialog.getColor(parent=self, initial=current_color) if new_color.isValid(): self._fontColor[sender] = new_color.getRgb() def on_backgroundTerminalColorClicked(self): current_color: QtGui.QColor = QtGui.QColor(*self.fontsOption["terminal"]["bg_color"]) new_color: QtGui.QColor = QtWidgets.QColorDialog.getColor(parent=self, initial=current_color) if new_color.isValid(): self._backgroundTerminalColor = new_color.getRgb()