mirror of
https://github.com/naruxde/revpicommander.git
synced 2025-12-28 21:08:04 +01:00
Add option for software watchdog and driver reset action
This commit is contained in:
@@ -11,7 +11,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
||||
class Ui_diag_options(object):
|
||||
def setupUi(self, diag_options):
|
||||
diag_options.setObjectName("diag_options")
|
||||
diag_options.resize(452, 503)
|
||||
diag_options.resize(416, 522)
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout(diag_options)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.gb_plc = QtWidgets.QGroupBox(diag_options)
|
||||
@@ -21,29 +21,24 @@ class Ui_diag_options(object):
|
||||
self.lbl_replace_io = QtWidgets.QLabel(self.gb_plc)
|
||||
self.lbl_replace_io.setObjectName("lbl_replace_io")
|
||||
self.gridLayout.addWidget(self.lbl_replace_io, 6, 0, 1, 1)
|
||||
self.sbx_autoreloaddelay = QtWidgets.QSpinBox(self.gb_plc)
|
||||
self.sbx_autoreloaddelay.setMinimum(5)
|
||||
self.sbx_autoreloaddelay.setMaximum(120)
|
||||
self.sbx_autoreloaddelay.setObjectName("sbx_autoreloaddelay")
|
||||
self.gridLayout.addWidget(self.sbx_autoreloaddelay, 2, 2, 1, 1)
|
||||
self.cbx_zeroonexit = QtWidgets.QCheckBox(self.gb_plc)
|
||||
self.cbx_zeroonexit.setObjectName("cbx_zeroonexit")
|
||||
self.gridLayout.addWidget(self.cbx_zeroonexit, 4, 1, 1, 2)
|
||||
self.cbx_zeroonerror = QtWidgets.QCheckBox(self.gb_plc)
|
||||
self.cbx_zeroonerror.setObjectName("cbx_zeroonerror")
|
||||
self.gridLayout.addWidget(self.cbx_zeroonerror, 5, 1, 1, 2)
|
||||
self.cbx_autostart = QtWidgets.QCheckBox(self.gb_plc)
|
||||
self.cbx_autostart.setObjectName("cbx_autostart")
|
||||
self.gridLayout.addWidget(self.cbx_autostart, 0, 0, 1, 3)
|
||||
self.cbx_autoreload = QtWidgets.QCheckBox(self.gb_plc)
|
||||
self.cbx_autoreload.setObjectName("cbx_autoreload")
|
||||
self.gridLayout.addWidget(self.cbx_autoreload, 1, 0, 1, 3)
|
||||
self.cbb_reset_driver_action = QtWidgets.QComboBox(self.gb_plc)
|
||||
self.cbb_reset_driver_action.setObjectName("cbb_reset_driver_action")
|
||||
self.cbb_reset_driver_action.addItem("")
|
||||
self.cbb_reset_driver_action.addItem("")
|
||||
self.cbb_reset_driver_action.addItem("")
|
||||
self.gridLayout.addWidget(self.cbb_reset_driver_action, 8, 1, 1, 2)
|
||||
self.lbl_reset_driver_action = QtWidgets.QLabel(self.gb_plc)
|
||||
self.lbl_reset_driver_action.setObjectName("lbl_reset_driver_action")
|
||||
self.gridLayout.addWidget(self.lbl_reset_driver_action, 8, 0, 1, 1)
|
||||
self.lbl_plc_zero = QtWidgets.QLabel(self.gb_plc)
|
||||
self.lbl_plc_zero.setObjectName("lbl_plc_zero")
|
||||
self.gridLayout.addWidget(self.lbl_plc_zero, 3, 0, 1, 3)
|
||||
self.txt_replace_io = QtWidgets.QLineEdit(self.gb_plc)
|
||||
self.txt_replace_io.setObjectName("txt_replace_io")
|
||||
self.gridLayout.addWidget(self.txt_replace_io, 7, 1, 1, 2)
|
||||
self.cbb_replace_io = QtWidgets.QComboBox(self.gb_plc)
|
||||
self.cbb_replace_io.setObjectName("cbb_replace_io")
|
||||
self.cbb_replace_io.addItem("")
|
||||
@@ -51,9 +46,26 @@ class Ui_diag_options(object):
|
||||
self.cbb_replace_io.addItem("")
|
||||
self.cbb_replace_io.addItem("")
|
||||
self.gridLayout.addWidget(self.cbb_replace_io, 6, 1, 1, 2)
|
||||
self.cbx_zeroonexit = QtWidgets.QCheckBox(self.gb_plc)
|
||||
self.cbx_zeroonexit.setObjectName("cbx_zeroonexit")
|
||||
self.gridLayout.addWidget(self.cbx_zeroonexit, 4, 1, 1, 2)
|
||||
self.lbl_plc_delay = QtWidgets.QLabel(self.gb_plc)
|
||||
self.lbl_plc_delay.setObjectName("lbl_plc_delay")
|
||||
self.gridLayout.addWidget(self.lbl_plc_delay, 2, 0, 1, 2)
|
||||
self.sbx_autoreloaddelay = QtWidgets.QSpinBox(self.gb_plc)
|
||||
self.sbx_autoreloaddelay.setMinimum(5)
|
||||
self.sbx_autoreloaddelay.setMaximum(120)
|
||||
self.sbx_autoreloaddelay.setObjectName("sbx_autoreloaddelay")
|
||||
self.gridLayout.addWidget(self.sbx_autoreloaddelay, 2, 2, 1, 1)
|
||||
self.cbx_autoreload = QtWidgets.QCheckBox(self.gb_plc)
|
||||
self.cbx_autoreload.setObjectName("cbx_autoreload")
|
||||
self.gridLayout.addWidget(self.cbx_autoreload, 1, 0, 1, 3)
|
||||
self.txt_replace_io = QtWidgets.QLineEdit(self.gb_plc)
|
||||
self.txt_replace_io.setObjectName("txt_replace_io")
|
||||
self.gridLayout.addWidget(self.txt_replace_io, 7, 1, 1, 2)
|
||||
self.lbl_lbl_reset_driver_action = QtWidgets.QLabel(self.gb_plc)
|
||||
self.lbl_lbl_reset_driver_action.setObjectName("lbl_lbl_reset_driver_action")
|
||||
self.gridLayout.addWidget(self.lbl_lbl_reset_driver_action, 9, 0, 1, 3)
|
||||
self.verticalLayout.addWidget(self.gb_plc)
|
||||
self.gb_server = QtWidgets.QGroupBox(diag_options)
|
||||
self.gb_server.setObjectName("gb_server")
|
||||
@@ -110,16 +122,21 @@ class Ui_diag_options(object):
|
||||
diag_options.setWindowTitle(_translate("diag_options", "RevPi Python PLC Options"))
|
||||
self.gb_plc.setTitle(_translate("diag_options", "Start / Stop behavior of PLC program"))
|
||||
self.lbl_replace_io.setText(_translate("diag_options", "Replace IO file:"))
|
||||
self.cbx_zeroonexit.setText(_translate("diag_options", "... sucessfully without error"))
|
||||
self.cbx_zeroonerror.setText(_translate("diag_options", "... after exception and errors"))
|
||||
self.cbx_autostart.setText(_translate("diag_options", "Start PLC program automatically"))
|
||||
self.cbx_autoreload.setText(_translate("diag_options", "Restart PLC program after exit or crash"))
|
||||
self.cbb_reset_driver_action.setItemText(0, _translate("diag_options", "Do nothing"))
|
||||
self.cbb_reset_driver_action.setItemText(1, _translate("diag_options", "Restart after piCtory changed"))
|
||||
self.cbb_reset_driver_action.setItemText(2, _translate("diag_options", "Always restart the PLC program"))
|
||||
self.lbl_reset_driver_action.setText(_translate("diag_options", "Driver reset action:"))
|
||||
self.lbl_plc_zero.setText(_translate("diag_options", "Set process image to NULL if program terminates..."))
|
||||
self.cbb_replace_io.setItemText(0, _translate("diag_options", "Do not use replace io file"))
|
||||
self.cbb_replace_io.setItemText(1, _translate("diag_options", "Use static file from RevPiPyLoad"))
|
||||
self.cbb_replace_io.setItemText(2, _translate("diag_options", "Use dynamic file from work directory"))
|
||||
self.cbb_replace_io.setItemText(3, _translate("diag_options", "Give own path and filename"))
|
||||
self.cbx_zeroonexit.setText(_translate("diag_options", "... sucessfully without error"))
|
||||
self.lbl_plc_delay.setText(_translate("diag_options", "Restart delay in seconds:"))
|
||||
self.cbx_autoreload.setText(_translate("diag_options", "Restart PLC program after exit or crash"))
|
||||
self.lbl_lbl_reset_driver_action.setText(_translate("diag_options", "PLC program behavior after piCtory driver reset clicked"))
|
||||
self.gb_server.setTitle(_translate("diag_options", "RevPiPyLoad server services"))
|
||||
self.btn_aclplcslave.setText(_translate("diag_options", "Edit ACL"))
|
||||
self.cbx_mqtt.setText(_translate("diag_options", "MQTT process image publisher"))
|
||||
|
||||
@@ -11,37 +11,44 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
||||
class Ui_diag_program(object):
|
||||
def setupUi(self, diag_program):
|
||||
diag_program.setObjectName("diag_program")
|
||||
diag_program.resize(488, 500)
|
||||
diag_program.resize(400, 501)
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout(diag_program)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.gb_plc = QtWidgets.QGroupBox(diag_program)
|
||||
self.gb_plc.setObjectName("gb_plc")
|
||||
self.gridLayout = QtWidgets.QGridLayout(self.gb_plc)
|
||||
self.gridLayout.setObjectName("gridLayout")
|
||||
self.rbn_pythonversion_2 = QtWidgets.QRadioButton(self.gb_plc)
|
||||
self.rbn_pythonversion_2.setObjectName("rbn_pythonversion_2")
|
||||
self.gridLayout.addWidget(self.rbn_pythonversion_2, 3, 1, 1, 1)
|
||||
self.txt_plcarguments = QtWidgets.QLineEdit(self.gb_plc)
|
||||
self.txt_plcarguments.setObjectName("txt_plcarguments")
|
||||
self.gridLayout.addWidget(self.txt_plcarguments, 2, 1, 1, 2)
|
||||
self.rbn_pythonversion_3 = QtWidgets.QRadioButton(self.gb_plc)
|
||||
self.rbn_pythonversion_3.setObjectName("rbn_pythonversion_3")
|
||||
self.gridLayout.addWidget(self.rbn_pythonversion_3, 3, 2, 1, 1)
|
||||
self.lbl_plcprogram = QtWidgets.QLabel(self.gb_plc)
|
||||
self.lbl_plcprogram.setObjectName("lbl_plcprogram")
|
||||
self.gridLayout.addWidget(self.lbl_plcprogram, 0, 0, 1, 3)
|
||||
self.cbx_plcworkdir_set_uid = QtWidgets.QCheckBox(self.gb_plc)
|
||||
self.cbx_plcworkdir_set_uid.setObjectName("cbx_plcworkdir_set_uid")
|
||||
self.gridLayout.addWidget(self.cbx_plcworkdir_set_uid, 4, 0, 1, 3)
|
||||
self.cbb_plcprogram = QtWidgets.QComboBox(self.gb_plc)
|
||||
self.cbb_plcprogram.setObjectName("cbb_plcprogram")
|
||||
self.gridLayout.addWidget(self.cbb_plcprogram, 1, 0, 1, 3)
|
||||
self.rbn_pythonversion_3 = QtWidgets.QRadioButton(self.gb_plc)
|
||||
self.rbn_pythonversion_3.setObjectName("rbn_pythonversion_3")
|
||||
self.gridLayout.addWidget(self.rbn_pythonversion_3, 3, 2, 1, 1)
|
||||
self.cbx_plcworkdir_set_uid = QtWidgets.QCheckBox(self.gb_plc)
|
||||
self.cbx_plcworkdir_set_uid.setObjectName("cbx_plcworkdir_set_uid")
|
||||
self.gridLayout.addWidget(self.cbx_plcworkdir_set_uid, 4, 0, 1, 3)
|
||||
self.lbl_plcprogram = QtWidgets.QLabel(self.gb_plc)
|
||||
self.lbl_plcprogram.setObjectName("lbl_plcprogram")
|
||||
self.gridLayout.addWidget(self.lbl_plcprogram, 0, 0, 1, 3)
|
||||
self.lbl_pythonversion = QtWidgets.QLabel(self.gb_plc)
|
||||
self.lbl_pythonversion.setObjectName("lbl_pythonversion")
|
||||
self.gridLayout.addWidget(self.lbl_pythonversion, 3, 0, 1, 1)
|
||||
self.rbn_pythonversion_2 = QtWidgets.QRadioButton(self.gb_plc)
|
||||
self.rbn_pythonversion_2.setObjectName("rbn_pythonversion_2")
|
||||
self.gridLayout.addWidget(self.rbn_pythonversion_2, 3, 1, 1, 1)
|
||||
self.lbl_plcarguments = QtWidgets.QLabel(self.gb_plc)
|
||||
self.lbl_plcarguments.setObjectName("lbl_plcarguments")
|
||||
self.gridLayout.addWidget(self.lbl_plcarguments, 2, 0, 1, 1)
|
||||
self.txt_plcarguments = QtWidgets.QLineEdit(self.gb_plc)
|
||||
self.txt_plcarguments.setObjectName("txt_plcarguments")
|
||||
self.gridLayout.addWidget(self.txt_plcarguments, 2, 1, 1, 2)
|
||||
self.sbx_plcprogram_watchdog = QtWidgets.QSpinBox(self.gb_plc)
|
||||
self.sbx_plcprogram_watchdog.setMaximum(600)
|
||||
self.sbx_plcprogram_watchdog.setObjectName("sbx_plcprogram_watchdog")
|
||||
self.gridLayout.addWidget(self.sbx_plcprogram_watchdog, 5, 2, 1, 1)
|
||||
self.lbl_plcprogram_watchdog = QtWidgets.QLabel(self.gb_plc)
|
||||
self.lbl_plcprogram_watchdog.setObjectName("lbl_plcprogram_watchdog")
|
||||
self.gridLayout.addWidget(self.lbl_plcprogram_watchdog, 5, 0, 1, 2)
|
||||
self.verticalLayout.addWidget(self.gb_plc)
|
||||
self.cb_transfair = QtWidgets.QGroupBox(diag_program)
|
||||
self.cb_transfair.setObjectName("cb_transfair")
|
||||
@@ -115,12 +122,14 @@ class Ui_diag_program(object):
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
diag_program.setWindowTitle(_translate("diag_program", "PLC program"))
|
||||
self.gb_plc.setTitle(_translate("diag_program", "PLC program"))
|
||||
self.rbn_pythonversion_2.setText(_translate("diag_program", "Python 2"))
|
||||
self.rbn_pythonversion_3.setText(_translate("diag_program", "Python 3"))
|
||||
self.lbl_plcprogram.setText(_translate("diag_program", "Python PLC start program:"))
|
||||
self.cbx_plcworkdir_set_uid.setText(_translate("diag_program", "Set write permissions for plc program to workdirectory"))
|
||||
self.lbl_plcprogram.setText(_translate("diag_program", "Python PLC start program:"))
|
||||
self.lbl_pythonversion.setText(_translate("diag_program", "Python version:"))
|
||||
self.rbn_pythonversion_2.setText(_translate("diag_program", "Python 2"))
|
||||
self.lbl_plcarguments.setText(_translate("diag_program", "Program arguments:"))
|
||||
self.sbx_plcprogram_watchdog.setSuffix(_translate("diag_program", " sec."))
|
||||
self.lbl_plcprogram_watchdog.setText(_translate("diag_program", "Software watchdog (0=disabled):"))
|
||||
self.cb_transfair.setTitle(_translate("diag_program", "Transfair PLC program"))
|
||||
self.cbb_format.setItemText(0, _translate("diag_program", "ZIP archive"))
|
||||
self.cbb_format.setItemText(1, _translate("diag_program", "TGZ archive"))
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>452</width>
|
||||
<height>503</height>
|
||||
<width>416</width>
|
||||
<height>522</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -27,23 +27,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QSpinBox" name="sbx_autoreloaddelay">
|
||||
<property name="minimum">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>120</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="cbx_zeroonexit">
|
||||
<property name="text">
|
||||
<string>... sucessfully without error</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="cbx_zeroonerror">
|
||||
<property name="text">
|
||||
@@ -58,10 +41,29 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="cbx_autoreload">
|
||||
<item row="8" column="1" colspan="2">
|
||||
<widget class="QComboBox" name="cbb_reset_driver_action">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Do nothing</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Restart after piCtory changed</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Always restart the PLC program</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QLabel" name="lbl_reset_driver_action">
|
||||
<property name="text">
|
||||
<string>Restart PLC program after exit or crash</string>
|
||||
<string>Driver reset action:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -72,9 +74,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1" colspan="2">
|
||||
<widget class="QLineEdit" name="txt_replace_io"/>
|
||||
</item>
|
||||
<item row="6" column="1" colspan="2">
|
||||
<widget class="QComboBox" name="cbb_replace_io">
|
||||
<item>
|
||||
@@ -99,6 +98,13 @@
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="cbx_zeroonexit">
|
||||
<property name="text">
|
||||
<string>... sucessfully without error</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QLabel" name="lbl_plc_delay">
|
||||
<property name="text">
|
||||
@@ -106,6 +112,33 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QSpinBox" name="sbx_autoreloaddelay">
|
||||
<property name="minimum">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>120</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="cbx_autoreload">
|
||||
<property name="text">
|
||||
<string>Restart PLC program after exit or crash</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1" colspan="2">
|
||||
<widget class="QLineEdit" name="txt_replace_io"/>
|
||||
</item>
|
||||
<item row="9" column="0" colspan="3">
|
||||
<widget class="QLabel" name="lbl_lbl_reset_driver_action">
|
||||
<property name="text">
|
||||
<string>PLC program behavior after piCtory driver reset clicked</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>488</width>
|
||||
<height>500</height>
|
||||
<width>400</width>
|
||||
<height>501</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -20,15 +20,8 @@
|
||||
<string>PLC program</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="3" column="1">
|
||||
<widget class="QRadioButton" name="rbn_pythonversion_2">
|
||||
<property name="text">
|
||||
<string>Python 2</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1" colspan="2">
|
||||
<widget class="QLineEdit" name="txt_plcarguments"/>
|
||||
<item row="1" column="0" colspan="3">
|
||||
<widget class="QComboBox" name="cbb_plcprogram"/>
|
||||
</item>
|
||||
<item row="3" column="2">
|
||||
<widget class="QRadioButton" name="rbn_pythonversion_3">
|
||||
@@ -37,13 +30,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="3">
|
||||
<widget class="QLabel" name="lbl_plcprogram">
|
||||
<property name="text">
|
||||
<string>Python PLC start program:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="3">
|
||||
<widget class="QCheckBox" name="cbx_plcworkdir_set_uid">
|
||||
<property name="text">
|
||||
@@ -51,8 +37,12 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="3">
|
||||
<widget class="QComboBox" name="cbb_plcprogram"/>
|
||||
<item row="0" column="0" colspan="3">
|
||||
<widget class="QLabel" name="lbl_plcprogram">
|
||||
<property name="text">
|
||||
<string>Python PLC start program:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="lbl_pythonversion">
|
||||
@@ -61,6 +51,13 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QRadioButton" name="rbn_pythonversion_2">
|
||||
<property name="text">
|
||||
<string>Python 2</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="lbl_plcarguments">
|
||||
<property name="text">
|
||||
@@ -68,6 +65,26 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1" colspan="2">
|
||||
<widget class="QLineEdit" name="txt_plcarguments"/>
|
||||
</item>
|
||||
<item row="5" column="2">
|
||||
<widget class="QSpinBox" name="sbx_plcprogram_watchdog">
|
||||
<property name="suffix">
|
||||
<string> sec.</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>600</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="2">
|
||||
<widget class="QLabel" name="lbl_plcprogram_watchdog">
|
||||
<property name="text">
|
||||
<string>Software watchdog (0=disabled):</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
Reference in New Issue
Block a user