Projekt

Obecné

Profil

Stáhnout (5.96 KB) Statistiky
| Větev: | Tag: | Revize:
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())
(4-4/4)