1
|
from PyQt5 import QtCore
|
2
|
from PyQt5.QtCore import QSettings, QSize
|
3
|
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QDialogButtonBox, QGroupBox, QFormLayout, QLabel, QLineEdit, QSpinBox, \
|
4
|
QCheckBox, QPushButton, QListWidget, QListWidgetItem
|
5
|
|
6
|
DEFAULT_HOST = "localhost"
|
7
|
DEFAULT_PORT = 1883
|
8
|
DEFAULT_KEEPALIVE = 60
|
9
|
DEFAULT_ANONYMOUS = True
|
10
|
DEFAULT_USERNAME = ""
|
11
|
DEFAULT_PASSWORD = ""
|
12
|
DEFAULT_TOPICS = ["/home/1", "/home/2"]
|
13
|
DEFAULT_TIMEOUT = 60
|
14
|
|
15
|
|
16
|
def get_settings():
|
17
|
settings = QSettings('settings.ini', QSettings.IniFormat)
|
18
|
return settings
|
19
|
|
20
|
|
21
|
class SettingsDialog(QDialog):
|
22
|
"""
|
23
|
Settings dialog.
|
24
|
In settings dialog is possible to change settings of application.
|
25
|
"""
|
26
|
topics = DEFAULT_TOPICS
|
27
|
|
28
|
def __init__(self):
|
29
|
"""
|
30
|
Constructor
|
31
|
"""
|
32
|
super(SettingsDialog, self).__init__(None,
|
33
|
QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint)
|
34
|
self.settings = get_settings()
|
35
|
self.setWindowTitle("Settings")
|
36
|
self.setMinimumSize(QSize(600, 500))
|
37
|
|
38
|
connectionGroupBox = QGroupBox("Connection")
|
39
|
connectionLayout = QFormLayout()
|
40
|
self.hostInput = QLineEdit(self.settings.value("connection_host", DEFAULT_HOST, str))
|
41
|
connectionLayout.addRow(QLabel("Host:"), self.hostInput)
|
42
|
self.portInput = QSpinBox()
|
43
|
self.portInput.setMaximum(65535)
|
44
|
self.portInput.setValue(self.settings.value("connection_port", DEFAULT_PORT, int))
|
45
|
connectionLayout.addRow(QLabel("Port:"), self.portInput)
|
46
|
self.keepaliveInput = QSpinBox()
|
47
|
self.keepaliveInput.setMaximum(1000)
|
48
|
self.keepaliveInput.setValue(self.settings.value("connection_keepalive", DEFAULT_KEEPALIVE, int))
|
49
|
connectionLayout.addRow(QLabel("Keepalive(s):"), self.keepaliveInput)
|
50
|
self.anonymousInput = QCheckBox()
|
51
|
self.anonymousInput.setChecked(self.settings.value("connection_anonymous", DEFAULT_ANONYMOUS, bool))
|
52
|
self.anonymousInput.stateChanged.connect(self.anonymousChanged)
|
53
|
connectionLayout.addRow(QLabel("Anonymous:"), self.anonymousInput)
|
54
|
self.usernameInput = QLineEdit(self.settings.value("connection_username", DEFAULT_USERNAME, str))
|
55
|
connectionLayout.addRow(QLabel("Username:"), self.usernameInput)
|
56
|
self.passwordInput = QLineEdit(self.settings.value("connection_password", DEFAULT_PASSWORD, str))
|
57
|
connectionLayout.addRow(QLabel("Password:"), self.passwordInput)
|
58
|
self.anonymousChanged()
|
59
|
connectionGroupBox.setLayout(connectionLayout)
|
60
|
|
61
|
topicsGroupBox = QGroupBox("Topics")
|
62
|
topicsLayout = QFormLayout()
|
63
|
|
64
|
self.topics = self.settings.value("topics_items", DEFAULT_TOPICS, list)
|
65
|
self.topicsListWidget = QListWidget()
|
66
|
for topic in self.topics:
|
67
|
item = QListWidgetItem()
|
68
|
item.setText(topic)
|
69
|
item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
|
70
|
self.topicsListWidget.addItem(item)
|
71
|
|
72
|
topicsLayout.addRow(self.topicsListWidget)
|
73
|
add = QPushButton("Add")
|
74
|
add.setFixedWidth(60)
|
75
|
add.clicked.connect(self.addTopic)
|
76
|
remove = QPushButton("Remove")
|
77
|
remove.setFixedWidth(60)
|
78
|
remove.clicked.connect(self.removeTopic)
|
79
|
topicsLayout.addRow(add, remove)
|
80
|
|
81
|
self.timeoutInput = QSpinBox()
|
82
|
self.timeoutInput.setMaximum(1000)
|
83
|
self.timeoutInput.setToolTip("Unsubscribe topic and close file when there is not new message after this "
|
84
|
"timeout (in seconds) expires")
|
85
|
timeoutLabel = QLabel("Topic timeout(s):")
|
86
|
timeoutLabel.setToolTip("Unsubscribe topic and close file when there is not new message after this "
|
87
|
"timeout (in seconds) expires")
|
88
|
self.timeoutInput.setValue(self.settings.value("topics_timeout", DEFAULT_TIMEOUT, int))
|
89
|
topicsLayout.addRow(timeoutLabel, self.timeoutInput)
|
90
|
|
91
|
topicsGroupBox.setLayout(topicsLayout)
|
92
|
|
93
|
buttonBox = QDialogButtonBox()
|
94
|
buttonBox.addButton("Save and Reconnect", QDialogButtonBox.AcceptRole)
|
95
|
buttonBox.addButton("Cancel", QDialogButtonBox.RejectRole)
|
96
|
buttonBox.accepted.connect(self.accept)
|
97
|
buttonBox.rejected.connect(self.reject)
|
98
|
|
99
|
mainLayout = QVBoxLayout()
|
100
|
mainLayout.addWidget(connectionGroupBox)
|
101
|
mainLayout.addWidget(topicsGroupBox)
|
102
|
mainLayout.addWidget(buttonBox)
|
103
|
self.setLayout(mainLayout)
|
104
|
|
105
|
def addTopic(self):
|
106
|
"""
|
107
|
Add topic
|
108
|
"""
|
109
|
item = QListWidgetItem()
|
110
|
item.setText("/topic")
|
111
|
item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
|
112
|
self.topicsListWidget.addItem(item)
|
113
|
|
114
|
def removeTopic(self):
|
115
|
"""
|
116
|
Remove topic
|
117
|
"""
|
118
|
for item in self.topicsListWidget.selectedItems():
|
119
|
self.topicsListWidget.takeItem(self.topicsListWidget.row(item))
|
120
|
|
121
|
def anonymousChanged(self):
|
122
|
"""
|
123
|
Changing anonymous/user status
|
124
|
"""
|
125
|
self.usernameInput.setEnabled(not self.anonymousInput.isChecked())
|
126
|
self.passwordInput.setEnabled(not self.anonymousInput.isChecked())
|
127
|
|
128
|
def accept(self) -> None:
|
129
|
"""
|
130
|
Accept changes
|
131
|
"""
|
132
|
super().accept()
|
133
|
self.topics = []
|
134
|
for index in range(self.topicsListWidget.count()):
|
135
|
self.topics.append(self.topicsListWidget.item(index).text())
|
136
|
|
137
|
self.settings.setValue("topics_items", self.topics)
|
138
|
self.settings.setValue("topics_timeout", self.timeoutInput.value())
|
139
|
self.settings.setValue("connection_host", self.hostInput.text())
|
140
|
self.settings.setValue("connection_port", self.portInput.value())
|
141
|
self.settings.setValue("connection_keepalive", self.keepaliveInput.value())
|
142
|
self.settings.setValue("connection_anonymous", self.anonymousInput.isChecked())
|
143
|
self.settings.setValue("connection_username", self.usernameInput.text())
|
144
|
self.settings.setValue("connection_password", self.passwordInput.text())
|