194 lines
8.8 KiB
Python
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()
|
|
|
|
|