diff --git a/src/.vscode/launch.json b/src/.vscode/launch.json new file mode 100644 index 0000000..3993b6f --- /dev/null +++ b/src/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "UDSClient", + "type": "debugpy", + "request": "launch", + "program": "${workspaceFolder}/UDSClient.py", + "console": "integratedTerminal", + "args": ["udss://demo.udsenterprise.com/jncq5fvwzmztu0kjtqvaa7vlvcnxdteddlcfhkhr/UDnsXW3UyakVgrmOKdD33WhxEUOEpGVU"], + } + ] +} \ No newline at end of file diff --git a/src/UDSClient.py b/src/UDSClient.py index 103f81b..6e1c03b 100755 --- a/src/UDSClient.py +++ b/src/UDSClient.py @@ -41,7 +41,7 @@ import threading import typing -from uds.ui import QtCore, QtWidgets, QtGui, QSettings, Ui_MainWindow +from uds.ui import QtCore, QtWidgets, QtGui, QSettings, Ui_MainWindow # pyright: ignore from uds.rest import RestApi, RetryException, InvalidVersion # Just to ensure there are available on runtime diff --git a/src/uds/ui/__init__.py b/src/uds/ui/__init__.py index 482eaec..154b36e 100644 --- a/src/uds/ui/__init__.py +++ b/src/uds/ui/__init__.py @@ -36,9 +36,9 @@ from PySide6 import QtCore, QtWidgets, QtGui from PySide6.QtCore import QSettings - from .qt6.UDSLauncherMac import Ui_MacLauncher - from .qt6.UDSWindow import Ui_MainWindow - from .qt6 import UDSResources_rc + from .pyside6.UDSLauncherMac import Ui_MacLauncher + from .pyside6.UDSWindow import Ui_MainWindow + from .pyside6 import UDSResources_rc _version = 'PySide6' # second, try to use PyQt6, available on arm64, x86_64, i386, ... except ImportError: @@ -46,9 +46,9 @@ from PyQt6 import QtCore, QtWidgets, QtGui # type: ignore from PyQt6.QtCore import QSettings # type: ignore - from .qt6.UDSLauncherMac import Ui_MacLauncher - from .qt6.UDSWindow import Ui_MainWindow - from .qt6 import UDSResources_rc + from .qt6.UDSLauncherMac import Ui_MacLauncher # type: ignore + from .qt6.UDSWindow import Ui_MainWindow # type: ignore + from .qt6 import UDSResources_rc # type: ignore _version = 'PyQt6' except ImportError: # If not found, try to use PyQt5 (not available on arm64) diff --git a/src/uds/ui/pyside6/UDSLauncherMac.py b/src/uds/ui/pyside6/UDSLauncherMac.py new file mode 100644 index 0000000..2cc3990 --- /dev/null +++ b/src/uds/ui/pyside6/UDSLauncherMac.py @@ -0,0 +1,62 @@ +# Form implementation generated from reading ui file 'UDSLauncherMac.ui' +# +# Created by: PySide6 UI code generator 6.5.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PySide6 import QtCore, QtGui, QtWidgets + + +class Ui_MacLauncher(object): + def setupUi(self, MacLauncher): + MacLauncher.setObjectName("MacLauncher") + MacLauncher.setWindowModality(QtCore.Qt.WindowModality.NonModal) + MacLauncher.resize(235, 120) + MacLauncher.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.ArrowCursor)) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/images/logo-uds-small"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + MacLauncher.setWindowIcon(icon) + MacLauncher.setWindowOpacity(1.0) + self.centralwidget = QtWidgets.QWidget(parent=MacLauncher) + self.centralwidget.setAutoFillBackground(True) + self.centralwidget.setObjectName("centralwidget") + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget) + self.verticalLayout_2.setContentsMargins(4, 4, 4, 4) + self.verticalLayout_2.setSpacing(4) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.frame = QtWidgets.QFrame(parent=self.centralwidget) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.verticalLayout = QtWidgets.QVBoxLayout(self.frame) + self.verticalLayout.setObjectName("verticalLayout") + self.topLabel = QtWidgets.QLabel(parent=self.frame) + self.topLabel.setTextFormat(QtCore.Qt.TextFormat.RichText) + self.topLabel.setObjectName("topLabel") + self.verticalLayout.addWidget(self.topLabel) + self.image = QtWidgets.QLabel(parent=self.frame) + self.image.setMinimumSize(QtCore.QSize(0, 32)) + self.image.setAutoFillBackground(True) + self.image.setText("") + self.image.setPixmap(QtGui.QPixmap(":/images/logo-uds-small")) + self.image.setScaledContents(False) + self.image.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.image.setObjectName("image") + self.verticalLayout.addWidget(self.image) + self.label_2 = QtWidgets.QLabel(parent=self.frame) + self.label_2.setTextFormat(QtCore.Qt.TextFormat.RichText) + self.label_2.setObjectName("label_2") + self.verticalLayout.addWidget(self.label_2) + self.verticalLayout_2.addWidget(self.frame) + MacLauncher.setCentralWidget(self.centralwidget) + + self.retranslateUi(MacLauncher) + QtCore.QMetaObject.connectSlotsByName(MacLauncher) + + def retranslateUi(self, MacLauncher): + _translate = QtCore.QCoreApplication.translate + MacLauncher.setWindowTitle(_translate("MacLauncher", "UDS Launcher")) + self.topLabel.setText(_translate("MacLauncher", "
UDS Launcher
")) + self.label_2.setText(_translate("MacLauncher", "Closing this window will end all UDS tunnels
")) diff --git a/src/uds/ui/pyside6/UDSResources_rc.py b/src/uds/ui/pyside6/UDSResources_rc.py new file mode 100644 index 0000000..6e8df11 --- /dev/null +++ b/src/uds/ui/pyside6/UDSResources_rc.py @@ -0,0 +1,2471 @@ +# Resource object code (Python 3) +# Created by: object code +# Created by: The Resource Compiler for Qt version 6.4.3 +# WARNING! All changes made in this file will be lost! + +from PySide6 import QtCore + +qt_resource_data = b"\ +\x00\x00\x08\xed\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00%\x00\x00\x000\x08\x06\x00\x00\x00\x96\x85\xb3+\ +\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\ +\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\ +\xdf\x03\x1b\x0e\x10;\x1eSxk\x00\x00\x08zID\ +ATX\xc3\xed\x98{pT\xf5\x15\xc7?\xbf\xfb\xd8\ +{\xb3yBp\x09\x08\xa8\xa5 TJ\xaa\xa5k\xad\ +\x81\xfa\x18\xf1:\xadSg\xaa\x16\xad\xd1Zu\xc4\x19\ +\xa7c\xeb\xab\x1a\x94\x91\x91\xaa\xb5v:\xd3\x97\xa9u\ +\x98\x96\xd2\x86\x19[G\x85a\xd5\x1a5\xc1\x16W\xa8\ +\xe1\xfd\x0e\x04\x03\x92\x9b@Lv7\xd9\xec}\xfc\xfa\ +\xc7\xde\xd0M\xd8MB\xa1\xd3?\xf4\xcc\xec$\xfb\xdb\ +s\xcf\xef\xfb;\xe7{\xce=\xbf\x03\x9f\xc9g\xf2\x7f\ +\x94X\x05\x9b\x03M\xe2\x15n.y\
+\xbb\xdb\xb6\x9e\x1bX\x85}!Y<\xcf\xad\xf95k\
+\xacBH\xcc\x84\xe4\x90\xdf-\xe9R\xd9\x9f\xedU\x93\
+S\x86\xd9y\xfeT9^\xf3a\xeb\xa5\xaar\xcc\xda\
+:\xffs\x85\x85(\xdcn\xf7\xa6\xaeQ\x03\x03\x039\
+sF\x94\xc42\x01\xdb\x93\xf7\x8b\xb2\xe3?\xeb\xc7o\
+k\xaa\x9c\xc39\x1b\xe6S\xb7\xf3:\xe4\xf8\xf9G\x08\
+\x86U'\xc6\xf1\xb2\x0b\xe2\xce\x92\x83\xba8p\x22Z\
+\xe1\xe7\xf2\x92\xd2\x92\x0e\xd4s\xa0\x9b5\x97{J\xfe\
+h\xb4|\xf0\x85Y\x9f\xb6\xab\xd2\xfbi\xe0\xf3\xec/\
+\xbb\x80\x1f\x19\x18\x18\x18\xae\xf3\xfd\xed\xad\xd6\x03\x92L\
+&\xb32\xe6\x90M\xd5\xf9>\xca?o\x7f\xf1\x82c\
+^\xf4\x86*\xb4md\x99\x9b\xed\x9ej\xfb\xa2l\x7f\
+\x8c6\x13V\xcdm\xec5o\x84\xd5\xb6!\x19%-\
+\xa3\x92\x86\x83Z\x1e`\x86\x82\x94\xee\xfe\x8a8\xda\xc8\
+W\xc4V\x9f?\x15^{\xaf\xf9\xda\xb1e\xf6U\xa6\
+\xd2yf\xc3\x0d|\xa4\xc2g\xbc\xbd\xdd\xb2kL\xb4\
+\xd65\xa8\xde\xf7\x5c\xab\x8d\xcd\x7f\xd3\xd4\xf1\xba\xccu\
+1Q\xd2\xf6\xb2r\xbf\xba\xec\x84V0SG\xadk\
+T3\xedR\xb6\x0f\xb2\x03\x03\x03\xfd5\xae\xd7;%\
+e\x92\xc9\xe4H\xd9yq\xd7\xcf\xd6\xb9\xed\xc3e\x9f\
+\xe3`\xf9\xb9\x9fL&\xcb\x07%\xf6\xd7\x1b*K\xe6\
+u\xde\xb3\xcc9\xbc\xa2k\xba\xdd\xc7k\xc9\xf9\x97\xa8\
+q\x1dJ\x9b\xf7\xe1\x94\x02\x8e\x10\xecO\x89*\x01n\
+\xa8\xda\x8d\xa5\xe4f\xd6+c4q_\x1d\xe1 V\
+\xb6\xad\x13\x15\xfeM\xae\xfc\xfd4Q\x9b\xb6\xb7\xfc\xe2\
+U\xc7Eb\xa4\xdaI\x5c\x22.\xa36t\xaf\x8c9\
+d\xb3\x0d~\xdeh\xc9\xd3\xf8\xf1\x1am[\x1e0\xba\
+\xeb\xf8\xdc\xc5\xfd\xd1k\x06\xb8\xbaj\x03\xcdm\x1cn\
+\xe0\x06X\xbc\xf0\xedI&\x93\xbb\x03\xdc\xe3xP\xf7\
+\xd6\x5c\xee0/\xe8\xb5\xdasP\xb5\xcb'J\xf7\xd7\
+\x81z\x17*0\x1f\xf2\x06\x1b8\xb7\x13\xe61\xbb\xdb\
+\x86\x9e\xa5\xa8*O\xcf\x95*\xbb\xe1%\x1a\xbc\x06\x9d\
+\xb0\xa8\x8dK\x8f\xd7\xbdf;\x0f7\xd0v\xcd\x9c\x8b\
+M\xedW\xab\xae\xe5\xc9d2\xd6\xcc~6\xdf\xe7\xfe\
+&\x8f\x01\xbb\x8e\xf7D\x95\xed\x0d\xa9r=tQ\xbe\
+\xecg\x13\xe66\xf3u~\xa6x\x85\xfd\xbc\xbb\xca=\
+!\xb1\xdc\x03\xde2\x1d$Cu\xfc\xfb\xd26K\x9b\
+\xf7\x9d|\x03\xfb\xa5\x91\xe3\xb5;\x99L\xf67\xd0\xc9\
+3\xa4\xfaK\xc4\xba\xcd\xd7\xdf\xa3\x80\xcfCMMp\
+\x00$\x93\xc9\xee*=;\xcb\x9dD#\xe6S\xe1\x8a\
+\x98a\xb7\xfc\x02\xbe\xab\xc1\xf7^\xfa\xbe\xf35\xa6\x09\
+\xea5o\xe2\x8d\xbc\xf7\xb8\xa4\xe3\xe6\x85\xb2\xd1\xb6\xad\
+;\x00\x9b\x8e\xd7\x19\x80\xcb\xf5\xaa\x8e\xf9>\xcd\x0b\xe5\
+\xa5&{\x80bf;D\x83x\x1e\x98\xe1>_a\
+\xdf\xd7\x13\x0a\xf75\xb8\xb9A\xb3\xf7\xaa\x9e\x1bO3\
++\xe3\xc5e\xcc{\x1c\xb5\xf0:\x11\xaf\x12\x80\x87\x07\
+\x06\x06\xfal\xbc>5\xdb\xc6QIC\xf5\xb4s\x15\
+#M\x9c\x8b\x83+\xd8^=*=,\x1cn\xe6\xda\
+\xe4\xf0\xbe\x18\x5c\xe1~\xe8\xad\xe3\x01\xb6R\x10\xab\xd7\
+\x9e\xb2\xdf\xa7\xad\x0an\xe6\xe7n\xe4\xfeZ\xfa\xfe\xeb\
+\xba\xde\x96\x9c\x9b\xdd\x0d\x9e\x1f#u^\x87F\xd4\xdc\
+\x18\x89D\x90\xef\x19\x84\xe0\xe0\x18){\xa2N\xc9\x98\
+\x0af\xa7\xf94<\x5c!\x1cD\xd5\xfc\xb2\xb5\xe5\xd2\
++\xb8x\x95\x07\xe6T\x1da\xbf\xd2\xf6\xeb\xf9\xbc\x8d\
+\x9e\xccQ\x19=\xae\xf5\xf6\x16\xec\xaf\x100\xca\xf7\xc7\
+N\x19\x83Z2\x95.\x9au,\xf6P\xe9\xfd\x14\xb7\
+\xd1W\xb2\x8d\xfe*m\x19U\xb0\x07\x8ce\x1b\x09\xc1\
+UBa\xce<\x86v\x97\xb4e\xa5\xfd\xd5k\xee\xf3\
+j\xc7C\xa2J[\xa7\xcdc\xa0\x9e}5ds\x00\
+\xee\xab\xf2\xb5s\xa6\xe4W\xb6\xc6\xdfgTe\x16\x99\
+\x1a\x0bCd*\x9c\x17\xb9*\xed\xdcL\x00\xeb\xaep\
+m\xa9w{\xfbm:>S\xcb<\xf0\x8c8\x10\x86\
+m;\xde\x97\xb9&\xd6\xbc\x1f\x98=\xe1\xd9f;S\
+*lc\xd4\xa2\xf3f_\x95\x00\x9f3\x8f\x9fb\x9b\
+\xf5\x99\xfb\xb6\xd2C\xf8\xe1:\x1eLF\xaa\xec\x97\xf2\
+\xebD\xb5\xfd\xd2[\xa3\xe3\xa8\xb7\xca\xb1X~>\xa4\
+\xab\x1c\x9f\x81\xbdgP\x0e\x11\x0c\xd1\x92\x9bk\xa5\xaf\
+_\xd2\xc9d\xf2@\x85\x0b`\xafy\xf2\xae\xd4h\xd9\
+I\xd2H-f]\x17\xaf\x92\x0bEy\xe0\xa9T\xe6\
+\x90\x96\xd4_\xe1k\xe8\xe2k\xec\xae\xf3s\xedUY\
+\x9d\x9a\xd9c\x91\xadRR\xb0\xb7\xc2\xfb\xab4\xffg\
+\xa6$$\x95\x87\xda\xbd\xd5\x1e\x04\xcc\x7f\x9f\xa8t!\
+[f\x1b\x07uoO\xf6\x8e\x00\x9f\x0b\xe5u\x92\xd1\
+\x06\x1fZ*}\xed\x9b\x914l\x06\x94\xf2\x9b\xd5`\
+2\x99LW9\x1e\xf6TxX\xd9Y\xe1\xdf\x16\xf7\
+\xd5\x01\xf3x\x88\x97\xdd\xe0\xfaW\xd2\xab\xb5\xcc\xb7\x19\
+}\xd5\xbeJ-\xad\xeb7\x8f\xbb\xe3\xd5\xfe\xbe\x86\xc1\
+*7\xf7\xbe\x0a5\x93\x19I\xfb\xcd\xe01X\xf6~\
+{\x93\xc9\xe4\x91&\xa7\x00\xcb\xaariI\xe9\xf6\xee\
+\x99w\xd7\x9cb/c\xe5\xc1i\xd6\xae\x0fW\x09\x15\
+\xbd\xe6\xe7\xcc\x99\xef\xed\xc42\xd7\x9af\x8e\x83\xa1\x06\
+\x8f\xf7\x84\xee]\xd8c0\x99L\xa6\xea,\xdf\x88\x95\
+\xfdl\xf1a\xfd\x88*\x0f\x88;Xv\x8d\xefN&\
+\x93\xd1Z\xc7\xbey|\x97^\xa7-\x99#\xdc\xfc\xa6\
+t\xa8\xc29\x5c\xadD'U\xe5\x1cN$\x93\xc9\xc4\
+2\xc7R\xa5\xfd\xd2_a\x1b\xa5\xfb\xa5\xfc\xbe1d\
+^\x87\xf2\x16\x5c\x87*]\xe7\x9a\x1ed\xecu\xf4\x04\
+\x07Gz``\xa0j\xed\x8e\xf9\xe7\xbb\xab\x04\xab\x95\
+^\xd8\xb3\xcd<\xc5W(\x85\xc8-s\xc1/\xaf\xc7\
+\xcaU9\x91K\xdf\xd7\xfe\x0a!\xbf\xbb\x81\xcf\x9c(\
+\xbb(m\x1f\x18\x18HU\xda\xa6\x19\xd2\xa3\x15n0\
+\xf9e\xde_\xb1'\xac\xfc\xa9\xbb\x9a\xf26\xcd\x0c\x0c\
+\x0c\xf4\xd5\xd8F\xb6\xc1m\x84B\xc9\x00\x91\xf2\x1b\xcf\
+\xfe\x1am\xb9\xb3\xc2\xb1>\xb8L\x08\xb8\xeb&Y\xe3\
+x\xcd\x99\xe7h\xde\xaa\xfdU%\x00\xe7\xcdP\x98r\
+\xa0\x8d\xf7U\x08\xc0\xdb\x97\x0b\x97\xe6\xcd\x7fg\x95k\
+@3\x01x\xe7r\xa1m\x99\xed\x0d\xda\xd1.f\xcf\
+{\xaaFx\xec5\x83\xc8\xd9d2YH&\x93\xc7\
+\x93\xc9\xe4\xfef{\x8a\xab\xec\x8bZ\xc7{\xc6l\x97\
+\x5c\x93\xed\x12+9\xee\xb2\x92\xb6\x0e\x0c\x0c\xf4\x0f\x0c\
+\x0cT\x9b\xbf;]G'\x89\xea\x08yi\x8bvU\
+\xa5\xcf\xb9{\xb9\x1au\xf38\xdbY\xe1\x1c\xde\xbbL\
+\xc7Fo\x85\x87\xd3\xe1:\xf6K\xbe\xeca\x7f\xa8\x8e\
+\xfbXq\xbfgk\x5c\xe7\xca\xef\x9bQ\xa7Jv\x08\
+\xc1hF^u\xf4\xe8\x9a'h\xc6\xa6@4\xda\xc4\
+\xc5kW\x85\x9e\x00U\x09\x98\x95.\x14\xf9:>s\
+\xaa\xc2EqO\x83\x9f\xad\xaf\x8e\xc19\xf1*\xfb\xa5\
+\x9e\xf7\x97\xaf\xf3\xc1$^\xa3\xcd\x97\x0b\x02*\xbb`\
+\x86\xdd\xde\x0a\x0f\x14\xc3u\xec\xaf|\x95\x07\xabX\x1d\
+\xdb\xbc\xd6\xe49\xda\xd4\x83\xea2\x01x\xa7C\x8b*\
+\xec\xadr.\xd5s^du\xef\x5c\xb81\xf3\xc1\xb9\
+\xd1s\xb7\x9e\xeded\x94\x04\xdc\xd5\xeev\xdd\xf8\xcd\
+\x1a\xec\xdd\xaa\x7f1\xa2\x84\x19\xca\xce&\x93\xc9I\xb3\
+t\x22\xe1\xd2\xf1\xde\xdb\xe0x\x92\xe2\x83H\xbe\x8em\
+\xa5\x1b\xedL\xa9p\xaf9h\xc1\x03\x5c\xa5{\xcep\
+=\xdf\x0c\x98\x9f\xe3@\x9d\xf7\xc3=\x15\x1e\x94Su\
+\x9e\x1f\x95\xaeC\xf5\x5c\xdb\xeb=\xffBq\xdf \x04\
+\x07C#\x83\x00N\xd8t`\xa7*<9\xd6\xbaa\
+u\xd7\xf9\x04_\xfe\xef\x1a\x9d`\xbe\xde\x0bR%\x99\
+:/J\x99:C@%;\xcb~e\x97\xb9\x99d\
+\xb4|\xad&\xea\xd3\xf4\x8d\xd3\xbcAd\x9a8\xa6\xf6\
+\xd4y\x93\xea/;\x1eR\x8d~\xb8\x1a\x018\xebR\
+\x1b\xa7\x1a9o\xcd^\xca|\x13\xa1\xa8t{\xd9\x15\
+\x5c'\x1a\xbdV4\x1a\x84\xd3\x03\x03\x03[\xcd0\xd3\
+\xc8CI1\xa0\x1d7{\x88\xeb\x09\xc3\xbd+8\xde\
+3M\x1e\xef\x0d=\x88T\xebLY\xee\x9c\xa9P\x0a\
+\x91\xb3\xe8\xf8\xae\xf4\xf9\x1a\x09\xd7\xe9*\xef\xb5V\xd0\
+>\xd0\xc8\xf1S\xf6\x10\x15\xad\xf2\xc0\x5c\xde\xf6\x83u\
+^\x87\xfa\xea\xbc/\xf9\x1a5\xc1\xc1p\xc4\xed70\
+00\x907\xa7\x84\xe9.\xbba\xa5\xab\x5c\xbc\xba\xcb\
+n\xd0\x99e\xbe\xb2\xdc\xb5\x92\xcf;00\x905\xeb\
+\xecb%\x01=^\xe7\xc5\xf2@\x03\x9b\xca\x95]\x90\
+\xbb\x93\xc9\xe4%\x19e\x11\xa9\x1a\xa1\xaa\x9e\xcf\xd1\xdf\
+\xe8~)\x99\x0e\x09\xd5o\x9cj\xa2gtT\xf7.\
+T0\x5c\xe1x(\x15\x93t\xc9\xac\xd3\x1e^\xa6t\
+)\xa7\x15,W^e:\xa7\x9cj\x94\x05X\xdc\xc6\
+1\xdd[\x0e\xd2\xccu*\xa5\xbb\xbf\xc6O4\xf0\xb3\
+\x8d^'*]\xc3l\xaf\x9f7\xaf\x0d)\xb3\xdd\x12\
+\xe6g\xdcQ\xe7gM\xe8\xcetb\xfb\x979\xde\xef\
+z\x18j\xe2x?R\xc7\xf1^\xad\x83&\xdb@[\
+\xa4\xcdyp\xa3e\x814UgX\x1d\xb5h\xb7T\
+Z\xd9/\xd7\xc0\xe7\xc8\xa9\xca\x1c\xf2%\xe2\xe5\xd7\x8b\
+&\xce\xcf\xd1\xb2\xeb{\xa5)!3e\xed\x14\x97\xf1\
+\x8d\xc2\x01-\xd3\x81\x16\x96\xc5{\x08\xc1\xc1\x90\xf7\xc8\
+\xfb\x18-;\xd9\xbaU\xbdLcW\x03\x17\xaf\xf2\x9b\
+\xe9C\x16\x8c\xde\x8e\xd7\xf1d\x9bo\xb0\xc7\xb9_\xf7\
+\x8e\x04\x8e\xc9\x98\xc6f\xc8\xbc\x18\x9d3\x03\x7f\xc6\x8e\
+\x1dP\xb2\x92Q\xcc\xbc \x96?l\xa0\xc2*IM\
+\x1cO\x0f\xd5\xb8\xa1\x15\x1f\xa0\xca\xdb\xbf\xf8P2h\
+\xae\xf8u\xc2<\x0e3VL\xe9d\x06\xe0\x91*\x9f\
+9\xeab\x1b\xab\xc9\x12\x8c\x13e!8\xd6\xc0\xcff\
+\x9a\xdc^w\x8d\xfdjg \xce\x94\xbeo3\xc0&\
+$m\xd32\x0b\x1c\x98\xc7S\xbeJ\x89C\xf9g\xc8\
+[p\xbc\xc7\x1ah\xcf\x95>\xf8\xecZ&\x04\xd7=\
+\xbb\xd0\x0a\x8f_;\xae\xd7\x89\x0a\xe7o\xa3\xfbe[\
+\x1d\xd7\xa1\x83\x15\x1e\x16b\xe6ub\xa4\xe4:\x94\x91\
+OW\xf0#\x04\xc3\x13*<\xc5/7KD\xf9\x05\
+ \xdd\xc0\x13s\xaf\x1d7\xe9\x0a\xb2M|\xfeaU\
+\x1e\xf9\x1d5/D\xdd\xe6\x0d\xab\xf8\xfa\x19\x19\xab\x0b\
+5\xfc\xd4m\xf6\xb6%\xcc\xb0\x1b\xd3\x0aV\x8f\x0a\x90\
+\x87\xeax@\x8cW8\x16\x06\xad>\x9e\xcc\x99\x00\xfa\
+T}\x8e\xd1D\xe9>+\x99\x15\xe0\xc8\x0ajvG\
+j\xfc\xddv\x87\xf6C\xf9\xb1\x98k\xf2u\xb2\x15\x8e\
+\xfbD\x03\xb5\x99+\xdd\x9e\xab\x0f\x90\xe5\xb5\x99%\xab\
+\xbcU\xba\x06\x16g\x08\xc8\xd586\xad8\xde\xe3\xcd\
+\xee\xbf:;SJ\xaf\xa1\x15g\x890\xaf\x7f\xa5\xef\
+#k\xe17\x1d\xe5\x9f\xefm\x87\x1e\x1c\xed\xb8\x0ee\
+J\xaeCZ\xe6:4h\xb6k\xf1\xbet\xc2\xa1\xb1\
+\x03\xae\xa2&\x18VK\xd5xR\xaf\xf4ut\xca\xa3\
+O\x9f\x0d_\xc0\xcd\x92\x85\x9du\xde\xf4\xe3\xe6\xc5\xfe\
+l2\x99\xbcT\xef@\x97d2\xd9\x9dL&\xcf\xca\
+X4\xa38\x11=\x01\xb8\xf2\xcd+\xeb\xe6\x9b1o\
+\x22\xdbU_OR\xcc\xdc\x97\x87\xcd\xc1O\xfbV\xb8\
+\xf9\xf2c0n\xe3\xfc\xb7\x8d\xbe\x97z\xdb\xaf\xd9P\
+\x93\x09\xe2\xc1m\xce\xac\xd0g\x1eS\x95\xae\x99\x83^\
+{\xbf+\x0d\xfe\xc5 \x5c\xe1\x9f\x96\xff\xd9A\x0b\xdf\
+z\xd4K\xd7\x91\x95\x84`\xb3MS\x0d\x5c\x87\x8a\xf7\
+\xa5\xc3\xe6}\xa9\x97\x10\x0c4\xf6\x14_\xeb\xe2U>\
+\x22\xf6\x88G?\xcb\xb5f~\xc8\xbcQm5/:\
+\xc3u^@c2\x06\xba\x0c\xd5\x08\xc0#\xbaw\x1e\
+\xcaJ\x81#cn\xbb8\x0a=\xf0*\xf4\x0cy\xe2\
+\xe6500\x903\xe7\xd5\xdd\xaa\xea\x13\xdeW\xba\x09\
+\x0f\x99\x03\x9f\xa2M>\x8cn\xaf\x10>\x07\x83:\xd5\
+Q\x8d\x10\xe3\x85\xe33\x9eL&\x13%\xbfb+8\
+\xa6\xb2\xaa<\x15Ww@\xef#\xbb\xea\xb8\x8f\xa4\xb9\
+\xfd.\x7f\xcc\x98\xd7\xa1\xed2J\xb5\xea\xbd/\x8d\xd8\
+\xbc\x8a\xa2\xab(\x87\x80\xe5'Z\x85Ah\xe5%\x11\
+\xa5\x17\xea\x5c\x1d_\xb9\xe4\xca\x9ep\xfb-\x0879\
+'\xdaB\xf7~\x95\x99\xd0\xf2\x83^\xf6%\x93\xc9\x8a\
+_C\x99\x01\xb9\xfc\xa9\
+\xbc\xa5W\xb0\x8dJ\x0f3\xd9\x1a\xd7\x91\x95\x86\xd8\x9c\
+\x02\x86\x10\xdc\xf8\xcd$S\xa5\x97\xa6\xa1Q\xdc\xe6\x05\
+\xecp\x85\xbfJ\x05\xa4\x9d\xeey\x8aW\x93\xa3y\xcd\
+\x9e\xac\x83\x15.\xe2\xf1:\xda9\xaa\xbb\xeb\x93\xedj\
+\xe3\xf2\x8bOw\x03S\x9e\xf5\xd6\xf1zM=\x91\x9b\
+=6\xf1\xa0\x9d\x87\xc9d2f~\xb6J\x018\xaf\
+\xea\x8b\xb4\x94\x1e\x03w=XU8N\x96\xdb_\x89\
+\x1a\xc7T\xf9\xfe\x8b\xd6\x1b8K\xe6\x7fn\xe4x\xa8\
+\x87\xd3e\x11\xc3\x15\xb67R\xe7y\xdb\xab{k\xe0\
+\x9bYd\xe6\xf0\x0a\xb7g\xd9M\xdf\xbc\x8e\x0dW\xb9\
+w\xc4\x1b<\xfe\xa3\xe6\xfd#ZG'M\xa5\xe3\xb3\
+\x91\xe3}_\x85k\x88S\x1d5\xe5\xd7\xfd]e\xf7\
+\x91\x9c\x1d+\x9b\x99\xfb\xbd\xfcX\xeb\xad\xa7\xe7\xde\xfc\
+7\xbdu\x06\xf5\x03\x15\x1e\xdcF\xea\xdc/\xfbuo\
+\xe7N\xba\xc6u#^\xef\xb7\x0fU\xee_\x84`\xdc\
+\xbe\x99\x94\x8b\xcbX\x12\xb5\xb7\xc6Z\xe7Q\xf3\xa2r\
+V\xf7~M\x9dWc\xcb\xf4z]\xba\xecb_z\
+\x93I7x\x83)\xbf\xa1Fe\xcc\xaf\xbb\xbfZ{\
+\x9b7\x96\xe3\x15.\xe0\x07\xad\xfe\xa0\xe6\xc5'_\xe1\
+\x06\xdc[\xc7\x05s\xa8\xc2\xcd7_\xa3\xe7%\xbe\xdc\
+\xc5\xd2\x9c\x8e\xe9\xb8\xacYX\xc4\xa9`\x9b\xa8\xe3\xd7\
+~\xb3\xf4\xe0R\x95\xcf\x96W\x1d\xcb\x03\x9b\x7f\x7f\xb0\
+\xc2M\xeel\xb5\x87\x17\xf3\xdc\xdd\xaf{\xcb\x08\xee\x99\
+\xe7\xda\xfc}\xbaB\xe0\xdc_\xe3\xfa\x90\xa8\xf0p\x9c\
+\x97\x05\xf3\xde\xae\xa0,\x22_%\x185\xf3\xf0Z\x0c\
+}\xfb\x96i\xe3\xa1*\xef\xa9\x99kcq{\xbd5\
+\xc2\x84U\xdb\xab\xe5@\x95N\x94\xb3fIU\xbcV\
+\xf85?\xcb\xd9\x0a\xd7\xb5L\xb5\xe5\xd9\xcd\xe3\xfd@\
+\x85\xe3\xfdx\x1d\xc7{\xf9\xf5i\xd8\xa9\xb1\x08f\xc0\
+\xcd\x95u\xa6\xc4\xed\xbc\x96\x97\xa8T\xa66\xb2\xdc\xc3\
+\xacy\x5c\x97\x1fK\xb9\x1a\xfb%Ue\xbf\xc4j\x9c\
+#\x83\xb5\xeekU\xe6\x5c\x1e1\xcb[\x1a\xbd\x0e\xe5\
+\xfc8 \xbd\x16f\x87h\xee\xc4\xccTY\x19,\xaa\
+\xbb\x97\x22\xcc\xea\xee\xb9fk\xad\x07\xdf\x17\xb0\x81N\
+\x07\x97\x09aG\x1al\xf3\xbc9\xddS\xf9\x899(\
+i\xaf\xd9\xde\xc5\x9a\xbb\x0e\xb3\x9d+\xddP\xfa\xad\xec\
+\xdd\xa9p\x83\x1b*?\x1e\xca\x96L.\xda\xa6;\xcb\
+\x1b\xd7s\xf3MW\xb8\xe8\xf5\x9a_/\xa7u\xa7\x1c\
+c\xb9\xcf^z\x91;l\xde\x5cF=\xb4F\xfc\xf1\
+\x15\xfe|1\x00g\xeb<\xa6\xf6'\x93\xc9]em\
+\x157CS\xd6\xdcg\xd7J\xf6WB\xf7\xf6\xbc\xe5\
+T}Z\xa3\xe2\xb2\xc9\xe5\xc7k\xe9\x92\xc9E\x0f\x99\
+\xdb\xae\xb4\xdf\x0eZu]0W5L\xab\x81\xd9\x22\
+\xcc\xa9\xb8\xca\xffx\xa8\xac\xbe\xf0@\xa5\x9f7\xdbx\
+[\xd9\xf6\xa2\xe6\xcf\x0f\x96\x1d\xbb\xdbT\xbdV\xb5\x7f\
+\x057\xe0\xe2y8h\xee\xd3\xb7K\xda\xbc[\x95\xeb\
+\xad\x0f\xd8q\xc37\xafc\xbbU\xf9\x1b\x8c^\xf3\x9c\
+\xce\x99\xf7\x8ese\xc7Gl\x99\xfbG^5\xa6\xd1\
+\xabr\xbc'd\xf4>6r\xbc;\xddQsP\xd5\
+{\xad\xd3v\x06\xf0d2y\xa0\xc2uw0\x99L\
+\xee-;v\x1fR\xf5e\xadk}+\xd5_\xe1\xdc\
+O\x98\x9dj\xf5\xee\x97\xec2\xb3\xbd\xf4W\xb8\xb6\x0e\
+\x99\x9f#[\xe1:T\xedsx}Z\xbd\xa6\xd0\x13\
+\xdc\xfc\x09\xd2_\xe3b\x900C\xf2`\xc9\xaf\xe5.\
+`}A[\xa2\xb0\xc2S|\xe9\xe7M7\xf1z\xe9\
+*\x17\x94\xa8\xeeL76h\xb6{\xa50\x912\x07\
+\x1d\xd9\xf5y\x87U\xb9\xd4\xa2\xfc\xfd\x0d\x9a\xbf\x8fU\
+y\x10\xcaTi\xcb\xe1*\xaf\xdd[\xe3\xb3\xf7\xa9\xf2\
+\xc0\x98}\xf2\xe0\xa2\x02MJI\xda\xdaD\xa0\xdf\xa9\
+\xca\xa5\x06\xf1\xb2\xf3\xb7RX\xcaK\xda]-\xa0\x9a\
+\xef\xa5o\x99\xebC\xe9\xf1\xd0\xbb\xcc1\xbb\xdf\x86\x1e\
+\xae|\x85\x1b\xfbr\x0fN+\xb96\xf5-s^\xf4\
+\x96\xb5\xb1\xaa\x04\xd2\xe1&\xb7[*V\xb6\xbd\xde*\
+\xc7\x7f\xca\xce\xe9\xe3J\x16\xba\xa8\xf60\x1e\xabp\xbd\
+\xe8]\xe6\xfe\x91\x95\xb4\xbd\xce\x07%\xdb\x8ew\x1bU\
+;\xf626vh\xdc~p\xa8\xf3\xba\xdb\xdb\xc8\xf5\
+\xbc\xfc\xc1h\x85\xfb\xa5x\x07\x8e\x89\xbe*!\xa3\
+\x96\x9c\x8c^\xccT\x8d\x07\xaf\xe1&_3\x13\xc0c\
++g\xb6\xc7\xd6\x81\x81\x81\xa6\xbeE1\xa7\xaa+\xae\
+\xa0\xd4\xc8\xcf\xa7\xeb\x09\xddf\xdb\xd7\xbb\x8cv\xf91\
+{\xc0\x8ec\xb6\xcaW\xe3\xd2\xf2e\x11\x07\xd4\xfc\xd2\
+\xc7\xf9&\xcf\x8b\xe2\xf1\xbb\x7f\x05\xd7\x8a\xdd\x0dl\xd3\
+\xc9\xebDVwV\xeej6T\x16\x8f\x91\xed\xf5\x86\
+\xc1\xb2\xe3]V\x1f\xef6\xb5U\xaeJ\x10\x1euh\
+\xfb\xfd\xe6q\x94k\xe2\xd8M\xd5\xbb_\xcc\xebD\xa3\
+\x0f{)\xd51Uf\xc9\xb9\xd0\xccu\xc8\x91s\xc2\
+-\x94C\xac\xfc\x04\xc9H\xca\x98\xbd({T\xc7W\
+\xd1\xe6\x81\x98V\xf3_E\x1f\xa8\xf0z\x8d\x84\xee\xe5\
+~\xdf\xec\xbf]\xee$\xad\xf7\xc9\xbe\xa1\x9e\x14\xb3n\
+\xa9\xd8\xe6\xb1\x0a'oFF\xd9E\xbd\xa1\xdb\x8a\xcf\
+\xab\x81\x81\x81\xe1d2\x992\x9f\xda\x8b_?\xc6\xaa\
+l/+\xe9D\xbdO\xd9\x03\x03\x03\xfd\xc9d\xf2\x88\
+\xf9\xb9\xe3\x15\x8e\xb5\x9c\xf9\xba'\xca.\xc0\xc5\xaf\xb2\
+z\xcbz\x10r\x16\x1f_\xcd\x1e\x87\x8d\xfel\xce\xe2\
+AK\xfb\xcd\x12\xa7^s\x9f%*\xfc\xb3\xac\xb9\xed\
+\x86\xce[\xf3\x1a\xb1\xd5,]\xd9\xa5\xeae\x0f\xc5\xfd\
+\xd1\xc81{`\x05\xc7h\xb17\xe8\xb6d2\x19\xaf\
+\xf4\xd9\xcc?+~\x86x3\xfb\xb3\xc2y\x91P\xe5\
+\xaf\xdb3\x92\x8eX\xd1\xf3d\x96\x7fd\x96\xd9f3\
+\xd7\x09\xab\x8e\xb9\xbc\xa4\xe2q\xb7\x5c\x9bT<\xbfW\
+\xd8\x99\xb0\xbf\xc2\xbe\xb0\xe2x\xb7\xabT\xe2\xa0\xee\x9d\
+b\xae\x99\xe3cTw\x7f\xfd_\xef\xc3CZR\xda\
+\xac\xc7\xaevM\xcf\x99mv\xa4\x99N-s_\xf6\
+'\x93\xc9b\x19a\xb5\xf2\xc9\xe2}\xe3`#\xd7\xc0\
+\xb2\xcf\xb0\xa3\xc6u([\xe1\x1e\x12H\x91B\xa1@\
+\x92m\xa4\xc1\x22\x91\xba\xfe]\x95E0\x14\xc4\xc2r\
+\x00p[2\x99,\x94]k#>\xfd\x1c\xd1j\xe1\
+\x84\xc5q\xe0\xb6\xa0eFB0\x00\x04\xfc\xa1\x9c\x10\
+\x0c\x80\x10|/j\x82\x01\x00\x00\x10:\x84`\x00\x00\
+\x00\x10\x82\x01\x00\x00\x00B0\x00\x00\x00@\x08\x06\x00\
+\x00\x00\x08\xc1\x00\x00\x00\x80\xaf\xb0X\x06\x00 \x08\x0e\
+\xd0\x04\x00\x1a\xc1<\xc1\x00\x00\x00\x08\x1d\xca!\x00\x00\
+\x00@\x08\x06\x00\x00\x00\x08\xc1\x00\x00\x00\x00!\x18\x00\
+\x00\x00 \x04\x03\x00\x00\x00\x84`\x00\x00\x00\x80\x10\x0c\
+\x00\x00\x00\x10\x82\x01\x00\x00\x00B0\x00\x00\x00@\x08\
+\x06\x00\x00\x00\x08\xc1\x00\x00\x00\x00!\x18\x00\x00\x00 \
+\x04\x03\x00\x00\x00\x84`\x00\x00\x00\x80\x10\x0c\x00\x00\x00\
+\x10\x82\x01\x00\x00@\x08\x06\x00\x00\x00\x08\xc1\x00\x00\x00\
+\x00!\x18\x00\x00\x00 \x04\x03\x00\x00\x00\x84`\x00\x00\
+\x00\x80\x10\x0c\x00\x00\x00\x10\x82\x01\x00\x00\x00B0\x00\
+\x00\x00@\x08\x06\x00\x00\x00\x08\xc1\x00\x00\x00\x00!\x18\
+\x00\x00\x00 \x04\x03\x00\x00\x00\x84`\x00\x00\x00\x80\x10\
+\x0c\x00\x00\x00\x10\x82\x01\x00\x00@\x08\x06\x00\x00\x00\x08\
+\xc1\x00\x00\x00\x00!\x18\x00\x00\x00 \x04\x03\x00\x00\x00\
+\x84`\x00\x00\x00\x80\x10\x0c\x00\x00\x00\x10\x82\x01\x00\x00\
+\x00B0\x00\x00\x00@\x08\x06\x00\x00\x00\x08\xc1\x00\x00\
+\x00\x00!\x18\x00\x00\x00 \x04\x03\x00\x00\x00\x84`\x00\
+\x00\x00\x80\x10\x0c\x00\x00\x00\x10\x82\x01\x00\x00@\x08\x06\
+\x00\x00\x00\x08\xc1\x00\x00\x00\x00!\x18\x00\x00\x00 \x04\
+\x03\x00\x00\x00\x84`\x00\x00\x00\x80\x10\x0c\x00\x00\x00\x10\
+\x82\x01\x00\x00\x00B0\x00\x00\x00@\x08\x06\x00\x00\x00\
+\x08\xc1\x00\x00\x00\x00!\x18\x00\x00\x00 \x04\x03\x00\x00\
+\x00\x84`\x00\x00\x00\x80\x10\x0c\x00\x00\x00\x10\x82\x01\x00\
+\x00@\x08\x06\x00\x00\x00\x08\xc1\x00\x00\x00\x00!\x18\x00\
+\x00\x00 \x04\x03\x00\x00\x00\x84`\x00\x00\x00\x80\x10\x0c\
+\x00\x00\x00\x10\x82\x01\x00\x00\x00B0\x00\x00\x00@\x08\
+\x06\x00\x00\x00\x08\xc1\x00\x00\x00\x00!\x18\x00\x00\x00 \
+\x04\x03\x00\x00\x00\x84`\x00\x00\x00\x80\x10\x0c\x00\x00\x00\
+\x10\x82\x01\x00\x00@\x08\x06\x00\x00\x00\x08\xc1\x00\x00\x00\
+\x00!\x18\x00\x00\x00 \x04\x03\x00\x00\x00\x84`\x00\x00\
+\x00\x80\x10\x0c\x00\x00\x00\x10\x82\x01\x00\x00\x00B0\x00\
+\x00\x00\xe0\x96\xff\x7f\x00'\x97\xdb\xb5M)\xcb\x9d\x00\
+\x00\x00\x00IEND\xaeB`\x82\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03}\xc3\
+\x00i\
+\x00m\x00a\x00g\x00e\x00s\
+\x00\x0e\
+\x01\x8e\xbf\xec\
+\x00l\
+\x00o\x00g\x00o\x00-\x00u\x00d\x00s\x00-\x00s\x00m\x00a\x00l\x00l\
+\x00\x0c\
+\x05\xe1\xfcw\
+\x00l\
+\x00o\x00g\x00o\x00-\x00u\x00d\x00s\x00-\x00b\x00i\x00g\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01\x87\x81\xc5\x85\xf0\
+\x00\x00\x004\x00\x00\x00\x00\x00\x01\x00\x00\x08\xf1\
+\x00\x00\x01\x87\x81\xc5\x85\xf0\
+"
+
+def qInitResources():
+ QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+ QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/src/uds/ui/pyside6/UDSWindow.py b/src/uds/ui/pyside6/UDSWindow.py
new file mode 100644
index 0000000..ca92325
--- /dev/null
+++ b/src/uds/ui/pyside6/UDSWindow.py
@@ -0,0 +1,80 @@
+# Form implementation generated from reading ui file 'UDSWindow.ui'
+#
+# Created by: PySide6 UI code generator 6.5.0
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic6 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PySide6 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.setWindowModality(QtCore.Qt.WindowModality.NonModal)
+ MainWindow.resize(259, 185)
+ MainWindow.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.BusyCursor))
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap(":/images/logo-uds-small"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
+ MainWindow.setWindowIcon(icon)
+ MainWindow.setWindowOpacity(1.0)
+ self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
+ self.centralwidget.setAutoFillBackground(True)
+ self.centralwidget.setObjectName("centralwidget")
+ self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
+ self.verticalLayout_2.setContentsMargins(4, 4, 4, 4)
+ self.verticalLayout_2.setSpacing(4)
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.frame = QtWidgets.QFrame(parent=self.centralwidget)
+ self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+ self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+ self.frame.setObjectName("frame")
+ self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame)
+ self.verticalLayout_3.setContentsMargins(4, 4, 4, 4)
+ self.verticalLayout_3.setSpacing(4)
+ self.verticalLayout_3.setObjectName("verticalLayout_3")
+ self.verticalLayout = QtWidgets.QVBoxLayout()
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.image = QtWidgets.QLabel(parent=self.frame)
+ self.image.setMinimumSize(QtCore.QSize(0, 24))
+ self.image.setAutoFillBackground(True)
+ self.image.setText("")
+ self.image.setPixmap(QtGui.QPixmap(":/images/logo-uds-small"))
+ self.image.setScaledContents(False)
+ self.image.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
+ self.image.setObjectName("image")
+ self.verticalLayout.addWidget(self.image)
+ self.info = QtWidgets.QLabel(parent=self.frame)
+ self.info.setMaximumSize(QtCore.QSize(16777215, 16))
+ self.info.setObjectName("info")
+ self.verticalLayout.addWidget(self.info)
+ self.progressBar = QtWidgets.QProgressBar(parent=self.frame)
+ self.progressBar.setProperty("value", 24)
+ self.progressBar.setTextVisible(False)
+ self.progressBar.setObjectName("progressBar")
+ self.verticalLayout.addWidget(self.progressBar)
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+ self.horizontalLayout.addItem(spacerItem)
+ self.cancelButton = QtWidgets.QPushButton(parent=self.frame)
+ self.cancelButton.setDefault(True)
+ self.cancelButton.setFlat(False)
+ self.cancelButton.setObjectName("cancelButton")
+ self.horizontalLayout.addWidget(self.cancelButton)
+ spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+ self.horizontalLayout.addItem(spacerItem1)
+ self.verticalLayout.addLayout(self.horizontalLayout)
+ self.verticalLayout_3.addLayout(self.verticalLayout)
+ self.verticalLayout_2.addWidget(self.frame)
+ MainWindow.setCentralWidget(self.centralwidget)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "UDS Connection"))
+ self.info.setText(_translate("MainWindow", "TextLabel"))
+ self.cancelButton.setText(_translate("MainWindow", "Cancel"))
diff --git a/src/uds/ui/pyside6/__init__.py b/src/uds/ui/pyside6/__init__.py
new file mode 100644
index 0000000..5066e0d
--- /dev/null
+++ b/src/uds/ui/pyside6/__init__.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2023 Virtual Cable S.L.U.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+# * Neither the name of Virtual Cable S.L. nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.