Files
SerialVisualizer/SettingsDialog.py
2022-07-12 07:25:44 +02:00

194 lines
8.8 KiB
Python

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()