Redid the archive to include the compiled forms and changed the plug-in header to the new format. eric7 release-11.0.1

Thu, 01 Aug 2024 11:30:50 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 01 Aug 2024 11:30:50 +0200
branch
eric7
changeset 148
187406bcc8ae
parent 147
8d34da4deb33
child 149
97a796fbdb17

Redid the archive to include the compiled forms and changed the plug-in header to the new format.

.hgignore file | annotate | diff | comparison | revisions
MqttMonitor/ConfigurationPage/Ui_MqttPage.py file | annotate | diff | comparison | revisions
MqttMonitor/Ui_MqttConnectionOptionsDialog.py file | annotate | diff | comparison | revisions
MqttMonitor/Ui_MqttConnectionProfilesDialog.py file | annotate | diff | comparison | revisions
MqttMonitor/Ui_MqttMonitorWidget.py file | annotate | diff | comparison | revisions
MqttMonitor/Ui_MqttUserPropertiesEditor.py file | annotate | diff | comparison | revisions
PKGLIST file | annotate | diff | comparison | revisions
PluginMqttMonitor.epj file | annotate | diff | comparison | revisions
PluginMqttMonitor.py file | annotate | diff | comparison | revisions
PluginMqttMonitor.zip file | annotate | diff | comparison | revisions
--- a/.hgignore	Thu Aug 01 11:30:02 2024 +0200
+++ b/.hgignore	Thu Aug 01 11:30:50 2024 +0200
@@ -13,4 +13,3 @@
 glob:tmp
 glob:__pycache__
 glob:**.DS_Store
-glob:**Ui_*.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MqttMonitor/ConfigurationPage/Ui_MqttPage.py	Thu Aug 01 11:30:50 2024 +0200
@@ -0,0 +1,99 @@
+# Form implementation generated from reading ui file 'MqttMonitor/ConfigurationPage/MqttPage.ui'
+#
+# Created by: PyQt6 UI code generator 6.7.1
+#
+# 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 PyQt6 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MqttPage(object):
+    def setupUi(self, MqttPage):
+        MqttPage.setObjectName("MqttPage")
+        MqttPage.resize(400, 316)
+        self.verticalLayout = QtWidgets.QVBoxLayout(MqttPage)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.headerLabel = QtWidgets.QLabel(parent=MqttPage)
+        self.headerLabel.setObjectName("headerLabel")
+        self.verticalLayout.addWidget(self.headerLabel)
+        self.line15 = QtWidgets.QFrame(parent=MqttPage)
+        self.line15.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line15.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line15.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line15.setObjectName("line15")
+        self.verticalLayout.addWidget(self.line15)
+        self.groupBox_5 = QtWidgets.QGroupBox(parent=MqttPage)
+        self.groupBox_5.setObjectName("groupBox_5")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.groupBox_5)
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.mqttv31Button = QtWidgets.QRadioButton(parent=self.groupBox_5)
+        self.mqttv31Button.setObjectName("mqttv31Button")
+        self.horizontalLayout_3.addWidget(self.mqttv31Button)
+        self.mqttv311Button = QtWidgets.QRadioButton(parent=self.groupBox_5)
+        self.mqttv311Button.setChecked(True)
+        self.mqttv311Button.setObjectName("mqttv311Button")
+        self.horizontalLayout_3.addWidget(self.mqttv311Button)
+        self.mqttv5Button = QtWidgets.QRadioButton(parent=self.groupBox_5)
+        self.mqttv5Button.setObjectName("mqttv5Button")
+        self.horizontalLayout_3.addWidget(self.mqttv5Button)
+        self.verticalLayout.addWidget(self.groupBox_5)
+        self.groupBox_7 = QtWidgets.QGroupBox(parent=MqttPage)
+        self.groupBox_7.setObjectName("groupBox_7")
+        self.horizontalLayout = QtWidgets.QHBoxLayout(self.groupBox_7)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.label = QtWidgets.QLabel(parent=self.groupBox_7)
+        self.label.setObjectName("label")
+        self.horizontalLayout.addWidget(self.label)
+        self.recentBrokersSpinBox = QtWidgets.QSpinBox(parent=self.groupBox_7)
+        self.recentBrokersSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.recentBrokersSpinBox.setMinimum(5)
+        self.recentBrokersSpinBox.setMaximum(50)
+        self.recentBrokersSpinBox.setObjectName("recentBrokersSpinBox")
+        self.horizontalLayout.addWidget(self.recentBrokersSpinBox)
+        spacerItem = QtWidgets.QSpacerItem(138, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout.addItem(spacerItem)
+        self.verticalLayout.addWidget(self.groupBox_7)
+        self.groupBox_8 = QtWidgets.QGroupBox(parent=MqttPage)
+        self.groupBox_8.setObjectName("groupBox_8")
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.groupBox_8)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.label_2 = QtWidgets.QLabel(parent=self.groupBox_8)
+        self.label_2.setObjectName("label_2")
+        self.horizontalLayout_2.addWidget(self.label_2)
+        self.recentTopicsSpinBox = QtWidgets.QSpinBox(parent=self.groupBox_8)
+        self.recentTopicsSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.recentTopicsSpinBox.setMinimum(5)
+        self.recentTopicsSpinBox.setMaximum(50)
+        self.recentTopicsSpinBox.setObjectName("recentTopicsSpinBox")
+        self.horizontalLayout_2.addWidget(self.recentTopicsSpinBox)
+        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.verticalLayout.addWidget(self.groupBox_8)
+        spacerItem2 = QtWidgets.QSpacerItem(20, 31, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.verticalLayout.addItem(spacerItem2)
+
+        self.retranslateUi(MqttPage)
+        QtCore.QMetaObject.connectSlotsByName(MqttPage)
+        MqttPage.setTabOrder(self.mqttv31Button, self.mqttv311Button)
+        MqttPage.setTabOrder(self.mqttv311Button, self.mqttv5Button)
+        MqttPage.setTabOrder(self.mqttv5Button, self.recentBrokersSpinBox)
+        MqttPage.setTabOrder(self.recentBrokersSpinBox, self.recentTopicsSpinBox)
+
+    def retranslateUi(self, MqttPage):
+        _translate = QtCore.QCoreApplication.translate
+        self.headerLabel.setText(_translate("MqttPage", "<b>Configure MQTT Monitor</b>"))
+        self.groupBox_5.setTitle(_translate("MqttPage", "Default MQTT Protocol"))
+        self.mqttv31Button.setToolTip(_translate("MqttPage", "Select to use the MQTT 3.1 protocol"))
+        self.mqttv31Button.setText(_translate("MqttPage", "v 3.1"))
+        self.mqttv311Button.setToolTip(_translate("MqttPage", "Select to use the MQTT 3.1.1 protocol"))
+        self.mqttv311Button.setText(_translate("MqttPage", "v 3.1.1"))
+        self.mqttv5Button.setToolTip(_translate("MqttPage", "Select to use the MQTT 5.0 protocol"))
+        self.mqttv5Button.setText(_translate("MqttPage", "v 5.0"))
+        self.groupBox_7.setTitle(_translate("MqttPage", "Recent Brokers"))
+        self.label.setText(_translate("MqttPage", "Number of recent brokers:"))
+        self.recentBrokersSpinBox.setToolTip(_translate("MqttPage", "Enter the number of recent brokers to remember"))
+        self.groupBox_8.setTitle(_translate("MqttPage", "Recent Topics"))
+        self.label_2.setText(_translate("MqttPage", "Number of recent topics:"))
+        self.recentTopicsSpinBox.setToolTip(_translate("MqttPage", "Enter the number of recent topics to remember"))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MqttMonitor/Ui_MqttConnectionOptionsDialog.py	Thu Aug 01 11:30:50 2024 +0200
@@ -0,0 +1,270 @@
+# Form implementation generated from reading ui file 'MqttMonitor/MqttConnectionOptionsDialog.ui'
+#
+# Created by: PyQt6 UI code generator 6.7.1
+#
+# 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 PyQt6 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MqttConnectionOptionsDialog(object):
+    def setupUi(self, MqttConnectionOptionsDialog):
+        MqttConnectionOptionsDialog.setObjectName("MqttConnectionOptionsDialog")
+        MqttConnectionOptionsDialog.resize(450, 350)
+        MqttConnectionOptionsDialog.setSizeGripEnabled(True)
+        self.verticalLayout = QtWidgets.QVBoxLayout(MqttConnectionOptionsDialog)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.optionsWidget = QtWidgets.QTabWidget(parent=MqttConnectionOptionsDialog)
+        self.optionsWidget.setObjectName("optionsWidget")
+        self.generalTab = QtWidgets.QWidget()
+        self.generalTab.setObjectName("generalTab")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.generalTab)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.label = QtWidgets.QLabel(parent=self.generalTab)
+        self.label.setObjectName("label")
+        self.horizontalLayout.addWidget(self.label)
+        self.clientIdEdit = QtWidgets.QLineEdit(parent=self.generalTab)
+        self.clientIdEdit.setClearButtonEnabled(True)
+        self.clientIdEdit.setObjectName("clientIdEdit")
+        self.horizontalLayout.addWidget(self.clientIdEdit)
+        self.generateIdButton = QtWidgets.QPushButton(parent=self.generalTab)
+        self.generateIdButton.setObjectName("generateIdButton")
+        self.horizontalLayout.addWidget(self.generateIdButton)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        self.groupBox_5 = QtWidgets.QGroupBox(parent=self.generalTab)
+        self.groupBox_5.setObjectName("groupBox_5")
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.groupBox_5)
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.mqttv31Button = QtWidgets.QRadioButton(parent=self.groupBox_5)
+        self.mqttv31Button.setObjectName("mqttv31Button")
+        self.horizontalLayout_3.addWidget(self.mqttv31Button)
+        self.mqttv311Button = QtWidgets.QRadioButton(parent=self.groupBox_5)
+        self.mqttv311Button.setChecked(True)
+        self.mqttv311Button.setObjectName("mqttv311Button")
+        self.horizontalLayout_3.addWidget(self.mqttv311Button)
+        self.mqttv5Button = QtWidgets.QRadioButton(parent=self.groupBox_5)
+        self.mqttv5Button.setObjectName("mqttv5Button")
+        self.horizontalLayout_3.addWidget(self.mqttv5Button)
+        self.verticalLayout_2.addWidget(self.groupBox_5)
+        self.gridLayout = QtWidgets.QGridLayout()
+        self.gridLayout.setObjectName("gridLayout")
+        self.label_6 = QtWidgets.QLabel(parent=self.generalTab)
+        self.label_6.setObjectName("label_6")
+        self.gridLayout.addWidget(self.label_6, 0, 0, 1, 1)
+        self.connectionTimeoutSpinBox = QtWidgets.QSpinBox(parent=self.generalTab)
+        self.connectionTimeoutSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.connectionTimeoutSpinBox.setMaximum(300)
+        self.connectionTimeoutSpinBox.setSingleStep(5)
+        self.connectionTimeoutSpinBox.setProperty("value", 15)
+        self.connectionTimeoutSpinBox.setObjectName("connectionTimeoutSpinBox")
+        self.gridLayout.addWidget(self.connectionTimeoutSpinBox, 0, 1, 1, 1)
+        spacerItem = QtWidgets.QSpacerItem(148, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.gridLayout.addItem(spacerItem, 0, 2, 1, 1)
+        self.label_2 = QtWidgets.QLabel(parent=self.generalTab)
+        self.label_2.setObjectName("label_2")
+        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
+        self.keepaliveSpinBox = QtWidgets.QSpinBox(parent=self.generalTab)
+        self.keepaliveSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.keepaliveSpinBox.setMaximum(300)
+        self.keepaliveSpinBox.setSingleStep(5)
+        self.keepaliveSpinBox.setProperty("value", 60)
+        self.keepaliveSpinBox.setObjectName("keepaliveSpinBox")
+        self.gridLayout.addWidget(self.keepaliveSpinBox, 1, 1, 1, 1)
+        spacerItem1 = QtWidgets.QSpacerItem(148, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.gridLayout.addItem(spacerItem1, 1, 2, 1, 1)
+        self.verticalLayout_2.addLayout(self.gridLayout)
+        self.cleanSessionCheckBox = QtWidgets.QCheckBox(parent=self.generalTab)
+        self.cleanSessionCheckBox.setObjectName("cleanSessionCheckBox")
+        self.verticalLayout_2.addWidget(self.cleanSessionCheckBox)
+        spacerItem2 = QtWidgets.QSpacerItem(20, 92, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.verticalLayout_2.addItem(spacerItem2)
+        self.optionsWidget.addTab(self.generalTab, "")
+        self.credentialsTab = QtWidgets.QWidget()
+        self.credentialsTab.setObjectName("credentialsTab")
+        self.gridLayout_5 = QtWidgets.QGridLayout(self.credentialsTab)
+        self.gridLayout_5.setObjectName("gridLayout_5")
+        self.label_3 = QtWidgets.QLabel(parent=self.credentialsTab)
+        self.label_3.setObjectName("label_3")
+        self.gridLayout_5.addWidget(self.label_3, 0, 0, 1, 1)
+        self.usernameEdit = QtWidgets.QLineEdit(parent=self.credentialsTab)
+        self.usernameEdit.setClearButtonEnabled(True)
+        self.usernameEdit.setObjectName("usernameEdit")
+        self.gridLayout_5.addWidget(self.usernameEdit, 0, 1, 1, 1)
+        self.label_4 = QtWidgets.QLabel(parent=self.credentialsTab)
+        self.label_4.setObjectName("label_4")
+        self.gridLayout_5.addWidget(self.label_4, 1, 0, 1, 1)
+        self.passwordEdit = QtWidgets.QLineEdit(parent=self.credentialsTab)
+        self.passwordEdit.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
+        self.passwordEdit.setClearButtonEnabled(True)
+        self.passwordEdit.setObjectName("passwordEdit")
+        self.gridLayout_5.addWidget(self.passwordEdit, 1, 1, 1, 1)
+        spacerItem3 = QtWidgets.QSpacerItem(20, 204, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.gridLayout_5.addItem(spacerItem3, 2, 1, 1, 1)
+        self.optionsWidget.addTab(self.credentialsTab, "")
+        self.lastWillTab = QtWidgets.QWidget()
+        self.lastWillTab.setObjectName("lastWillTab")
+        self.gridLayout_2 = QtWidgets.QGridLayout(self.lastWillTab)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.willTopicEdit = QtWidgets.QLineEdit(parent=self.lastWillTab)
+        self.willTopicEdit.setClearButtonEnabled(True)
+        self.willTopicEdit.setObjectName("willTopicEdit")
+        self.gridLayout_2.addWidget(self.willTopicEdit, 0, 0, 1, 1)
+        self.label_5 = QtWidgets.QLabel(parent=self.lastWillTab)
+        self.label_5.setObjectName("label_5")
+        self.gridLayout_2.addWidget(self.label_5, 0, 1, 1, 1)
+        self.willQosSpinBox = QtWidgets.QSpinBox(parent=self.lastWillTab)
+        self.willQosSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.willQosSpinBox.setMaximum(2)
+        self.willQosSpinBox.setObjectName("willQosSpinBox")
+        self.gridLayout_2.addWidget(self.willQosSpinBox, 0, 2, 1, 1)
+        self.willRetainCheckBox = QtWidgets.QCheckBox(parent=self.lastWillTab)
+        self.willRetainCheckBox.setObjectName("willRetainCheckBox")
+        self.gridLayout_2.addWidget(self.willRetainCheckBox, 0, 3, 1, 1)
+        self.willPropertiesButton = QtWidgets.QToolButton(parent=self.lastWillTab)
+        self.willPropertiesButton.setText("")
+        self.willPropertiesButton.setObjectName("willPropertiesButton")
+        self.gridLayout_2.addWidget(self.willPropertiesButton, 0, 4, 1, 1)
+        self.willMessageEdit = QtWidgets.QPlainTextEdit(parent=self.lastWillTab)
+        self.willMessageEdit.setMaximumSize(QtCore.QSize(16777215, 300))
+        self.willMessageEdit.setObjectName("willMessageEdit")
+        self.gridLayout_2.addWidget(self.willMessageEdit, 1, 0, 1, 5)
+        self.optionsWidget.addTab(self.lastWillTab, "")
+        self.tlsTab = QtWidgets.QWidget()
+        self.tlsTab.setObjectName("tlsTab")
+        self.gridLayout_3 = QtWidgets.QGridLayout(self.tlsTab)
+        self.gridLayout_3.setObjectName("gridLayout_3")
+        self.tlsEnableCheckBox = QtWidgets.QCheckBox(parent=self.tlsTab)
+        self.tlsEnableCheckBox.setObjectName("tlsEnableCheckBox")
+        self.gridLayout_3.addWidget(self.tlsEnableCheckBox, 0, 0, 1, 2)
+        self.label_8 = QtWidgets.QLabel(parent=self.tlsTab)
+        self.label_8.setObjectName("label_8")
+        self.gridLayout_3.addWidget(self.label_8, 1, 0, 1, 1)
+        self.tlsCertsFilePicker = EricPathPicker(parent=self.tlsTab)
+        self.tlsCertsFilePicker.setEnabled(False)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tlsCertsFilePicker.sizePolicy().hasHeightForWidth())
+        self.tlsCertsFilePicker.setSizePolicy(sizePolicy)
+        self.tlsCertsFilePicker.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.tlsCertsFilePicker.setObjectName("tlsCertsFilePicker")
+        self.gridLayout_3.addWidget(self.tlsCertsFilePicker, 1, 1, 1, 1)
+        spacerItem4 = QtWidgets.QSpacerItem(20, 214, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.gridLayout_3.addItem(spacerItem4, 2, 0, 1, 2)
+        self.optionsWidget.addTab(self.tlsTab, "")
+        self.propertiesTab = QtWidgets.QWidget()
+        self.propertiesTab.setObjectName("propertiesTab")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.propertiesTab)
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.connectPropertiesButton = QtWidgets.QRadioButton(parent=self.propertiesTab)
+        self.connectPropertiesButton.setChecked(True)
+        self.connectPropertiesButton.setObjectName("connectPropertiesButton")
+        self.horizontalLayout_2.addWidget(self.connectPropertiesButton)
+        self.disconnectPropertiesButton = QtWidgets.QRadioButton(parent=self.propertiesTab)
+        self.disconnectPropertiesButton.setObjectName("disconnectPropertiesButton")
+        self.horizontalLayout_2.addWidget(self.disconnectPropertiesButton)
+        self.verticalLayout_3.addLayout(self.horizontalLayout_2)
+        self.propertiesWidget = MqttUserPropertiesEditor(parent=self.propertiesTab)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.propertiesWidget.sizePolicy().hasHeightForWidth())
+        self.propertiesWidget.setSizePolicy(sizePolicy)
+        self.propertiesWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.propertiesWidget.setObjectName("propertiesWidget")
+        self.verticalLayout_3.addWidget(self.propertiesWidget)
+        self.samePropertiesCheckBox = QtWidgets.QCheckBox(parent=self.propertiesTab)
+        self.samePropertiesCheckBox.setObjectName("samePropertiesCheckBox")
+        self.verticalLayout_3.addWidget(self.samePropertiesCheckBox)
+        self.optionsWidget.addTab(self.propertiesTab, "")
+        self.verticalLayout.addWidget(self.optionsWidget)
+        self.buttonBox = QtWidgets.QDialogButtonBox(parent=MqttConnectionOptionsDialog)
+        self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
+        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok|QtWidgets.QDialogButtonBox.StandardButton.RestoreDefaults)
+        self.buttonBox.setObjectName("buttonBox")
+        self.verticalLayout.addWidget(self.buttonBox)
+
+        self.retranslateUi(MqttConnectionOptionsDialog)
+        self.optionsWidget.setCurrentIndex(0)
+        self.buttonBox.accepted.connect(MqttConnectionOptionsDialog.accept) # type: ignore
+        self.buttonBox.rejected.connect(MqttConnectionOptionsDialog.reject) # type: ignore
+        self.tlsEnableCheckBox.toggled['bool'].connect(self.tlsCertsFilePicker.setEnabled) # type: ignore
+        QtCore.QMetaObject.connectSlotsByName(MqttConnectionOptionsDialog)
+        MqttConnectionOptionsDialog.setTabOrder(self.optionsWidget, self.clientIdEdit)
+        MqttConnectionOptionsDialog.setTabOrder(self.clientIdEdit, self.generateIdButton)
+        MqttConnectionOptionsDialog.setTabOrder(self.generateIdButton, self.mqttv31Button)
+        MqttConnectionOptionsDialog.setTabOrder(self.mqttv31Button, self.mqttv311Button)
+        MqttConnectionOptionsDialog.setTabOrder(self.mqttv311Button, self.mqttv5Button)
+        MqttConnectionOptionsDialog.setTabOrder(self.mqttv5Button, self.connectionTimeoutSpinBox)
+        MqttConnectionOptionsDialog.setTabOrder(self.connectionTimeoutSpinBox, self.keepaliveSpinBox)
+        MqttConnectionOptionsDialog.setTabOrder(self.keepaliveSpinBox, self.cleanSessionCheckBox)
+        MqttConnectionOptionsDialog.setTabOrder(self.cleanSessionCheckBox, self.usernameEdit)
+        MqttConnectionOptionsDialog.setTabOrder(self.usernameEdit, self.passwordEdit)
+        MqttConnectionOptionsDialog.setTabOrder(self.passwordEdit, self.willTopicEdit)
+        MqttConnectionOptionsDialog.setTabOrder(self.willTopicEdit, self.willMessageEdit)
+        MqttConnectionOptionsDialog.setTabOrder(self.willMessageEdit, self.willQosSpinBox)
+        MqttConnectionOptionsDialog.setTabOrder(self.willQosSpinBox, self.willRetainCheckBox)
+        MqttConnectionOptionsDialog.setTabOrder(self.willRetainCheckBox, self.willPropertiesButton)
+        MqttConnectionOptionsDialog.setTabOrder(self.willPropertiesButton, self.tlsEnableCheckBox)
+        MqttConnectionOptionsDialog.setTabOrder(self.tlsEnableCheckBox, self.tlsCertsFilePicker)
+        MqttConnectionOptionsDialog.setTabOrder(self.tlsCertsFilePicker, self.connectPropertiesButton)
+        MqttConnectionOptionsDialog.setTabOrder(self.connectPropertiesButton, self.disconnectPropertiesButton)
+        MqttConnectionOptionsDialog.setTabOrder(self.disconnectPropertiesButton, self.propertiesWidget)
+        MqttConnectionOptionsDialog.setTabOrder(self.propertiesWidget, self.samePropertiesCheckBox)
+
+    def retranslateUi(self, MqttConnectionOptionsDialog):
+        _translate = QtCore.QCoreApplication.translate
+        MqttConnectionOptionsDialog.setWindowTitle(_translate("MqttConnectionOptionsDialog", "MQTT Connection Options"))
+        self.label.setText(_translate("MqttConnectionOptionsDialog", "Client ID:"))
+        self.clientIdEdit.setToolTip(_translate("MqttConnectionOptionsDialog", "Enter the ID string for this client"))
+        self.generateIdButton.setToolTip(_translate("MqttConnectionOptionsDialog", "Press to generate a client ID"))
+        self.generateIdButton.setText(_translate("MqttConnectionOptionsDialog", "Generate"))
+        self.groupBox_5.setTitle(_translate("MqttConnectionOptionsDialog", "MQTT Protocol"))
+        self.mqttv31Button.setToolTip(_translate("MqttConnectionOptionsDialog", "Select to use the MQTT 3.1 protocol"))
+        self.mqttv31Button.setText(_translate("MqttConnectionOptionsDialog", "v 3.1"))
+        self.mqttv311Button.setToolTip(_translate("MqttConnectionOptionsDialog", "Select to use the MQTT 3.1.1 protocol"))
+        self.mqttv311Button.setText(_translate("MqttConnectionOptionsDialog", "v 3.1.1"))
+        self.mqttv5Button.setToolTip(_translate("MqttConnectionOptionsDialog", "Select to use the MQTT 5.0 protocol"))
+        self.mqttv5Button.setText(_translate("MqttConnectionOptionsDialog", "v 5.0"))
+        self.label_6.setText(_translate("MqttConnectionOptionsDialog", "Connection Timeout:"))
+        self.connectionTimeoutSpinBox.setToolTip(_translate("MqttConnectionOptionsDialog", "Enter the connection timeout in seconds"))
+        self.connectionTimeoutSpinBox.setSuffix(_translate("MqttConnectionOptionsDialog", " s"))
+        self.label_2.setText(_translate("MqttConnectionOptionsDialog", "Keep Alive Interval:"))
+        self.keepaliveSpinBox.setToolTip(_translate("MqttConnectionOptionsDialog", "Enter the keep alive interval in seconds"))
+        self.keepaliveSpinBox.setSuffix(_translate("MqttConnectionOptionsDialog", " s"))
+        self.cleanSessionCheckBox.setToolTip(_translate("MqttConnectionOptionsDialog", "Select to start with a clean session"))
+        self.cleanSessionCheckBox.setText(_translate("MqttConnectionOptionsDialog", "Clean Session"))
+        self.optionsWidget.setTabText(self.optionsWidget.indexOf(self.generalTab), _translate("MqttConnectionOptionsDialog", "General"))
+        self.label_3.setText(_translate("MqttConnectionOptionsDialog", "User Name:"))
+        self.usernameEdit.setToolTip(_translate("MqttConnectionOptionsDialog", "Enter the user name"))
+        self.label_4.setText(_translate("MqttConnectionOptionsDialog", "Password:"))
+        self.passwordEdit.setToolTip(_translate("MqttConnectionOptionsDialog", "Enter the password"))
+        self.optionsWidget.setTabText(self.optionsWidget.indexOf(self.credentialsTab), _translate("MqttConnectionOptionsDialog", "User Credentials"))
+        self.willTopicEdit.setToolTip(_translate("MqttConnectionOptionsDialog", "Enter the topic of the last will"))
+        self.label_5.setText(_translate("MqttConnectionOptionsDialog", "QoS:"))
+        self.willQosSpinBox.setToolTip(_translate("MqttConnectionOptionsDialog", "Enter the desired QoS value"))
+        self.willRetainCheckBox.setToolTip(_translate("MqttConnectionOptionsDialog", "Select to retain the last will message"))
+        self.willRetainCheckBox.setText(_translate("MqttConnectionOptionsDialog", "Retain"))
+        self.willPropertiesButton.setToolTip(_translate("MqttConnectionOptionsDialog", "Press to edit the user properties"))
+        self.willMessageEdit.setToolTip(_translate("MqttConnectionOptionsDialog", "Enter the last will message to be sent"))
+        self.optionsWidget.setTabText(self.optionsWidget.indexOf(self.lastWillTab), _translate("MqttConnectionOptionsDialog", "Last Will"))
+        self.tlsEnableCheckBox.setToolTip(_translate("MqttConnectionOptionsDialog", "Select to enable SSL/TLS connections"))
+        self.tlsEnableCheckBox.setText(_translate("MqttConnectionOptionsDialog", "SSL/TLS Enabled"))
+        self.label_8.setText(_translate("MqttConnectionOptionsDialog", "CA File:"))
+        self.tlsCertsFilePicker.setToolTip(_translate("MqttConnectionOptionsDialog", "Enter the full path to the CA certificate file; leave empty to use platform default"))
+        self.optionsWidget.setTabText(self.optionsWidget.indexOf(self.tlsTab), _translate("MqttConnectionOptionsDialog", "SSL/TLS"))
+        self.connectPropertiesButton.setToolTip(_translate("MqttConnectionOptionsDialog", "Select to edit the CONNECT user properties"))
+        self.connectPropertiesButton.setText(_translate("MqttConnectionOptionsDialog", "CONNECT"))
+        self.disconnectPropertiesButton.setToolTip(_translate("MqttConnectionOptionsDialog", "Select to edit the DISCONNECT user properties"))
+        self.disconnectPropertiesButton.setText(_translate("MqttConnectionOptionsDialog", "DISCONNECT"))
+        self.samePropertiesCheckBox.setToolTip(_translate("MqttConnectionOptionsDialog", "Select to use the CONNECT user properties when disconnecting"))
+        self.samePropertiesCheckBox.setText(_translate("MqttConnectionOptionsDialog", "Use CONNECT properties for DISCONNECT"))
+        self.optionsWidget.setTabText(self.optionsWidget.indexOf(self.propertiesTab), _translate("MqttConnectionOptionsDialog", "User Properties"))
+from MqttMonitor.MqttUserPropertiesEditor import MqttUserPropertiesEditor
+from eric7.EricWidgets.EricPathPicker import EricPathPicker
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MqttMonitor/Ui_MqttConnectionProfilesDialog.py	Thu Aug 01 11:30:50 2024 +0200
@@ -0,0 +1,462 @@
+# Form implementation generated from reading ui file 'MqttMonitor/MqttConnectionProfilesDialog.ui'
+#
+# Created by: PyQt6 UI code generator 6.7.1
+#
+# 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 PyQt6 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MqttConnectionProfilesDialog(object):
+    def setupUi(self, MqttConnectionProfilesDialog):
+        MqttConnectionProfilesDialog.setObjectName("MqttConnectionProfilesDialog")
+        MqttConnectionProfilesDialog.resize(800, 600)
+        MqttConnectionProfilesDialog.setSizeGripEnabled(True)
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(MqttConnectionProfilesDialog)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.splitter = QtWidgets.QSplitter(parent=MqttConnectionProfilesDialog)
+        self.splitter.setOrientation(QtCore.Qt.Orientation.Horizontal)
+        self.splitter.setChildrenCollapsible(False)
+        self.splitter.setObjectName("splitter")
+        self.profileListFrame = QtWidgets.QFrame(parent=self.splitter)
+        self.profileListFrame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.profileListFrame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.profileListFrame.setObjectName("profileListFrame")
+        self.verticalLayout = QtWidgets.QVBoxLayout(self.profileListFrame)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.profilesList = QtWidgets.QListWidget(parent=self.profileListFrame)
+        self.profilesList.setAlternatingRowColors(True)
+        self.profilesList.setObjectName("profilesList")
+        self.verticalLayout.addWidget(self.profilesList)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.plusButton = QtWidgets.QToolButton(parent=self.profileListFrame)
+        self.plusButton.setObjectName("plusButton")
+        self.horizontalLayout.addWidget(self.plusButton)
+        self.copyButton = QtWidgets.QToolButton(parent=self.profileListFrame)
+        self.copyButton.setObjectName("copyButton")
+        self.horizontalLayout.addWidget(self.copyButton)
+        self.minusButton = QtWidgets.QToolButton(parent=self.profileListFrame)
+        self.minusButton.setObjectName("minusButton")
+        self.horizontalLayout.addWidget(self.minusButton)
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout.addItem(spacerItem)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.profileFrame = QtWidgets.QFrame(parent=self.splitter)
+        self.profileFrame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
+        self.profileFrame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
+        self.profileFrame.setObjectName("profileFrame")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.profileFrame)
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.gridLayout = QtWidgets.QGridLayout()
+        self.gridLayout.setObjectName("gridLayout")
+        self.label = QtWidgets.QLabel(parent=self.profileFrame)
+        self.label.setObjectName("label")
+        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
+        self.profileEdit = QtWidgets.QLineEdit(parent=self.profileFrame)
+        self.profileEdit.setReadOnly(True)
+        self.profileEdit.setClearButtonEnabled(True)
+        self.profileEdit.setObjectName("profileEdit")
+        self.gridLayout.addWidget(self.profileEdit, 0, 1, 1, 1)
+        self.line = QtWidgets.QFrame(parent=self.profileFrame)
+        self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line.setObjectName("line")
+        self.gridLayout.addWidget(self.line, 1, 0, 1, 2)
+        self.label_2 = QtWidgets.QLabel(parent=self.profileFrame)
+        self.label_2.setObjectName("label_2")
+        self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
+        self.brokerAddressEdit = QtWidgets.QLineEdit(parent=self.profileFrame)
+        self.brokerAddressEdit.setClearButtonEnabled(True)
+        self.brokerAddressEdit.setObjectName("brokerAddressEdit")
+        self.gridLayout.addWidget(self.brokerAddressEdit, 2, 1, 1, 1)
+        self.label_3 = QtWidgets.QLabel(parent=self.profileFrame)
+        self.label_3.setObjectName("label_3")
+        self.gridLayout.addWidget(self.label_3, 3, 0, 1, 1)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.brokerPortSpinBox = QtWidgets.QSpinBox(parent=self.profileFrame)
+        self.brokerPortSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.brokerPortSpinBox.setMaximum(65535)
+        self.brokerPortSpinBox.setProperty("value", 1883)
+        self.brokerPortSpinBox.setObjectName("brokerPortSpinBox")
+        self.horizontalLayout_2.addWidget(self.brokerPortSpinBox)
+        spacerItem1 = QtWidgets.QSpacerItem(318, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.gridLayout.addLayout(self.horizontalLayout_2, 3, 1, 1, 1)
+        self.label_4 = QtWidgets.QLabel(parent=self.profileFrame)
+        self.label_4.setObjectName("label_4")
+        self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1)
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.clientIdEdit = QtWidgets.QLineEdit(parent=self.profileFrame)
+        self.clientIdEdit.setClearButtonEnabled(True)
+        self.clientIdEdit.setObjectName("clientIdEdit")
+        self.horizontalLayout_3.addWidget(self.clientIdEdit)
+        self.generateIdButton = QtWidgets.QPushButton(parent=self.profileFrame)
+        self.generateIdButton.setObjectName("generateIdButton")
+        self.horizontalLayout_3.addWidget(self.generateIdButton)
+        self.gridLayout.addLayout(self.horizontalLayout_3, 4, 1, 1, 1)
+        self.line_2 = QtWidgets.QFrame(parent=self.profileFrame)
+        self.line_2.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line_2.setObjectName("line_2")
+        self.gridLayout.addWidget(self.line_2, 5, 0, 1, 2)
+        self.verticalLayout_3.addLayout(self.gridLayout)
+        self.profileTabWidget = QtWidgets.QTabWidget(parent=self.profileFrame)
+        self.profileTabWidget.setObjectName("profileTabWidget")
+        self.generalTab = QtWidgets.QWidget()
+        self.generalTab.setObjectName("generalTab")
+        self.gridLayout_2 = QtWidgets.QGridLayout(self.generalTab)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.groupBox_5 = QtWidgets.QGroupBox(parent=self.generalTab)
+        self.groupBox_5.setObjectName("groupBox_5")
+        self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.groupBox_5)
+        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
+        self.mqttv31Button = QtWidgets.QRadioButton(parent=self.groupBox_5)
+        self.mqttv31Button.setObjectName("mqttv31Button")
+        self.horizontalLayout_7.addWidget(self.mqttv31Button)
+        self.mqttv311Button = QtWidgets.QRadioButton(parent=self.groupBox_5)
+        self.mqttv311Button.setChecked(True)
+        self.mqttv311Button.setObjectName("mqttv311Button")
+        self.horizontalLayout_7.addWidget(self.mqttv311Button)
+        self.mqttv5Button = QtWidgets.QRadioButton(parent=self.groupBox_5)
+        self.mqttv5Button.setObjectName("mqttv5Button")
+        self.horizontalLayout_7.addWidget(self.mqttv5Button)
+        self.gridLayout_2.addWidget(self.groupBox_5, 0, 0, 1, 2)
+        self.label_12 = QtWidgets.QLabel(parent=self.generalTab)
+        self.label_12.setObjectName("label_12")
+        self.gridLayout_2.addWidget(self.label_12, 1, 0, 1, 1)
+        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
+        self.connectionTimeoutSpinBox = QtWidgets.QSpinBox(parent=self.generalTab)
+        self.connectionTimeoutSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.connectionTimeoutSpinBox.setMaximum(300)
+        self.connectionTimeoutSpinBox.setSingleStep(5)
+        self.connectionTimeoutSpinBox.setProperty("value", 15)
+        self.connectionTimeoutSpinBox.setObjectName("connectionTimeoutSpinBox")
+        self.horizontalLayout_5.addWidget(self.connectionTimeoutSpinBox)
+        spacerItem2 = QtWidgets.QSpacerItem(148, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_5.addItem(spacerItem2)
+        self.gridLayout_2.addLayout(self.horizontalLayout_5, 1, 1, 1, 1)
+        self.label_5 = QtWidgets.QLabel(parent=self.generalTab)
+        self.label_5.setObjectName("label_5")
+        self.gridLayout_2.addWidget(self.label_5, 2, 0, 1, 1)
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        self.keepaliveSpinBox = QtWidgets.QSpinBox(parent=self.generalTab)
+        self.keepaliveSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.keepaliveSpinBox.setMaximum(300)
+        self.keepaliveSpinBox.setSingleStep(5)
+        self.keepaliveSpinBox.setProperty("value", 60)
+        self.keepaliveSpinBox.setObjectName("keepaliveSpinBox")
+        self.horizontalLayout_4.addWidget(self.keepaliveSpinBox)
+        spacerItem3 = QtWidgets.QSpacerItem(148, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_4.addItem(spacerItem3)
+        self.gridLayout_2.addLayout(self.horizontalLayout_4, 2, 1, 1, 1)
+        self.cleanSessionCheckBox = QtWidgets.QCheckBox(parent=self.generalTab)
+        self.cleanSessionCheckBox.setObjectName("cleanSessionCheckBox")
+        self.gridLayout_2.addWidget(self.cleanSessionCheckBox, 3, 0, 1, 2)
+        spacerItem4 = QtWidgets.QSpacerItem(20, 227, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.gridLayout_2.addItem(spacerItem4, 4, 1, 1, 1)
+        self.profileTabWidget.addTab(self.generalTab, "")
+        self.credentialsTab = QtWidgets.QWidget()
+        self.credentialsTab.setObjectName("credentialsTab")
+        self.gridLayout_3 = QtWidgets.QGridLayout(self.credentialsTab)
+        self.gridLayout_3.setObjectName("gridLayout_3")
+        self.label_7 = QtWidgets.QLabel(parent=self.credentialsTab)
+        self.label_7.setObjectName("label_7")
+        self.gridLayout_3.addWidget(self.label_7, 0, 0, 1, 1)
+        self.usernameEdit = QtWidgets.QLineEdit(parent=self.credentialsTab)
+        self.usernameEdit.setClearButtonEnabled(True)
+        self.usernameEdit.setObjectName("usernameEdit")
+        self.gridLayout_3.addWidget(self.usernameEdit, 0, 1, 1, 2)
+        self.label_6 = QtWidgets.QLabel(parent=self.credentialsTab)
+        self.label_6.setObjectName("label_6")
+        self.gridLayout_3.addWidget(self.label_6, 1, 0, 1, 1)
+        self.passwordEdit = QtWidgets.QLineEdit(parent=self.credentialsTab)
+        self.passwordEdit.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
+        self.passwordEdit.setClearButtonEnabled(True)
+        self.passwordEdit.setObjectName("passwordEdit")
+        self.gridLayout_3.addWidget(self.passwordEdit, 1, 1, 1, 1)
+        self.showPasswordButton = QtWidgets.QToolButton(parent=self.credentialsTab)
+        self.showPasswordButton.setCheckable(True)
+        self.showPasswordButton.setObjectName("showPasswordButton")
+        self.gridLayout_3.addWidget(self.showPasswordButton, 1, 2, 1, 1)
+        spacerItem5 = QtWidgets.QSpacerItem(20, 228, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.gridLayout_3.addItem(spacerItem5, 2, 0, 1, 1)
+        self.profileTabWidget.addTab(self.credentialsTab, "")
+        self.lastWillTab = QtWidgets.QWidget()
+        self.lastWillTab.setObjectName("lastWillTab")
+        self.gridLayout_4 = QtWidgets.QGridLayout(self.lastWillTab)
+        self.gridLayout_4.setObjectName("gridLayout_4")
+        self.willTopicEdit = QtWidgets.QLineEdit(parent=self.lastWillTab)
+        self.willTopicEdit.setClearButtonEnabled(True)
+        self.willTopicEdit.setObjectName("willTopicEdit")
+        self.gridLayout_4.addWidget(self.willTopicEdit, 0, 0, 1, 1)
+        self.label_13 = QtWidgets.QLabel(parent=self.lastWillTab)
+        self.label_13.setObjectName("label_13")
+        self.gridLayout_4.addWidget(self.label_13, 0, 1, 1, 1)
+        self.willQosSpinBox = QtWidgets.QSpinBox(parent=self.lastWillTab)
+        self.willQosSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.willQosSpinBox.setMaximum(2)
+        self.willQosSpinBox.setObjectName("willQosSpinBox")
+        self.gridLayout_4.addWidget(self.willQosSpinBox, 0, 2, 1, 1)
+        self.willRetainCheckBox = QtWidgets.QCheckBox(parent=self.lastWillTab)
+        self.willRetainCheckBox.setObjectName("willRetainCheckBox")
+        self.gridLayout_4.addWidget(self.willRetainCheckBox, 0, 3, 1, 1)
+        self.willPropertiesButton = QtWidgets.QToolButton(parent=self.lastWillTab)
+        self.willPropertiesButton.setText("")
+        self.willPropertiesButton.setObjectName("willPropertiesButton")
+        self.gridLayout_4.addWidget(self.willPropertiesButton, 0, 4, 1, 1)
+        self.willMessageEdit = QtWidgets.QPlainTextEdit(parent=self.lastWillTab)
+        self.willMessageEdit.setMaximumSize(QtCore.QSize(16777215, 300))
+        self.willMessageEdit.setObjectName("willMessageEdit")
+        self.gridLayout_4.addWidget(self.willMessageEdit, 1, 0, 1, 5)
+        self.profileTabWidget.addTab(self.lastWillTab, "")
+        self.tlsTab = QtWidgets.QWidget()
+        self.tlsTab.setObjectName("tlsTab")
+        self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.tlsTab)
+        self.verticalLayout_5.setObjectName("verticalLayout_5")
+        self.tlsGroupBox = QtWidgets.QGroupBox(parent=self.tlsTab)
+        self.tlsGroupBox.setCheckable(True)
+        self.tlsGroupBox.setChecked(False)
+        self.tlsGroupBox.setObjectName("tlsGroupBox")
+        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.tlsGroupBox)
+        self.verticalLayout_4.setObjectName("verticalLayout_4")
+        self.tlsDefaultCertsButton = QtWidgets.QRadioButton(parent=self.tlsGroupBox)
+        self.tlsDefaultCertsButton.setChecked(True)
+        self.tlsDefaultCertsButton.setObjectName("tlsDefaultCertsButton")
+        self.verticalLayout_4.addWidget(self.tlsDefaultCertsButton)
+        self.tlsCertsFileButton = QtWidgets.QRadioButton(parent=self.tlsGroupBox)
+        self.tlsCertsFileButton.setObjectName("tlsCertsFileButton")
+        self.verticalLayout_4.addWidget(self.tlsCertsFileButton)
+        self.tlsCertsFileWidget = QtWidgets.QWidget(parent=self.tlsGroupBox)
+        self.tlsCertsFileWidget.setEnabled(False)
+        self.tlsCertsFileWidget.setObjectName("tlsCertsFileWidget")
+        self.horizontalLayout_6 = QtWidgets.QHBoxLayout(self.tlsCertsFileWidget)
+        self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
+        spacerItem6 = QtWidgets.QSpacerItem(25, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_6.addItem(spacerItem6)
+        self.label_8 = QtWidgets.QLabel(parent=self.tlsCertsFileWidget)
+        self.label_8.setObjectName("label_8")
+        self.horizontalLayout_6.addWidget(self.label_8)
+        self.tlsCertsFilePicker = EricPathPicker(parent=self.tlsCertsFileWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tlsCertsFilePicker.sizePolicy().hasHeightForWidth())
+        self.tlsCertsFilePicker.setSizePolicy(sizePolicy)
+        self.tlsCertsFilePicker.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.tlsCertsFilePicker.setObjectName("tlsCertsFilePicker")
+        self.horizontalLayout_6.addWidget(self.tlsCertsFilePicker)
+        self.verticalLayout_4.addWidget(self.tlsCertsFileWidget)
+        self.tlsSelfSignedCertsButton = QtWidgets.QRadioButton(parent=self.tlsGroupBox)
+        self.tlsSelfSignedCertsButton.setObjectName("tlsSelfSignedCertsButton")
+        self.verticalLayout_4.addWidget(self.tlsSelfSignedCertsButton)
+        self.tlsSelfSignedFilesWidget = QtWidgets.QWidget(parent=self.tlsGroupBox)
+        self.tlsSelfSignedFilesWidget.setEnabled(False)
+        self.tlsSelfSignedFilesWidget.setObjectName("tlsSelfSignedFilesWidget")
+        self.gridLayout_5 = QtWidgets.QGridLayout(self.tlsSelfSignedFilesWidget)
+        self.gridLayout_5.setContentsMargins(0, 0, 0, 0)
+        self.gridLayout_5.setObjectName("gridLayout_5")
+        spacerItem7 = QtWidgets.QSpacerItem(25, 20, QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.gridLayout_5.addItem(spacerItem7, 0, 0, 1, 1)
+        self.label_9 = QtWidgets.QLabel(parent=self.tlsSelfSignedFilesWidget)
+        self.label_9.setObjectName("label_9")
+        self.gridLayout_5.addWidget(self.label_9, 0, 1, 1, 1)
+        self.tlsSelfSignedCertsFilePicker = EricPathPicker(parent=self.tlsSelfSignedFilesWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tlsSelfSignedCertsFilePicker.sizePolicy().hasHeightForWidth())
+        self.tlsSelfSignedCertsFilePicker.setSizePolicy(sizePolicy)
+        self.tlsSelfSignedCertsFilePicker.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.tlsSelfSignedCertsFilePicker.setObjectName("tlsSelfSignedCertsFilePicker")
+        self.gridLayout_5.addWidget(self.tlsSelfSignedCertsFilePicker, 0, 2, 1, 1)
+        self.label_10 = QtWidgets.QLabel(parent=self.tlsSelfSignedFilesWidget)
+        self.label_10.setObjectName("label_10")
+        self.gridLayout_5.addWidget(self.label_10, 1, 1, 1, 1)
+        self.tlsSelfSignedClientCertFilePicker = EricPathPicker(parent=self.tlsSelfSignedFilesWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tlsSelfSignedClientCertFilePicker.sizePolicy().hasHeightForWidth())
+        self.tlsSelfSignedClientCertFilePicker.setSizePolicy(sizePolicy)
+        self.tlsSelfSignedClientCertFilePicker.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.tlsSelfSignedClientCertFilePicker.setObjectName("tlsSelfSignedClientCertFilePicker")
+        self.gridLayout_5.addWidget(self.tlsSelfSignedClientCertFilePicker, 1, 2, 1, 1)
+        self.label_11 = QtWidgets.QLabel(parent=self.tlsSelfSignedFilesWidget)
+        self.label_11.setObjectName("label_11")
+        self.gridLayout_5.addWidget(self.label_11, 2, 1, 1, 1)
+        self.tlsSelfSignedClientKeyFilePicker = EricPathPicker(parent=self.tlsSelfSignedFilesWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.tlsSelfSignedClientKeyFilePicker.sizePolicy().hasHeightForWidth())
+        self.tlsSelfSignedClientKeyFilePicker.setSizePolicy(sizePolicy)
+        self.tlsSelfSignedClientKeyFilePicker.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.tlsSelfSignedClientKeyFilePicker.setObjectName("tlsSelfSignedClientKeyFilePicker")
+        self.gridLayout_5.addWidget(self.tlsSelfSignedClientKeyFilePicker, 2, 2, 1, 1)
+        self.verticalLayout_4.addWidget(self.tlsSelfSignedFilesWidget)
+        self.verticalLayout_5.addWidget(self.tlsGroupBox)
+        spacerItem8 = QtWidgets.QSpacerItem(20, 128, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.verticalLayout_5.addItem(spacerItem8)
+        self.profileTabWidget.addTab(self.tlsTab, "")
+        self.propertiesTab = QtWidgets.QWidget()
+        self.propertiesTab.setObjectName("propertiesTab")
+        self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.propertiesTab)
+        self.verticalLayout_6.setObjectName("verticalLayout_6")
+        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
+        self.connectPropertiesButton = QtWidgets.QRadioButton(parent=self.propertiesTab)
+        self.connectPropertiesButton.setChecked(True)
+        self.connectPropertiesButton.setObjectName("connectPropertiesButton")
+        self.horizontalLayout_8.addWidget(self.connectPropertiesButton)
+        self.disconnectPropertiesButton = QtWidgets.QRadioButton(parent=self.propertiesTab)
+        self.disconnectPropertiesButton.setObjectName("disconnectPropertiesButton")
+        self.horizontalLayout_8.addWidget(self.disconnectPropertiesButton)
+        self.verticalLayout_6.addLayout(self.horizontalLayout_8)
+        self.propertiesWidget = MqttUserPropertiesEditor(parent=self.propertiesTab)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.propertiesWidget.sizePolicy().hasHeightForWidth())
+        self.propertiesWidget.setSizePolicy(sizePolicy)
+        self.propertiesWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.propertiesWidget.setObjectName("propertiesWidget")
+        self.verticalLayout_6.addWidget(self.propertiesWidget)
+        self.samePropertiesCheckBox = QtWidgets.QCheckBox(parent=self.propertiesTab)
+        self.samePropertiesCheckBox.setObjectName("samePropertiesCheckBox")
+        self.verticalLayout_6.addWidget(self.samePropertiesCheckBox)
+        self.profileTabWidget.addTab(self.propertiesTab, "")
+        self.verticalLayout_3.addWidget(self.profileTabWidget)
+        self.profileButtonBox = QtWidgets.QDialogButtonBox(parent=self.profileFrame)
+        self.profileButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Apply|QtWidgets.QDialogButtonBox.StandardButton.Reset|QtWidgets.QDialogButtonBox.StandardButton.RestoreDefaults)
+        self.profileButtonBox.setObjectName("profileButtonBox")
+        self.verticalLayout_3.addWidget(self.profileButtonBox)
+        self.verticalLayout_2.addWidget(self.splitter)
+        self.buttonBox = QtWidgets.QDialogButtonBox(parent=MqttConnectionProfilesDialog)
+        self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
+        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
+        self.buttonBox.setObjectName("buttonBox")
+        self.verticalLayout_2.addWidget(self.buttonBox)
+
+        self.retranslateUi(MqttConnectionProfilesDialog)
+        self.profileTabWidget.setCurrentIndex(0)
+        self.buttonBox.accepted.connect(MqttConnectionProfilesDialog.accept) # type: ignore
+        self.buttonBox.rejected.connect(MqttConnectionProfilesDialog.reject) # type: ignore
+        self.tlsCertsFileButton.toggled['bool'].connect(self.tlsCertsFileWidget.setEnabled) # type: ignore
+        self.tlsSelfSignedCertsButton.toggled['bool'].connect(self.tlsSelfSignedFilesWidget.setEnabled) # type: ignore
+        QtCore.QMetaObject.connectSlotsByName(MqttConnectionProfilesDialog)
+        MqttConnectionProfilesDialog.setTabOrder(self.profilesList, self.plusButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.plusButton, self.copyButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.copyButton, self.minusButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.minusButton, self.profileEdit)
+        MqttConnectionProfilesDialog.setTabOrder(self.profileEdit, self.brokerAddressEdit)
+        MqttConnectionProfilesDialog.setTabOrder(self.brokerAddressEdit, self.brokerPortSpinBox)
+        MqttConnectionProfilesDialog.setTabOrder(self.brokerPortSpinBox, self.clientIdEdit)
+        MqttConnectionProfilesDialog.setTabOrder(self.clientIdEdit, self.generateIdButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.generateIdButton, self.profileTabWidget)
+        MqttConnectionProfilesDialog.setTabOrder(self.profileTabWidget, self.mqttv31Button)
+        MqttConnectionProfilesDialog.setTabOrder(self.mqttv31Button, self.mqttv311Button)
+        MqttConnectionProfilesDialog.setTabOrder(self.mqttv311Button, self.mqttv5Button)
+        MqttConnectionProfilesDialog.setTabOrder(self.mqttv5Button, self.connectionTimeoutSpinBox)
+        MqttConnectionProfilesDialog.setTabOrder(self.connectionTimeoutSpinBox, self.keepaliveSpinBox)
+        MqttConnectionProfilesDialog.setTabOrder(self.keepaliveSpinBox, self.cleanSessionCheckBox)
+        MqttConnectionProfilesDialog.setTabOrder(self.cleanSessionCheckBox, self.usernameEdit)
+        MqttConnectionProfilesDialog.setTabOrder(self.usernameEdit, self.passwordEdit)
+        MqttConnectionProfilesDialog.setTabOrder(self.passwordEdit, self.showPasswordButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.showPasswordButton, self.willTopicEdit)
+        MqttConnectionProfilesDialog.setTabOrder(self.willTopicEdit, self.willMessageEdit)
+        MqttConnectionProfilesDialog.setTabOrder(self.willMessageEdit, self.willQosSpinBox)
+        MqttConnectionProfilesDialog.setTabOrder(self.willQosSpinBox, self.willRetainCheckBox)
+        MqttConnectionProfilesDialog.setTabOrder(self.willRetainCheckBox, self.willPropertiesButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.willPropertiesButton, self.tlsGroupBox)
+        MqttConnectionProfilesDialog.setTabOrder(self.tlsGroupBox, self.tlsDefaultCertsButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.tlsDefaultCertsButton, self.tlsCertsFileButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.tlsCertsFileButton, self.tlsCertsFilePicker)
+        MqttConnectionProfilesDialog.setTabOrder(self.tlsCertsFilePicker, self.tlsSelfSignedCertsButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.tlsSelfSignedCertsButton, self.tlsSelfSignedCertsFilePicker)
+        MqttConnectionProfilesDialog.setTabOrder(self.tlsSelfSignedCertsFilePicker, self.tlsSelfSignedClientCertFilePicker)
+        MqttConnectionProfilesDialog.setTabOrder(self.tlsSelfSignedClientCertFilePicker, self.tlsSelfSignedClientKeyFilePicker)
+        MqttConnectionProfilesDialog.setTabOrder(self.tlsSelfSignedClientKeyFilePicker, self.connectPropertiesButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.connectPropertiesButton, self.disconnectPropertiesButton)
+        MqttConnectionProfilesDialog.setTabOrder(self.disconnectPropertiesButton, self.propertiesWidget)
+        MqttConnectionProfilesDialog.setTabOrder(self.propertiesWidget, self.samePropertiesCheckBox)
+
+    def retranslateUi(self, MqttConnectionProfilesDialog):
+        _translate = QtCore.QCoreApplication.translate
+        MqttConnectionProfilesDialog.setWindowTitle(_translate("MqttConnectionProfilesDialog", "MQTT Connection Profiles"))
+        self.profilesList.setSortingEnabled(True)
+        self.plusButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Press to add a new profile"))
+        self.copyButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Press to copy the selected profile"))
+        self.minusButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Press to delete the selected profile"))
+        self.label.setText(_translate("MqttConnectionProfilesDialog", "Profile Name:"))
+        self.label_2.setText(_translate("MqttConnectionProfilesDialog", "Broker Address:"))
+        self.brokerAddressEdit.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the broker server address"))
+        self.label_3.setText(_translate("MqttConnectionProfilesDialog", "Broker Port:"))
+        self.brokerPortSpinBox.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the broker port number (default 1883)"))
+        self.label_4.setText(_translate("MqttConnectionProfilesDialog", "Client ID:"))
+        self.clientIdEdit.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the ID string for this client"))
+        self.generateIdButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Press to generate a client ID"))
+        self.generateIdButton.setText(_translate("MqttConnectionProfilesDialog", "Generate"))
+        self.groupBox_5.setTitle(_translate("MqttConnectionProfilesDialog", "MQTT Protocol"))
+        self.mqttv31Button.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to use the MQTT 3.1 protocol"))
+        self.mqttv31Button.setText(_translate("MqttConnectionProfilesDialog", "v 3.1"))
+        self.mqttv311Button.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to use the MQTT 3.1.1 protocol"))
+        self.mqttv311Button.setText(_translate("MqttConnectionProfilesDialog", "v 3.1.1"))
+        self.mqttv5Button.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to use the MQTT 5.0 protocol"))
+        self.mqttv5Button.setText(_translate("MqttConnectionProfilesDialog", "v 5.0"))
+        self.label_12.setText(_translate("MqttConnectionProfilesDialog", "Connection Timeout:"))
+        self.connectionTimeoutSpinBox.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the connection timeout in seconds"))
+        self.connectionTimeoutSpinBox.setSuffix(_translate("MqttConnectionProfilesDialog", " s"))
+        self.label_5.setText(_translate("MqttConnectionProfilesDialog", "Keep Alive Interval:"))
+        self.keepaliveSpinBox.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the keep alive interval in seconds"))
+        self.keepaliveSpinBox.setSuffix(_translate("MqttConnectionProfilesDialog", " s"))
+        self.cleanSessionCheckBox.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to start with a clean session"))
+        self.cleanSessionCheckBox.setText(_translate("MqttConnectionProfilesDialog", "Clean Session"))
+        self.profileTabWidget.setTabText(self.profileTabWidget.indexOf(self.generalTab), _translate("MqttConnectionProfilesDialog", "General"))
+        self.label_7.setText(_translate("MqttConnectionProfilesDialog", "User Name:"))
+        self.usernameEdit.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the user name"))
+        self.label_6.setText(_translate("MqttConnectionProfilesDialog", "Password:"))
+        self.passwordEdit.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the password"))
+        self.showPasswordButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Toggle to show the password"))
+        self.profileTabWidget.setTabText(self.profileTabWidget.indexOf(self.credentialsTab), _translate("MqttConnectionProfilesDialog", "User Credentials"))
+        self.willTopicEdit.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the topic of the last will"))
+        self.label_13.setText(_translate("MqttConnectionProfilesDialog", "QoS:"))
+        self.willQosSpinBox.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the desired QoS value"))
+        self.willRetainCheckBox.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to retain the last will message"))
+        self.willRetainCheckBox.setText(_translate("MqttConnectionProfilesDialog", "Retain"))
+        self.willPropertiesButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Press to edit the user properties"))
+        self.willMessageEdit.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the last will message to be sent"))
+        self.profileTabWidget.setTabText(self.profileTabWidget.indexOf(self.lastWillTab), _translate("MqttConnectionProfilesDialog", "Last Will"))
+        self.tlsGroupBox.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to enable SSL/TLS connections"))
+        self.tlsGroupBox.setTitle(_translate("MqttConnectionProfilesDialog", "SSL/TLS Enabled"))
+        self.tlsDefaultCertsButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to use the default certificate file of the client"))
+        self.tlsDefaultCertsButton.setText(_translate("MqttConnectionProfilesDialog", "CA signed server certificate"))
+        self.tlsCertsFileButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to use a specific certificate file"))
+        self.tlsCertsFileButton.setText(_translate("MqttConnectionProfilesDialog", "CA certificate file"))
+        self.label_8.setText(_translate("MqttConnectionProfilesDialog", "CA File:"))
+        self.tlsCertsFilePicker.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the full path to the CA certificate file"))
+        self.tlsSelfSignedCertsButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to use a self signed client certificate"))
+        self.tlsSelfSignedCertsButton.setText(_translate("MqttConnectionProfilesDialog", "Self signed certificates"))
+        self.label_9.setText(_translate("MqttConnectionProfilesDialog", "CA File:"))
+        self.tlsSelfSignedCertsFilePicker.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the full path to the CA certificate file"))
+        self.label_10.setText(_translate("MqttConnectionProfilesDialog", "Client Certificate File:"))
+        self.tlsSelfSignedClientCertFilePicker.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the full path to the client certificate file"))
+        self.label_11.setText(_translate("MqttConnectionProfilesDialog", "Client Key File:"))
+        self.tlsSelfSignedClientKeyFilePicker.setToolTip(_translate("MqttConnectionProfilesDialog", "Enter the full path to the client key file"))
+        self.profileTabWidget.setTabText(self.profileTabWidget.indexOf(self.tlsTab), _translate("MqttConnectionProfilesDialog", "SSL/TLS"))
+        self.connectPropertiesButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to edit the CONNECT user properties"))
+        self.connectPropertiesButton.setText(_translate("MqttConnectionProfilesDialog", "CONNECT"))
+        self.disconnectPropertiesButton.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to edit the DISCONNECT user properties"))
+        self.disconnectPropertiesButton.setText(_translate("MqttConnectionProfilesDialog", "DISCONNECT"))
+        self.samePropertiesCheckBox.setToolTip(_translate("MqttConnectionProfilesDialog", "Select to use the CONNECT user properties when disconnecting"))
+        self.samePropertiesCheckBox.setText(_translate("MqttConnectionProfilesDialog", "Use CONNECT properties for DISCONNECT"))
+        self.profileTabWidget.setTabText(self.profileTabWidget.indexOf(self.propertiesTab), _translate("MqttConnectionProfilesDialog", "User Properties"))
+from MqttMonitor.MqttUserPropertiesEditor import MqttUserPropertiesEditor
+from eric7.EricWidgets.EricPathPicker import EricPathPicker
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MqttMonitor/Ui_MqttMonitorWidget.py	Thu Aug 01 11:30:50 2024 +0200
@@ -0,0 +1,938 @@
+# Form implementation generated from reading ui file 'MqttMonitor/MqttMonitorWidget.ui'
+#
+# Created by: PyQt6 UI code generator 6.7.1
+#
+# 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 PyQt6 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MqttMonitorWidget(object):
+    def setupUi(self, MqttMonitorWidget):
+        MqttMonitorWidget.setObjectName("MqttMonitorWidget")
+        MqttMonitorWidget.resize(400, 600)
+        self.verticalLayout = QtWidgets.QVBoxLayout(MqttMonitorWidget)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.pixmapLabel = QtWidgets.QLabel(parent=MqttMonitorWidget)
+        self.pixmapLabel.setObjectName("pixmapLabel")
+        self.horizontalLayout.addWidget(self.pixmapLabel)
+        self.label_2 = QtWidgets.QLabel(parent=MqttMonitorWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
+        self.label_2.setSizePolicy(sizePolicy)
+        self.label_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
+        self.label_2.setObjectName("label_2")
+        self.horizontalLayout.addWidget(self.label_2)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.brokerGroupBox = QtWidgets.QGroupBox(parent=MqttMonitorWidget)
+        self.brokerGroupBox.setObjectName("brokerGroupBox")
+        self.gridLayout = QtWidgets.QGridLayout(self.brokerGroupBox)
+        self.gridLayout.setObjectName("gridLayout")
+        self.modeButton = QtWidgets.QToolButton(parent=self.brokerGroupBox)
+        self.modeButton.setObjectName("modeButton")
+        self.gridLayout.addWidget(self.modeButton, 0, 0, 1, 1)
+        self.horizontalLayout_15 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_15.setSpacing(0)
+        self.horizontalLayout_15.setObjectName("horizontalLayout_15")
+        self.profileComboBox = QtWidgets.QComboBox(parent=self.brokerGroupBox)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.profileComboBox.sizePolicy().hasHeightForWidth())
+        self.profileComboBox.setSizePolicy(sizePolicy)
+        self.profileComboBox.setObjectName("profileComboBox")
+        self.horizontalLayout_15.addWidget(self.profileComboBox)
+        self.brokerConnectionWidget = QtWidgets.QWidget(parent=self.brokerGroupBox)
+        self.brokerConnectionWidget.setObjectName("brokerConnectionWidget")
+        self.horizontalLayout_14 = QtWidgets.QHBoxLayout(self.brokerConnectionWidget)
+        self.horizontalLayout_14.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout_14.setObjectName("horizontalLayout_14")
+        self.brokerComboBox = QtWidgets.QComboBox(parent=self.brokerConnectionWidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.brokerComboBox.sizePolicy().hasHeightForWidth())
+        self.brokerComboBox.setSizePolicy(sizePolicy)
+        self.brokerComboBox.setEditable(True)
+        self.brokerComboBox.setObjectName("brokerComboBox")
+        self.horizontalLayout_14.addWidget(self.brokerComboBox)
+        self.brokerPortComboBox = QtWidgets.QComboBox(parent=self.brokerConnectionWidget)
+        self.brokerPortComboBox.setEditable(True)
+        self.brokerPortComboBox.setSizeAdjustPolicy(QtWidgets.QComboBox.SizeAdjustPolicy.AdjustToContents)
+        self.brokerPortComboBox.setObjectName("brokerPortComboBox")
+        self.horizontalLayout_14.addWidget(self.brokerPortComboBox)
+        self.horizontalLayout_15.addWidget(self.brokerConnectionWidget)
+        self.gridLayout.addLayout(self.horizontalLayout_15, 0, 1, 1, 1)
+        self.horizontalLayout_19 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_19.setSpacing(0)
+        self.horizontalLayout_19.setObjectName("horizontalLayout_19")
+        self.brokerConnectionOptionsButton = QtWidgets.QToolButton(parent=self.brokerGroupBox)
+        self.brokerConnectionOptionsButton.setObjectName("brokerConnectionOptionsButton")
+        self.horizontalLayout_19.addWidget(self.brokerConnectionOptionsButton)
+        self.connectButton = QtWidgets.QToolButton(parent=self.brokerGroupBox)
+        self.connectButton.setText("")
+        self.connectButton.setObjectName("connectButton")
+        self.horizontalLayout_19.addWidget(self.connectButton)
+        self.clearWillButton = QtWidgets.QToolButton(parent=self.brokerGroupBox)
+        self.clearWillButton.setText("")
+        self.clearWillButton.setCheckable(True)
+        self.clearWillButton.setObjectName("clearWillButton")
+        self.horizontalLayout_19.addWidget(self.clearWillButton)
+        self.gridLayout.addLayout(self.horizontalLayout_19, 0, 2, 1, 1)
+        self.brokerStatusLabel = QtWidgets.QLabel(parent=self.brokerGroupBox)
+        self.brokerStatusLabel.setWordWrap(True)
+        self.brokerStatusLabel.setObjectName("brokerStatusLabel")
+        self.gridLayout.addWidget(self.brokerStatusLabel, 1, 0, 1, 3)
+        self.verticalLayout.addWidget(self.brokerGroupBox)
+        self.brokerWidget = QtWidgets.QTabWidget(parent=MqttMonitorWidget)
+        self.brokerWidget.setObjectName("brokerWidget")
+        self.pubSubTab = QtWidgets.QWidget()
+        self.pubSubTab.setObjectName("pubSubTab")
+        self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.pubSubTab)
+        self.verticalLayout_7.setObjectName("verticalLayout_7")
+        self.subscribeGroup = QtWidgets.QGroupBox(parent=self.pubSubTab)
+        self.subscribeGroup.setEnabled(False)
+        self.subscribeGroup.setObjectName("subscribeGroup")
+        self.horizontalLayout_20 = QtWidgets.QHBoxLayout(self.subscribeGroup)
+        self.horizontalLayout_20.setObjectName("horizontalLayout_20")
+        self.label = QtWidgets.QLabel(parent=self.subscribeGroup)
+        self.label.setObjectName("label")
+        self.horizontalLayout_20.addWidget(self.label)
+        self.subscribeTopicComboBox = QtWidgets.QComboBox(parent=self.subscribeGroup)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.subscribeTopicComboBox.sizePolicy().hasHeightForWidth())
+        self.subscribeTopicComboBox.setSizePolicy(sizePolicy)
+        self.subscribeTopicComboBox.setEditable(True)
+        self.subscribeTopicComboBox.setObjectName("subscribeTopicComboBox")
+        self.horizontalLayout_20.addWidget(self.subscribeTopicComboBox)
+        self.label_3 = QtWidgets.QLabel(parent=self.subscribeGroup)
+        self.label_3.setObjectName("label_3")
+        self.horizontalLayout_20.addWidget(self.label_3)
+        self.subscribeQosSpinBox = QtWidgets.QSpinBox(parent=self.subscribeGroup)
+        self.subscribeQosSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.subscribeQosSpinBox.setMaximum(2)
+        self.subscribeQosSpinBox.setObjectName("subscribeQosSpinBox")
+        self.horizontalLayout_20.addWidget(self.subscribeQosSpinBox)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setSpacing(0)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.subscribeButton = QtWidgets.QToolButton(parent=self.subscribeGroup)
+        self.subscribeButton.setObjectName("subscribeButton")
+        self.horizontalLayout_2.addWidget(self.subscribeButton)
+        self.subscribePropertiesButton = QtWidgets.QToolButton(parent=self.subscribeGroup)
+        self.subscribePropertiesButton.setText("")
+        self.subscribePropertiesButton.setObjectName("subscribePropertiesButton")
+        self.horizontalLayout_2.addWidget(self.subscribePropertiesButton)
+        self.horizontalLayout_20.addLayout(self.horizontalLayout_2)
+        self.verticalLayout_7.addWidget(self.subscribeGroup)
+        self.unsubscribeGroup = QtWidgets.QGroupBox(parent=self.pubSubTab)
+        self.unsubscribeGroup.setEnabled(False)
+        self.unsubscribeGroup.setObjectName("unsubscribeGroup")
+        self.horizontalLayout_21 = QtWidgets.QHBoxLayout(self.unsubscribeGroup)
+        self.horizontalLayout_21.setObjectName("horizontalLayout_21")
+        self.label_4 = QtWidgets.QLabel(parent=self.unsubscribeGroup)
+        self.label_4.setObjectName("label_4")
+        self.horizontalLayout_21.addWidget(self.label_4)
+        self.unsubscribeTopicComboBox = QtWidgets.QComboBox(parent=self.unsubscribeGroup)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.unsubscribeTopicComboBox.sizePolicy().hasHeightForWidth())
+        self.unsubscribeTopicComboBox.setSizePolicy(sizePolicy)
+        self.unsubscribeTopicComboBox.setObjectName("unsubscribeTopicComboBox")
+        self.horizontalLayout_21.addWidget(self.unsubscribeTopicComboBox)
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setSpacing(0)
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.unsubscribeButton = QtWidgets.QToolButton(parent=self.unsubscribeGroup)
+        self.unsubscribeButton.setObjectName("unsubscribeButton")
+        self.horizontalLayout_3.addWidget(self.unsubscribeButton)
+        self.unsubscribePropertiesButton = QtWidgets.QToolButton(parent=self.unsubscribeGroup)
+        self.unsubscribePropertiesButton.setText("")
+        self.unsubscribePropertiesButton.setObjectName("unsubscribePropertiesButton")
+        self.horizontalLayout_3.addWidget(self.unsubscribePropertiesButton)
+        self.horizontalLayout_21.addLayout(self.horizontalLayout_3)
+        self.verticalLayout_7.addWidget(self.unsubscribeGroup)
+        self.publishGroup = QtWidgets.QGroupBox(parent=self.pubSubTab)
+        self.publishGroup.setEnabled(False)
+        self.publishGroup.setObjectName("publishGroup")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.publishGroup)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.horizontalLayout_13 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_13.setObjectName("horizontalLayout_13")
+        self.label_39 = QtWidgets.QLabel(parent=self.publishGroup)
+        self.label_39.setObjectName("label_39")
+        self.horizontalLayout_13.addWidget(self.label_39)
+        self.publishTopicComboBox = QtWidgets.QComboBox(parent=self.publishGroup)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.publishTopicComboBox.sizePolicy().hasHeightForWidth())
+        self.publishTopicComboBox.setSizePolicy(sizePolicy)
+        self.publishTopicComboBox.setEditable(True)
+        self.publishTopicComboBox.setObjectName("publishTopicComboBox")
+        self.horizontalLayout_13.addWidget(self.publishTopicComboBox)
+        self.label_40 = QtWidgets.QLabel(parent=self.publishGroup)
+        self.label_40.setObjectName("label_40")
+        self.horizontalLayout_13.addWidget(self.label_40)
+        self.publishQosSpinBox = QtWidgets.QSpinBox(parent=self.publishGroup)
+        self.publishQosSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.publishQosSpinBox.setMaximum(2)
+        self.publishQosSpinBox.setObjectName("publishQosSpinBox")
+        self.horizontalLayout_13.addWidget(self.publishQosSpinBox)
+        self.publishRetainCheckBox = QtWidgets.QCheckBox(parent=self.publishGroup)
+        self.publishRetainCheckBox.setObjectName("publishRetainCheckBox")
+        self.horizontalLayout_13.addWidget(self.publishRetainCheckBox)
+        self.publishPropertiesButton = QtWidgets.QToolButton(parent=self.publishGroup)
+        self.publishPropertiesButton.setText("")
+        self.publishPropertiesButton.setObjectName("publishPropertiesButton")
+        self.horizontalLayout_13.addWidget(self.publishPropertiesButton)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_13)
+        self.publishPayloadEdit = QtWidgets.QPlainTextEdit(parent=self.publishGroup)
+        self.publishPayloadEdit.setMaximumSize(QtCore.QSize(16777215, 300))
+        self.publishPayloadEdit.setTabChangesFocus(True)
+        self.publishPayloadEdit.setObjectName("publishPayloadEdit")
+        self.verticalLayout_2.addWidget(self.publishPayloadEdit)
+        self.horizontalLayout_18 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_18.setObjectName("horizontalLayout_18")
+        self.label_42 = QtWidgets.QLabel(parent=self.publishGroup)
+        self.label_42.setObjectName("label_42")
+        self.horizontalLayout_18.addWidget(self.label_42)
+        self.publishPayloadFilePicker = EricPathPicker(parent=self.publishGroup)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.publishPayloadFilePicker.sizePolicy().hasHeightForWidth())
+        self.publishPayloadFilePicker.setSizePolicy(sizePolicy)
+        self.publishPayloadFilePicker.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
+        self.publishPayloadFilePicker.setObjectName("publishPayloadFilePicker")
+        self.horizontalLayout_18.addWidget(self.publishPayloadFilePicker)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_18)
+        self.horizontalLayout_12 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_12.setObjectName("horizontalLayout_12")
+        self.publishClearButton = QtWidgets.QPushButton(parent=self.publishGroup)
+        self.publishClearButton.setObjectName("publishClearButton")
+        self.horizontalLayout_12.addWidget(self.publishClearButton)
+        self.publishClearRetainedButton = QtWidgets.QPushButton(parent=self.publishGroup)
+        self.publishClearRetainedButton.setObjectName("publishClearRetainedButton")
+        self.horizontalLayout_12.addWidget(self.publishClearRetainedButton)
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_12.addItem(spacerItem)
+        self.publishButton = QtWidgets.QPushButton(parent=self.publishGroup)
+        self.publishButton.setObjectName("publishButton")
+        self.horizontalLayout_12.addWidget(self.publishButton)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_12)
+        self.clearPublishCheckBox = QtWidgets.QCheckBox(parent=self.publishGroup)
+        self.clearPublishCheckBox.setObjectName("clearPublishCheckBox")
+        self.verticalLayout_2.addWidget(self.clearPublishCheckBox)
+        self.verticalLayout_7.addWidget(self.publishGroup)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 13, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.verticalLayout_7.addItem(spacerItem1)
+        self.brokerWidget.addTab(self.pubSubTab, "")
+        self.propertiesTab = QtWidgets.QWidget()
+        self.propertiesTab.setObjectName("propertiesTab")
+        self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.propertiesTab)
+        self.verticalLayout_5.setObjectName("verticalLayout_5")
+        self.label_43 = QtWidgets.QLabel(parent=self.propertiesTab)
+        self.label_43.setObjectName("label_43")
+        self.verticalLayout_5.addWidget(self.label_43)
+        self.propertiesEdit = QtWidgets.QPlainTextEdit(parent=self.propertiesTab)
+        self.propertiesEdit.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
+        self.propertiesEdit.setTabChangesFocus(True)
+        self.propertiesEdit.setLineWrapMode(QtWidgets.QPlainTextEdit.LineWrapMode.NoWrap)
+        self.propertiesEdit.setReadOnly(True)
+        self.propertiesEdit.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.TextSelectableByKeyboard|QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
+        self.propertiesEdit.setObjectName("propertiesEdit")
+        self.verticalLayout_5.addWidget(self.propertiesEdit)
+        self.brokerWidget.addTab(self.propertiesTab, "")
+        self.messagesTab = QtWidgets.QWidget()
+        self.messagesTab.setObjectName("messagesTab")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.messagesTab)
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.messagesSearchWidget = EricTextEditSearchWidget(parent=self.messagesTab)
+        self.messagesSearchWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.WheelFocus)
+        self.messagesSearchWidget.setObjectName("messagesSearchWidget")
+        self.verticalLayout_3.addWidget(self.messagesSearchWidget)
+        self.messagesEdit = QtWidgets.QPlainTextEdit(parent=self.messagesTab)
+        self.messagesEdit.setTabChangesFocus(True)
+        self.messagesEdit.setLineWrapMode(QtWidgets.QPlainTextEdit.LineWrapMode.NoWrap)
+        self.messagesEdit.setReadOnly(True)
+        self.messagesEdit.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.TextSelectableByKeyboard|QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
+        self.messagesEdit.setObjectName("messagesEdit")
+        self.verticalLayout_3.addWidget(self.messagesEdit)
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        self.saveMessagesButton = QtWidgets.QPushButton(parent=self.messagesTab)
+        self.saveMessagesButton.setEnabled(False)
+        self.saveMessagesButton.setObjectName("saveMessagesButton")
+        self.horizontalLayout_4.addWidget(self.saveMessagesButton)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_4.addItem(spacerItem2)
+        self.clearMessagesButton = QtWidgets.QPushButton(parent=self.messagesTab)
+        self.clearMessagesButton.setEnabled(False)
+        self.clearMessagesButton.setObjectName("clearMessagesButton")
+        self.horizontalLayout_4.addWidget(self.clearMessagesButton)
+        self.verticalLayout_3.addLayout(self.horizontalLayout_4)
+        self.followMessagesCheckBox = QtWidgets.QCheckBox(parent=self.messagesTab)
+        self.followMessagesCheckBox.setChecked(True)
+        self.followMessagesCheckBox.setObjectName("followMessagesCheckBox")
+        self.verticalLayout_3.addWidget(self.followMessagesCheckBox)
+        self.brokerWidget.addTab(self.messagesTab, "")
+        self.statusTab = QtWidgets.QWidget()
+        self.statusTab.setObjectName("statusTab")
+        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.statusTab)
+        self.verticalLayout_4.setObjectName("verticalLayout_4")
+        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
+        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_5.addItem(spacerItem3)
+        self.brokerStatusButton = QtWidgets.QPushButton(parent=self.statusTab)
+        self.brokerStatusButton.setEnabled(False)
+        self.brokerStatusButton.setObjectName("brokerStatusButton")
+        self.horizontalLayout_5.addWidget(self.brokerStatusButton)
+        self.verticalLayout_4.addLayout(self.horizontalLayout_5)
+        self.scrollArea = QtWidgets.QScrollArea(parent=self.statusTab)
+        self.scrollArea.setWidgetResizable(True)
+        self.scrollArea.setObjectName("scrollArea")
+        self.scrollAreaWidgetContents = QtWidgets.QWidget()
+        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 203, 840))
+        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
+        self.formLayout = QtWidgets.QFormLayout(self.scrollAreaWidgetContents)
+        self.formLayout.setLabelAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter)
+        self.formLayout.setObjectName("formLayout")
+        self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
+        self.label_22 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_22.setObjectName("label_22")
+        self.horizontalLayout_7.addWidget(self.label_22)
+        self.line_2 = QtWidgets.QFrame(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.line_2.sizePolicy().hasHeightForWidth())
+        self.line_2.setSizePolicy(sizePolicy)
+        self.line_2.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line_2.setObjectName("line_2")
+        self.horizontalLayout_7.addWidget(self.line_2)
+        self.formLayout.setLayout(0, QtWidgets.QFormLayout.ItemRole.SpanningRole, self.horizontalLayout_7)
+        self.label_5 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_5.setObjectName("label_5")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_5)
+        self.versionLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.versionLabel.sizePolicy().hasHeightForWidth())
+        self.versionLabel.setSizePolicy(sizePolicy)
+        self.versionLabel.setObjectName("versionLabel")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.versionLabel)
+        self.label_6 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_6.setObjectName("label_6")
+        self.formLayout.setWidget(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_6)
+        self.timestampLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.timestampLabel.sizePolicy().hasHeightForWidth())
+        self.timestampLabel.setSizePolicy(sizePolicy)
+        self.timestampLabel.setObjectName("timestampLabel")
+        self.formLayout.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.timestampLabel)
+        self.label_7 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_7.setObjectName("label_7")
+        self.formLayout.setWidget(3, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_7)
+        self.uptimeLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.uptimeLabel.sizePolicy().hasHeightForWidth())
+        self.uptimeLabel.setSizePolicy(sizePolicy)
+        self.uptimeLabel.setObjectName("uptimeLabel")
+        self.formLayout.setWidget(3, QtWidgets.QFormLayout.ItemRole.FieldRole, self.uptimeLabel)
+        self.label_8 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_8.setObjectName("label_8")
+        self.formLayout.setWidget(4, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_8)
+        self.subscriptionsLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.subscriptionsLabel.sizePolicy().hasHeightForWidth())
+        self.subscriptionsLabel.setSizePolicy(sizePolicy)
+        self.subscriptionsLabel.setObjectName("subscriptionsLabel")
+        self.formLayout.setWidget(4, QtWidgets.QFormLayout.ItemRole.FieldRole, self.subscriptionsLabel)
+        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
+        self.label_23 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_23.setObjectName("label_23")
+        self.horizontalLayout_8.addWidget(self.label_23)
+        self.line_3 = QtWidgets.QFrame(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.line_3.sizePolicy().hasHeightForWidth())
+        self.line_3.setSizePolicy(sizePolicy)
+        self.line_3.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line_3.setObjectName("line_3")
+        self.horizontalLayout_8.addWidget(self.line_3)
+        self.formLayout.setLayout(5, QtWidgets.QFormLayout.ItemRole.SpanningRole, self.horizontalLayout_8)
+        self.label_9 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_9.setObjectName("label_9")
+        self.formLayout.setWidget(6, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_9)
+        self.clientsConnectedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.clientsConnectedLabel.sizePolicy().hasHeightForWidth())
+        self.clientsConnectedLabel.setSizePolicy(sizePolicy)
+        self.clientsConnectedLabel.setObjectName("clientsConnectedLabel")
+        self.formLayout.setWidget(6, QtWidgets.QFormLayout.ItemRole.FieldRole, self.clientsConnectedLabel)
+        self.label_10 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_10.setObjectName("label_10")
+        self.formLayout.setWidget(7, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_10)
+        self.clientsDisconnectedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.clientsDisconnectedLabel.sizePolicy().hasHeightForWidth())
+        self.clientsDisconnectedLabel.setSizePolicy(sizePolicy)
+        self.clientsDisconnectedLabel.setObjectName("clientsDisconnectedLabel")
+        self.formLayout.setWidget(7, QtWidgets.QFormLayout.ItemRole.FieldRole, self.clientsDisconnectedLabel)
+        self.label_11 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_11.setObjectName("label_11")
+        self.formLayout.setWidget(8, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_11)
+        self.clientsExpiredLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.clientsExpiredLabel.sizePolicy().hasHeightForWidth())
+        self.clientsExpiredLabel.setSizePolicy(sizePolicy)
+        self.clientsExpiredLabel.setObjectName("clientsExpiredLabel")
+        self.formLayout.setWidget(8, QtWidgets.QFormLayout.ItemRole.FieldRole, self.clientsExpiredLabel)
+        self.label_12 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_12.setObjectName("label_12")
+        self.formLayout.setWidget(9, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_12)
+        self.clientsMaximumLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.clientsMaximumLabel.sizePolicy().hasHeightForWidth())
+        self.clientsMaximumLabel.setSizePolicy(sizePolicy)
+        self.clientsMaximumLabel.setObjectName("clientsMaximumLabel")
+        self.formLayout.setWidget(9, QtWidgets.QFormLayout.ItemRole.FieldRole, self.clientsMaximumLabel)
+        self.label_13 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_13.setObjectName("label_13")
+        self.formLayout.setWidget(10, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_13)
+        self.clientsTotalLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.clientsTotalLabel.sizePolicy().hasHeightForWidth())
+        self.clientsTotalLabel.setSizePolicy(sizePolicy)
+        self.clientsTotalLabel.setObjectName("clientsTotalLabel")
+        self.formLayout.setWidget(10, QtWidgets.QFormLayout.ItemRole.FieldRole, self.clientsTotalLabel)
+        self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_9.setObjectName("horizontalLayout_9")
+        self.label_24 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_24.setObjectName("label_24")
+        self.horizontalLayout_9.addWidget(self.label_24)
+        self.line_4 = QtWidgets.QFrame(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.line_4.sizePolicy().hasHeightForWidth())
+        self.line_4.setSizePolicy(sizePolicy)
+        self.line_4.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line_4.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line_4.setObjectName("line_4")
+        self.horizontalLayout_9.addWidget(self.line_4)
+        self.formLayout.setLayout(11, QtWidgets.QFormLayout.ItemRole.SpanningRole, self.horizontalLayout_9)
+        self.label_14 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_14.setObjectName("label_14")
+        self.formLayout.setWidget(12, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_14)
+        self.messagesSentLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.messagesSentLabel.sizePolicy().hasHeightForWidth())
+        self.messagesSentLabel.setSizePolicy(sizePolicy)
+        self.messagesSentLabel.setObjectName("messagesSentLabel")
+        self.formLayout.setWidget(12, QtWidgets.QFormLayout.ItemRole.FieldRole, self.messagesSentLabel)
+        self.label_15 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_15.setObjectName("label_15")
+        self.formLayout.setWidget(13, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_15)
+        self.messagesReceivedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.messagesReceivedLabel.sizePolicy().hasHeightForWidth())
+        self.messagesReceivedLabel.setSizePolicy(sizePolicy)
+        self.messagesReceivedLabel.setObjectName("messagesReceivedLabel")
+        self.formLayout.setWidget(13, QtWidgets.QFormLayout.ItemRole.FieldRole, self.messagesReceivedLabel)
+        self.label_16 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_16.setObjectName("label_16")
+        self.formLayout.setWidget(14, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_16)
+        self.messagesStoredLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.messagesStoredLabel.sizePolicy().hasHeightForWidth())
+        self.messagesStoredLabel.setSizePolicy(sizePolicy)
+        self.messagesStoredLabel.setObjectName("messagesStoredLabel")
+        self.formLayout.setWidget(14, QtWidgets.QFormLayout.ItemRole.FieldRole, self.messagesStoredLabel)
+        self.label_17 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_17.setObjectName("label_17")
+        self.formLayout.setWidget(15, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_17)
+        self.messagesInflightLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.messagesInflightLabel.sizePolicy().hasHeightForWidth())
+        self.messagesInflightLabel.setSizePolicy(sizePolicy)
+        self.messagesInflightLabel.setObjectName("messagesInflightLabel")
+        self.formLayout.setWidget(15, QtWidgets.QFormLayout.ItemRole.FieldRole, self.messagesInflightLabel)
+        self.label_18 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_18.setObjectName("label_18")
+        self.formLayout.setWidget(16, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_18)
+        self.messagesRetainedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.messagesRetainedLabel.sizePolicy().hasHeightForWidth())
+        self.messagesRetainedLabel.setSizePolicy(sizePolicy)
+        self.messagesRetainedLabel.setObjectName("messagesRetainedLabel")
+        self.formLayout.setWidget(16, QtWidgets.QFormLayout.ItemRole.FieldRole, self.messagesRetainedLabel)
+        self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_10.setObjectName("horizontalLayout_10")
+        self.label_28 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_28.setObjectName("label_28")
+        self.horizontalLayout_10.addWidget(self.label_28)
+        self.line_5 = QtWidgets.QFrame(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.line_5.sizePolicy().hasHeightForWidth())
+        self.line_5.setSizePolicy(sizePolicy)
+        self.line_5.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line_5.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line_5.setObjectName("line_5")
+        self.horizontalLayout_10.addWidget(self.line_5)
+        self.formLayout.setLayout(17, QtWidgets.QFormLayout.ItemRole.SpanningRole, self.horizontalLayout_10)
+        self.label_25 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_25.setObjectName("label_25")
+        self.formLayout.setWidget(18, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_25)
+        self.publishMessagesSentLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.publishMessagesSentLabel.sizePolicy().hasHeightForWidth())
+        self.publishMessagesSentLabel.setSizePolicy(sizePolicy)
+        self.publishMessagesSentLabel.setObjectName("publishMessagesSentLabel")
+        self.formLayout.setWidget(18, QtWidgets.QFormLayout.ItemRole.FieldRole, self.publishMessagesSentLabel)
+        self.label_26 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_26.setObjectName("label_26")
+        self.formLayout.setWidget(19, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_26)
+        self.publishMessagesReceivedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.publishMessagesReceivedLabel.sizePolicy().hasHeightForWidth())
+        self.publishMessagesReceivedLabel.setSizePolicy(sizePolicy)
+        self.publishMessagesReceivedLabel.setObjectName("publishMessagesReceivedLabel")
+        self.formLayout.setWidget(19, QtWidgets.QFormLayout.ItemRole.FieldRole, self.publishMessagesReceivedLabel)
+        self.label_27 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_27.setObjectName("label_27")
+        self.formLayout.setWidget(20, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_27)
+        self.publishMessagesDroppedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.publishMessagesDroppedLabel.sizePolicy().hasHeightForWidth())
+        self.publishMessagesDroppedLabel.setSizePolicy(sizePolicy)
+        self.publishMessagesDroppedLabel.setObjectName("publishMessagesDroppedLabel")
+        self.formLayout.setWidget(20, QtWidgets.QFormLayout.ItemRole.FieldRole, self.publishMessagesDroppedLabel)
+        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
+        self.label_21 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_21.setObjectName("label_21")
+        self.horizontalLayout_6.addWidget(self.label_21)
+        self.line = QtWidgets.QFrame(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.line.sizePolicy().hasHeightForWidth())
+        self.line.setSizePolicy(sizePolicy)
+        self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line.setObjectName("line")
+        self.horizontalLayout_6.addWidget(self.line)
+        self.formLayout.setLayout(21, QtWidgets.QFormLayout.ItemRole.SpanningRole, self.horizontalLayout_6)
+        self.label_19 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_19.setObjectName("label_19")
+        self.formLayout.setWidget(22, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_19)
+        self.bytesSentLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.bytesSentLabel.sizePolicy().hasHeightForWidth())
+        self.bytesSentLabel.setSizePolicy(sizePolicy)
+        self.bytesSentLabel.setObjectName("bytesSentLabel")
+        self.formLayout.setWidget(22, QtWidgets.QFormLayout.ItemRole.FieldRole, self.bytesSentLabel)
+        self.label_20 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_20.setObjectName("label_20")
+        self.formLayout.setWidget(23, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_20)
+        self.bytesReceivedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.bytesReceivedLabel.sizePolicy().hasHeightForWidth())
+        self.bytesReceivedLabel.setSizePolicy(sizePolicy)
+        self.bytesReceivedLabel.setObjectName("bytesReceivedLabel")
+        self.formLayout.setWidget(23, QtWidgets.QFormLayout.ItemRole.FieldRole, self.bytesReceivedLabel)
+        self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_11.setObjectName("horizontalLayout_11")
+        self.label_29 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_29.setObjectName("label_29")
+        self.horizontalLayout_11.addWidget(self.label_29)
+        self.line_6 = QtWidgets.QFrame(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.line_6.sizePolicy().hasHeightForWidth())
+        self.line_6.setSizePolicy(sizePolicy)
+        self.line_6.setFrameShape(QtWidgets.QFrame.Shape.HLine)
+        self.line_6.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
+        self.line_6.setObjectName("line_6")
+        self.horizontalLayout_11.addWidget(self.line_6)
+        self.formLayout.setLayout(24, QtWidgets.QFormLayout.ItemRole.SpanningRole, self.horizontalLayout_11)
+        self.label_30 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_30.setObjectName("label_30")
+        self.formLayout.setWidget(25, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_30)
+        self.loadBytesSentLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.loadBytesSentLabel.sizePolicy().hasHeightForWidth())
+        self.loadBytesSentLabel.setSizePolicy(sizePolicy)
+        self.loadBytesSentLabel.setObjectName("loadBytesSentLabel")
+        self.formLayout.setWidget(25, QtWidgets.QFormLayout.ItemRole.FieldRole, self.loadBytesSentLabel)
+        self.label_31 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_31.setObjectName("label_31")
+        self.formLayout.setWidget(26, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_31)
+        self.loadBytesReceivedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.loadBytesReceivedLabel.sizePolicy().hasHeightForWidth())
+        self.loadBytesReceivedLabel.setSizePolicy(sizePolicy)
+        self.loadBytesReceivedLabel.setObjectName("loadBytesReceivedLabel")
+        self.formLayout.setWidget(26, QtWidgets.QFormLayout.ItemRole.FieldRole, self.loadBytesReceivedLabel)
+        self.label_32 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_32.setObjectName("label_32")
+        self.formLayout.setWidget(27, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_32)
+        self.loadMessagesSentLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.loadMessagesSentLabel.sizePolicy().hasHeightForWidth())
+        self.loadMessagesSentLabel.setSizePolicy(sizePolicy)
+        self.loadMessagesSentLabel.setObjectName("loadMessagesSentLabel")
+        self.formLayout.setWidget(27, QtWidgets.QFormLayout.ItemRole.FieldRole, self.loadMessagesSentLabel)
+        self.label_33 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_33.setObjectName("label_33")
+        self.formLayout.setWidget(28, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_33)
+        self.loadMessagesReceivedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.loadMessagesReceivedLabel.sizePolicy().hasHeightForWidth())
+        self.loadMessagesReceivedLabel.setSizePolicy(sizePolicy)
+        self.loadMessagesReceivedLabel.setObjectName("loadMessagesReceivedLabel")
+        self.formLayout.setWidget(28, QtWidgets.QFormLayout.ItemRole.FieldRole, self.loadMessagesReceivedLabel)
+        self.label_34 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_34.setObjectName("label_34")
+        self.formLayout.setWidget(29, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_34)
+        self.loadPublishSentLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.loadPublishSentLabel.sizePolicy().hasHeightForWidth())
+        self.loadPublishSentLabel.setSizePolicy(sizePolicy)
+        self.loadPublishSentLabel.setObjectName("loadPublishSentLabel")
+        self.formLayout.setWidget(29, QtWidgets.QFormLayout.ItemRole.FieldRole, self.loadPublishSentLabel)
+        self.label_35 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_35.setObjectName("label_35")
+        self.formLayout.setWidget(30, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_35)
+        self.loadPublishReceivedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.loadPublishReceivedLabel.sizePolicy().hasHeightForWidth())
+        self.loadPublishReceivedLabel.setSizePolicy(sizePolicy)
+        self.loadPublishReceivedLabel.setObjectName("loadPublishReceivedLabel")
+        self.formLayout.setWidget(30, QtWidgets.QFormLayout.ItemRole.FieldRole, self.loadPublishReceivedLabel)
+        self.label_36 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_36.setObjectName("label_36")
+        self.formLayout.setWidget(31, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_36)
+        self.loadPublishDroppedLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.loadPublishDroppedLabel.sizePolicy().hasHeightForWidth())
+        self.loadPublishDroppedLabel.setSizePolicy(sizePolicy)
+        self.loadPublishDroppedLabel.setObjectName("loadPublishDroppedLabel")
+        self.formLayout.setWidget(31, QtWidgets.QFormLayout.ItemRole.FieldRole, self.loadPublishDroppedLabel)
+        self.label_37 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_37.setObjectName("label_37")
+        self.formLayout.setWidget(32, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_37)
+        self.loadConnectionsLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.loadConnectionsLabel.sizePolicy().hasHeightForWidth())
+        self.loadConnectionsLabel.setSizePolicy(sizePolicy)
+        self.loadConnectionsLabel.setObjectName("loadConnectionsLabel")
+        self.formLayout.setWidget(32, QtWidgets.QFormLayout.ItemRole.FieldRole, self.loadConnectionsLabel)
+        self.label_38 = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        self.label_38.setObjectName("label_38")
+        self.formLayout.setWidget(33, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_38)
+        self.loadSocketsLabel = QtWidgets.QLabel(parent=self.scrollAreaWidgetContents)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.loadSocketsLabel.sizePolicy().hasHeightForWidth())
+        self.loadSocketsLabel.setSizePolicy(sizePolicy)
+        self.loadSocketsLabel.setObjectName("loadSocketsLabel")
+        self.formLayout.setWidget(33, QtWidgets.QFormLayout.ItemRole.FieldRole, self.loadSocketsLabel)
+        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
+        self.verticalLayout_4.addWidget(self.scrollArea)
+        self.brokerWidget.addTab(self.statusTab, "")
+        self.logTab = QtWidgets.QWidget()
+        self.logTab.setObjectName("logTab")
+        self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.logTab)
+        self.verticalLayout_6.setObjectName("verticalLayout_6")
+        self.horizontalLayout_17 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_17.setObjectName("horizontalLayout_17")
+        self.label_41 = QtWidgets.QLabel(parent=self.logTab)
+        self.label_41.setObjectName("label_41")
+        self.horizontalLayout_17.addWidget(self.label_41)
+        self.logLevelComboBox = QtWidgets.QComboBox(parent=self.logTab)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.logLevelComboBox.sizePolicy().hasHeightForWidth())
+        self.logLevelComboBox.setSizePolicy(sizePolicy)
+        self.logLevelComboBox.setObjectName("logLevelComboBox")
+        self.horizontalLayout_17.addWidget(self.logLevelComboBox)
+        self.verticalLayout_6.addLayout(self.horizontalLayout_17)
+        self.logSearchWidget = EricTextEditSearchWidget(parent=self.logTab)
+        self.logSearchWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.WheelFocus)
+        self.logSearchWidget.setObjectName("logSearchWidget")
+        self.verticalLayout_6.addWidget(self.logSearchWidget)
+        self.logEdit = QtWidgets.QPlainTextEdit(parent=self.logTab)
+        self.logEdit.setTabChangesFocus(True)
+        self.logEdit.setLineWrapMode(QtWidgets.QPlainTextEdit.LineWrapMode.NoWrap)
+        self.logEdit.setReadOnly(True)
+        self.logEdit.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.TextSelectableByKeyboard|QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
+        self.logEdit.setObjectName("logEdit")
+        self.verticalLayout_6.addWidget(self.logEdit)
+        self.horizontalLayout_16 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_16.setObjectName("horizontalLayout_16")
+        self.saveLogMessagesButton = QtWidgets.QPushButton(parent=self.logTab)
+        self.saveLogMessagesButton.setEnabled(False)
+        self.saveLogMessagesButton.setObjectName("saveLogMessagesButton")
+        self.horizontalLayout_16.addWidget(self.saveLogMessagesButton)
+        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+        self.horizontalLayout_16.addItem(spacerItem4)
+        self.clearLogMessagesButton = QtWidgets.QPushButton(parent=self.logTab)
+        self.clearLogMessagesButton.setEnabled(False)
+        self.clearLogMessagesButton.setObjectName("clearLogMessagesButton")
+        self.horizontalLayout_16.addWidget(self.clearLogMessagesButton)
+        self.verticalLayout_6.addLayout(self.horizontalLayout_16)
+        self.followLogMessagesCheckBox = QtWidgets.QCheckBox(parent=self.logTab)
+        self.followLogMessagesCheckBox.setChecked(True)
+        self.followLogMessagesCheckBox.setObjectName("followLogMessagesCheckBox")
+        self.verticalLayout_6.addWidget(self.followLogMessagesCheckBox)
+        self.brokerWidget.addTab(self.logTab, "")
+        self.verticalLayout.addWidget(self.brokerWidget)
+
+        self.retranslateUi(MqttMonitorWidget)
+        self.brokerWidget.setCurrentIndex(4)
+        self.clearMessagesButton.clicked.connect(self.messagesEdit.clear) # type: ignore
+        self.clearPublishCheckBox.clicked['bool'].connect(self.publishClearButton.setHidden) # type: ignore
+        self.clearLogMessagesButton.clicked.connect(self.logEdit.clear) # type: ignore
+        QtCore.QMetaObject.connectSlotsByName(MqttMonitorWidget)
+        MqttMonitorWidget.setTabOrder(self.modeButton, self.profileComboBox)
+        MqttMonitorWidget.setTabOrder(self.profileComboBox, self.brokerComboBox)
+        MqttMonitorWidget.setTabOrder(self.brokerComboBox, self.brokerPortComboBox)
+        MqttMonitorWidget.setTabOrder(self.brokerPortComboBox, self.brokerConnectionOptionsButton)
+        MqttMonitorWidget.setTabOrder(self.brokerConnectionOptionsButton, self.connectButton)
+        MqttMonitorWidget.setTabOrder(self.connectButton, self.clearWillButton)
+        MqttMonitorWidget.setTabOrder(self.clearWillButton, self.brokerWidget)
+        MqttMonitorWidget.setTabOrder(self.brokerWidget, self.subscribeTopicComboBox)
+        MqttMonitorWidget.setTabOrder(self.subscribeTopicComboBox, self.subscribeQosSpinBox)
+        MqttMonitorWidget.setTabOrder(self.subscribeQosSpinBox, self.subscribeButton)
+        MqttMonitorWidget.setTabOrder(self.subscribeButton, self.subscribePropertiesButton)
+        MqttMonitorWidget.setTabOrder(self.subscribePropertiesButton, self.unsubscribeTopicComboBox)
+        MqttMonitorWidget.setTabOrder(self.unsubscribeTopicComboBox, self.unsubscribeButton)
+        MqttMonitorWidget.setTabOrder(self.unsubscribeButton, self.unsubscribePropertiesButton)
+        MqttMonitorWidget.setTabOrder(self.unsubscribePropertiesButton, self.publishTopicComboBox)
+        MqttMonitorWidget.setTabOrder(self.publishTopicComboBox, self.publishPayloadEdit)
+        MqttMonitorWidget.setTabOrder(self.publishPayloadEdit, self.publishPayloadFilePicker)
+        MqttMonitorWidget.setTabOrder(self.publishPayloadFilePicker, self.publishQosSpinBox)
+        MqttMonitorWidget.setTabOrder(self.publishQosSpinBox, self.publishRetainCheckBox)
+        MqttMonitorWidget.setTabOrder(self.publishRetainCheckBox, self.publishPropertiesButton)
+        MqttMonitorWidget.setTabOrder(self.publishPropertiesButton, self.publishButton)
+        MqttMonitorWidget.setTabOrder(self.publishButton, self.publishClearButton)
+        MqttMonitorWidget.setTabOrder(self.publishClearButton, self.publishClearRetainedButton)
+        MqttMonitorWidget.setTabOrder(self.publishClearRetainedButton, self.clearPublishCheckBox)
+        MqttMonitorWidget.setTabOrder(self.clearPublishCheckBox, self.propertiesEdit)
+        MqttMonitorWidget.setTabOrder(self.propertiesEdit, self.messagesSearchWidget)
+        MqttMonitorWidget.setTabOrder(self.messagesSearchWidget, self.messagesEdit)
+        MqttMonitorWidget.setTabOrder(self.messagesEdit, self.saveMessagesButton)
+        MqttMonitorWidget.setTabOrder(self.saveMessagesButton, self.clearMessagesButton)
+        MqttMonitorWidget.setTabOrder(self.clearMessagesButton, self.followMessagesCheckBox)
+        MqttMonitorWidget.setTabOrder(self.followMessagesCheckBox, self.scrollArea)
+        MqttMonitorWidget.setTabOrder(self.scrollArea, self.brokerStatusButton)
+        MqttMonitorWidget.setTabOrder(self.brokerStatusButton, self.logLevelComboBox)
+        MqttMonitorWidget.setTabOrder(self.logLevelComboBox, self.logSearchWidget)
+        MqttMonitorWidget.setTabOrder(self.logSearchWidget, self.logEdit)
+        MqttMonitorWidget.setTabOrder(self.logEdit, self.saveLogMessagesButton)
+        MqttMonitorWidget.setTabOrder(self.saveLogMessagesButton, self.clearLogMessagesButton)
+        MqttMonitorWidget.setTabOrder(self.clearLogMessagesButton, self.followLogMessagesCheckBox)
+
+    def retranslateUi(self, MqttMonitorWidget):
+        _translate = QtCore.QCoreApplication.translate
+        self.label_2.setText(_translate("MqttMonitorWidget", "<b>MQTT Monitor</b>"))
+        self.brokerGroupBox.setTitle(_translate("MqttMonitorWidget", "Broker"))
+        self.modeButton.setToolTip(_translate("MqttMonitorWidget", "Press to switch the mode between profiles and direct connection"))
+        self.profileComboBox.setToolTip(_translate("MqttMonitorWidget", "Select the profile to be used to connect to the broker"))
+        self.brokerComboBox.setToolTip(_translate("MqttMonitorWidget", "Enter the host name of the broker"))
+        self.brokerPortComboBox.setToolTip(_translate("MqttMonitorWidget", "Enter the broker port to connect to"))
+        self.brokerConnectionOptionsButton.setToolTip(_translate("MqttMonitorWidget", "Press to open a dialog to enter connection options"))
+        self.connectButton.setToolTip(_translate("MqttMonitorWidget", "Press to connect to/disconnect from the broker"))
+        self.clearWillButton.setToolTip(_translate("MqttMonitorWidget", "Select to clear a previously set last will message"))
+        self.subscribeGroup.setTitle(_translate("MqttMonitorWidget", "Subscribe"))
+        self.label.setText(_translate("MqttMonitorWidget", "Topic:"))
+        self.subscribeTopicComboBox.setToolTip(_translate("MqttMonitorWidget", "Enter the topic"))
+        self.label_3.setText(_translate("MqttMonitorWidget", "QoS:"))
+        self.subscribeQosSpinBox.setToolTip(_translate("MqttMonitorWidget", "Enter the desired QoS value"))
+        self.subscribeButton.setToolTip(_translate("MqttMonitorWidget", "Press to subscribe to the given topic"))
+        self.subscribePropertiesButton.setToolTip(_translate("MqttMonitorWidget", "Press to edit the user properties"))
+        self.unsubscribeGroup.setTitle(_translate("MqttMonitorWidget", "Unsubscribe"))
+        self.label_4.setText(_translate("MqttMonitorWidget", "Topic:"))
+        self.unsubscribeTopicComboBox.setToolTip(_translate("MqttMonitorWidget", "Select the topic to unsubscribe"))
+        self.unsubscribeButton.setToolTip(_translate("MqttMonitorWidget", "Press to unsubscribe the selected topic"))
+        self.unsubscribePropertiesButton.setToolTip(_translate("MqttMonitorWidget", "Press to edit the user properties"))
+        self.publishGroup.setTitle(_translate("MqttMonitorWidget", "Publish"))
+        self.label_39.setText(_translate("MqttMonitorWidget", "Topic:"))
+        self.publishTopicComboBox.setToolTip(_translate("MqttMonitorWidget", "Enter the topic to publish to"))
+        self.label_40.setText(_translate("MqttMonitorWidget", "QoS:"))
+        self.publishQosSpinBox.setToolTip(_translate("MqttMonitorWidget", "Enter the desired QoS value"))
+        self.publishRetainCheckBox.setToolTip(_translate("MqttMonitorWidget", "Select to retain the published message"))
+        self.publishRetainCheckBox.setText(_translate("MqttMonitorWidget", "Retain"))
+        self.publishPropertiesButton.setToolTip(_translate("MqttMonitorWidget", "Press to edit the user properties"))
+        self.publishPayloadEdit.setToolTip(_translate("MqttMonitorWidget", "Enter the string data to be sent"))
+        self.label_42.setText(_translate("MqttMonitorWidget", "Payload File:"))
+        self.publishPayloadFilePicker.setToolTip(_translate("MqttMonitorWidget", "Enter the full path to a file containing the message payload"))
+        self.publishClearButton.setToolTip(_translate("MqttMonitorWidget", "Press to clear the publish data"))
+        self.publishClearButton.setText(_translate("MqttMonitorWidget", "Clear"))
+        self.publishClearRetainedButton.setToolTip(_translate("MqttMonitorWidget", "Press to clear the retained messages of the selected topic"))
+        self.publishClearRetainedButton.setText(_translate("MqttMonitorWidget", "Clear Retained"))
+        self.publishButton.setText(_translate("MqttMonitorWidget", "Publish"))
+        self.clearPublishCheckBox.setToolTip(_translate("MqttMonitorWidget", "Select to clear the publish data after the message was published"))
+        self.clearPublishCheckBox.setText(_translate("MqttMonitorWidget", "Clear when sent"))
+        self.brokerWidget.setTabText(self.brokerWidget.indexOf(self.pubSubTab), _translate("MqttMonitorWidget", "Pub/Sub"))
+        self.label_43.setText(_translate("MqttMonitorWidget", "MQTT V5 Properties"))
+        self.brokerWidget.setTabText(self.brokerWidget.indexOf(self.propertiesTab), _translate("MqttMonitorWidget", "Properties"))
+        self.saveMessagesButton.setToolTip(_translate("MqttMonitorWidget", "Press to save the received messages to a file"))
+        self.saveMessagesButton.setText(_translate("MqttMonitorWidget", "Save"))
+        self.clearMessagesButton.setToolTip(_translate("MqttMonitorWidget", "Press to clear the list of received messages"))
+        self.clearMessagesButton.setText(_translate("MqttMonitorWidget", "Clear"))
+        self.followMessagesCheckBox.setToolTip(_translate("MqttMonitorWidget", "Select to scroll to the most recently received message"))
+        self.followMessagesCheckBox.setText(_translate("MqttMonitorWidget", "Follow received messages"))
+        self.brokerWidget.setTabText(self.brokerWidget.indexOf(self.messagesTab), _translate("MqttMonitorWidget", "Messages"))
+        self.brokerStatusButton.setToolTip(_translate("MqttMonitorWidget", "Press to activate the status display"))
+        self.brokerStatusButton.setText(_translate("MqttMonitorWidget", "Subscribe"))
+        self.label_22.setText(_translate("MqttMonitorWidget", "<b>Broker</b>"))
+        self.label_5.setText(_translate("MqttMonitorWidget", "Version"))
+        self.versionLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_6.setText(_translate("MqttMonitorWidget", "Timestamp"))
+        self.timestampLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_7.setText(_translate("MqttMonitorWidget", "Uptime"))
+        self.uptimeLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_8.setText(_translate("MqttMonitorWidget", "Subscriptions"))
+        self.subscriptionsLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_23.setText(_translate("MqttMonitorWidget", "<b>Clients</b>"))
+        self.label_9.setText(_translate("MqttMonitorWidget", "Connected"))
+        self.clientsConnectedLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_10.setText(_translate("MqttMonitorWidget", "Disconnected"))
+        self.clientsDisconnectedLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_11.setText(_translate("MqttMonitorWidget", "Expired"))
+        self.clientsExpiredLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_12.setText(_translate("MqttMonitorWidget", "Maximum"))
+        self.clientsMaximumLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_13.setText(_translate("MqttMonitorWidget", "Total"))
+        self.clientsTotalLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_24.setText(_translate("MqttMonitorWidget", "<b>Messages</b>"))
+        self.label_14.setText(_translate("MqttMonitorWidget", "Sent"))
+        self.messagesSentLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_15.setText(_translate("MqttMonitorWidget", "Received"))
+        self.messagesReceivedLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_16.setText(_translate("MqttMonitorWidget", "Stored"))
+        self.messagesStoredLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_17.setText(_translate("MqttMonitorWidget", "Inflight"))
+        self.messagesInflightLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_18.setText(_translate("MqttMonitorWidget", "Retained"))
+        self.messagesRetainedLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_28.setText(_translate("MqttMonitorWidget", "<b>PUBLISH Messages</b>"))
+        self.label_25.setText(_translate("MqttMonitorWidget", "Sent"))
+        self.publishMessagesSentLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_26.setText(_translate("MqttMonitorWidget", "Received"))
+        self.publishMessagesReceivedLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_27.setText(_translate("MqttMonitorWidget", "Dropped"))
+        self.publishMessagesDroppedLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_21.setText(_translate("MqttMonitorWidget", "<b>Traffic</b>"))
+        self.label_19.setText(_translate("MqttMonitorWidget", "Bytes Sent"))
+        self.bytesSentLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_20.setText(_translate("MqttMonitorWidget", "Bytes Received"))
+        self.bytesReceivedLabel.setText(_translate("MqttMonitorWidget", "-"))
+        self.label_29.setText(_translate("MqttMonitorWidget", "<b>Load</b> (1 min / 5 min / 15 min)"))
+        self.label_30.setText(_translate("MqttMonitorWidget", "Bytes Sent"))
+        self.loadBytesSentLabel.setText(_translate("MqttMonitorWidget", "- / - / -"))
+        self.label_31.setText(_translate("MqttMonitorWidget", "Bytes Received"))
+        self.loadBytesReceivedLabel.setText(_translate("MqttMonitorWidget", "- / - / -"))
+        self.label_32.setText(_translate("MqttMonitorWidget", "Messages Sent"))
+        self.loadMessagesSentLabel.setText(_translate("MqttMonitorWidget", "- / - / -"))
+        self.label_33.setText(_translate("MqttMonitorWidget", "Messages Received"))
+        self.loadMessagesReceivedLabel.setText(_translate("MqttMonitorWidget", "- / - / -"))
+        self.label_34.setText(_translate("MqttMonitorWidget", "PUBLISH Sent"))
+        self.loadPublishSentLabel.setText(_translate("MqttMonitorWidget", "- / - / -"))
+        self.label_35.setText(_translate("MqttMonitorWidget", "PUBLISH Received"))
+        self.loadPublishReceivedLabel.setText(_translate("MqttMonitorWidget", "- / - / -"))
+        self.label_36.setText(_translate("MqttMonitorWidget", "PUBLISH Dropped"))
+        self.loadPublishDroppedLabel.setText(_translate("MqttMonitorWidget", "- / - / -"))
+        self.label_37.setText(_translate("MqttMonitorWidget", "Connections"))
+        self.loadConnectionsLabel.setText(_translate("MqttMonitorWidget", "- / - / -"))
+        self.label_38.setText(_translate("MqttMonitorWidget", "Sockets"))
+        self.loadSocketsLabel.setText(_translate("MqttMonitorWidget", "- / - / -"))
+        self.brokerWidget.setTabText(self.brokerWidget.indexOf(self.statusTab), _translate("MqttMonitorWidget", "Status"))
+        self.label_41.setText(_translate("MqttMonitorWidget", "Max. Log Level:"))
+        self.logLevelComboBox.setToolTip(_translate("MqttMonitorWidget", "Select the maximum log level to show"))
+        self.saveLogMessagesButton.setToolTip(_translate("MqttMonitorWidget", "Press to save the received log messages to a file"))
+        self.saveLogMessagesButton.setText(_translate("MqttMonitorWidget", "Save"))
+        self.clearLogMessagesButton.setToolTip(_translate("MqttMonitorWidget", "Press to clear the list of received log messages"))
+        self.clearLogMessagesButton.setText(_translate("MqttMonitorWidget", "Clear"))
+        self.followLogMessagesCheckBox.setToolTip(_translate("MqttMonitorWidget", "Select to scroll to the most recently received log message"))
+        self.followLogMessagesCheckBox.setText(_translate("MqttMonitorWidget", "Follow received log messages"))
+        self.brokerWidget.setTabText(self.brokerWidget.indexOf(self.logTab), _translate("MqttMonitorWidget", "Log"))
+from eric7.EricWidgets.EricPathPicker import EricPathPicker
+from eric7.EricWidgets.EricTextEditSearchWidget import EricTextEditSearchWidget
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MqttMonitor/Ui_MqttUserPropertiesEditor.py	Thu Aug 01 11:30:50 2024 +0200
@@ -0,0 +1,62 @@
+# Form implementation generated from reading ui file 'MqttMonitor/MqttUserPropertiesEditor.ui'
+#
+# Created by: PyQt6 UI code generator 6.7.1
+#
+# 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 PyQt6 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MqttUserPropertiesEditor(object):
+    def setupUi(self, MqttUserPropertiesEditor):
+        MqttUserPropertiesEditor.setObjectName("MqttUserPropertiesEditor")
+        MqttUserPropertiesEditor.resize(400, 250)
+        MqttUserPropertiesEditor.setProperty("sizeGripEnabled", True)
+        self.horizontalLayout = QtWidgets.QHBoxLayout(MqttUserPropertiesEditor)
+        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.propertiesTable = QtWidgets.QTableWidget(parent=MqttUserPropertiesEditor)
+        self.propertiesTable.setAlternatingRowColors(True)
+        self.propertiesTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows)
+        self.propertiesTable.setRowCount(10)
+        self.propertiesTable.setColumnCount(2)
+        self.propertiesTable.setObjectName("propertiesTable")
+        item = QtWidgets.QTableWidgetItem()
+        self.propertiesTable.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.propertiesTable.setHorizontalHeaderItem(1, item)
+        self.propertiesTable.horizontalHeader().setStretchLastSection(True)
+        self.horizontalLayout.addWidget(self.propertiesTable)
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.addButton = QtWidgets.QToolButton(parent=MqttUserPropertiesEditor)
+        self.addButton.setText("")
+        self.addButton.setObjectName("addButton")
+        self.verticalLayout.addWidget(self.addButton)
+        self.deleteButton = QtWidgets.QToolButton(parent=MqttUserPropertiesEditor)
+        self.deleteButton.setText("")
+        self.deleteButton.setObjectName("deleteButton")
+        self.verticalLayout.addWidget(self.deleteButton)
+        self.clearButton = QtWidgets.QToolButton(parent=MqttUserPropertiesEditor)
+        self.clearButton.setText("")
+        self.clearButton.setObjectName("clearButton")
+        self.verticalLayout.addWidget(self.clearButton)
+        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
+        self.verticalLayout.addItem(spacerItem)
+        self.horizontalLayout.addLayout(self.verticalLayout)
+
+        self.retranslateUi(MqttUserPropertiesEditor)
+        QtCore.QMetaObject.connectSlotsByName(MqttUserPropertiesEditor)
+
+    def retranslateUi(self, MqttUserPropertiesEditor):
+        _translate = QtCore.QCoreApplication.translate
+        MqttUserPropertiesEditor.setWindowTitle(_translate("MqttUserPropertiesEditor", "User Properties"))
+        item = self.propertiesTable.horizontalHeaderItem(0)
+        item.setText(_translate("MqttUserPropertiesEditor", "Key"))
+        item = self.propertiesTable.horizontalHeaderItem(1)
+        item.setText(_translate("MqttUserPropertiesEditor", "Value"))
+        self.addButton.setToolTip(_translate("MqttUserPropertiesEditor", "Press to add a new empty row"))
+        self.deleteButton.setToolTip(_translate("MqttUserPropertiesEditor", "Press to delete the selected properties"))
+        self.clearButton.setToolTip(_translate("MqttUserPropertiesEditor", "Press to delete all properties"))
--- a/PKGLIST	Thu Aug 01 11:30:02 2024 +0200
+++ b/PKGLIST	Thu Aug 01 11:30:50 2024 +0200
@@ -1,5 +1,6 @@
 MqttMonitor/ConfigurationPage/MqttPage.py
 MqttMonitor/ConfigurationPage/MqttPage.ui
+MqttMonitor/ConfigurationPage/Ui_MqttPage.py
 MqttMonitor/ConfigurationPage/__init__.py
 MqttMonitor/Documentation/LICENSE.GPL3
 MqttMonitor/MqttClient.py
@@ -13,6 +14,10 @@
 MqttMonitor/MqttReasonCodes.py
 MqttMonitor/MqttUserPropertiesEditor.py
 MqttMonitor/MqttUserPropertiesEditor.ui
+MqttMonitor/Ui_MqttConnectionOptionsDialog.py
+MqttMonitor/Ui_MqttConnectionProfilesDialog.py
+MqttMonitor/Ui_MqttMonitorWidget.py
+MqttMonitor/Ui_MqttUserPropertiesEditor.py
 MqttMonitor/__init__.py
 MqttMonitor/i18n/mqttmonitor_de.qm
 MqttMonitor/i18n/mqttmonitor_en.qm
--- a/PluginMqttMonitor.epj	Thu Aug 01 11:30:02 2024 +0200
+++ b/PluginMqttMonitor.epj	Thu Aug 01 11:30:50 2024 +0200
@@ -194,7 +194,6 @@
       "Makefile": "OTHERS",
       "README": "OTHERS",
       "README.*": "OTHERS",
-      "Ui_*.py": "__IGNORE__",
       "makefile": "OTHERS"
     },
     "FORMS": [
@@ -238,6 +237,7 @@
       "MqttMonitor/icons/profiles-light.svg",
       "MqttMonitor/icons/quickopen-dark.svg",
       "MqttMonitor/icons/quickopen-light.svg",
+      "MqttMonitor/icons/sbMqttMonitor96.svg",
       "PKGLIST",
       "PluginMqttMonitor.epj",
       "PluginMqttMonitor.zip",
@@ -292,6 +292,7 @@
     "RESOURCES": [],
     "SOURCES": [
       "MqttMonitor/ConfigurationPage/MqttPage.py",
+      "MqttMonitor/ConfigurationPage/Ui_MqttPage.py",
       "MqttMonitor/ConfigurationPage/__init__.py",
       "MqttMonitor/MqttClient.py",
       "MqttMonitor/MqttConnectionOptionsDialog.py",
@@ -300,6 +301,10 @@
       "MqttMonitor/MqttProtocols.py",
       "MqttMonitor/MqttReasonCodes.py",
       "MqttMonitor/MqttUserPropertiesEditor.py",
+      "MqttMonitor/Ui_MqttConnectionOptionsDialog.py",
+      "MqttMonitor/Ui_MqttConnectionProfilesDialog.py",
+      "MqttMonitor/Ui_MqttMonitorWidget.py",
+      "MqttMonitor/Ui_MqttUserPropertiesEditor.py",
       "MqttMonitor/__init__.py",
       "PluginMqttMonitor.py",
       "__init__.py"
--- a/PluginMqttMonitor.py	Thu Aug 01 11:30:02 2024 +0200
+++ b/PluginMqttMonitor.py	Thu Aug 01 11:30:50 2024 +0200
@@ -35,24 +35,27 @@
 from MqttMonitor.MqttProtocols import MqttProtocols
 
 # Start-Of-Header
-name = "MQTT Monitor Plugin"
-author = "Detlev Offenbach <detlev@die-offenbachs.de>"
-autoactivate = True
-deactivateable = True
-version = "11.0.1"
-className = "MqttMonitorPlugin"
-packageName = "MqttMonitor"
-shortDescription = "Plug-in implementing a tool to connect to a MQTT broker"
-longDescription = (
-    """Plug-in implementing a tool to connect to a MQTT broker, subscribe"""
-    """ to topics, present received messages and publish messages."""
-    """ It displays broker statistics (the $SYS/# topic tree) and"""
-    """ log messages of the underlying paho-mqtt client. This tool"""
-    """ supports unencrypted connections (port 1883) as well as encrypted"""
-    """ SSL/TLS connections (port 8883)."""
-)
-needsRestart = False
-pyqtApi = 2
+__header__ = {
+    "name": "MQTT Monitor Plugin",
+    "author": "Detlev Offenbach <detlev@die-offenbachs.de>",
+    "autoactivate": True,
+    "deactivateable": True,
+    "version": "11.0.1",
+    "className": "MqttMonitorPlugin",
+    "packageName": "MqttMonitor",
+    "shortDescription": "Plug-in implementing a tool to connect to a MQTT broker",
+    "longDescription": (
+        "Plug-in implementing a tool to connect to a MQTT broker, subscribe"
+        " to topics, present received messages and publish messages."
+        " It displays broker statistics (the $SYS/# topic tree) and"
+        " log messages of the underlying paho-mqtt client. This tool"
+        " supports unencrypted connections (port 1883) as well as encrypted"
+        " SSL/TLS connections (port 8883)."
+    ),
+    "needsRestart": False,
+    "hasCompiledForms": True,
+    "pyqtApi": 2,
+}
 # End-Of-Header
 
 error = ""
Binary file PluginMqttMonitor.zip has changed

eric ide

mercurial