コード例 #1
0
class SettingsDialog(QDialog):
    """A dialog for choosing clock speed, log verbosity and GUI colors"""

    def __init__(self, mainwindow, config):
        super(SettingsDialog, self).__init__()
        self.setWindowTitle(self.str_title)
        # Reference kept to set settings in MainWindow
        self.mainwindow = mainwindow
        """A reference to the top window of the app."""
        self.config = config
        """The settings of our app."""
        # Setting log handlers
        logHandlers = QGroupBox(self.str_logHandlers)
        logHandlersLayout = QVBoxLayout()
        logHandlers.setLayout(logHandlersLayout)
        logToGui = QCheckBox(self.str_logToGui)
        logToGui.setChecked(self.config.getboolean('LogHandlers', 'gui'))
        logToGui.stateChanged.connect(
            lambda: self.chooseHandler(logToGui, 'gui'))
        logHandlersLayout.addWidget(logToGui)
        logtoStdout = QCheckBox(self.str_logToStdout)
        logtoStdout.setChecked(self.config.getboolean('LogHandlers', 'stdout'))
        logtoStdout.stateChanged.connect(
            lambda: self.chooseHandler(logtoStdout, 'stdout'))
        logHandlersLayout.addWidget(logtoStdout)
        logToFile = QCheckBox(self.str_logToFile)
        logToFile.setChecked(self.config.getboolean('LogHandlers', 'file'))
        logToFile.stateChanged.connect(
            lambda: self.chooseHandler(logToFile, 'file'))
        logHandlersLayout.addWidget(logToFile)
        # Setting log verbosity
        logVerbosity = QGroupBox(self.str_logVerbosity)
        logVerbosityLayout = QHBoxLayout()
        logVerbosity.setLayout(logVerbosityLayout)
        self.verbosityOptions = QTreeWidget()
        self.verbosityOptions.header().setVisible(False)
        for k, v in self.str_treeItems.items():
            node = QTreeWidgetItem(self.verbosityOptions, [k])
            if isinstance(v, str):
                node.setText(1, v)
                node.setCheckState(
                    0, boolToCheckState(
                        self.config.getboolean('LogVerbosity', v)))
            else:
                count = 0
                for key, val in v.items():
                    item = QTreeWidgetItem(node, [key, val])
                    checked = self.config.getboolean('LogVerbosity', val)
                    item.setCheckState(0, boolToCheckState(checked))
                    if checked:
                        count += 1
                if count == node.childCount():
                    node.setCheckState(0, Qt.Checked)
                elif count == 0:
                    node.setCheckState(0, Qt.Unchecked)
                else:
                    node.setCheckState(0, Qt.PartiallyChecked)
        self.verbosityOptions.itemChanged.connect(self.chooseVerbosity)
        logVerbosityLayout.addWidget(self.verbosityOptions)
        # Setting clock speed
        clock = QGroupBox(self.str_clock)
        clockLayout = QHBoxLayout()
        clock.setLayout(clockLayout)
        clockLayout.addWidget(QLabel(self.str_clockSpeed))
        spin = QDoubleSpinBox()
        spin.setValue(self.config.getfloat('Clock', 'speed'))
        clockLayout.addWidget(spin)
        # Setting appearance
        appearance = QGroupBox(self.str_appearance)
        appearanceLayout = QHBoxLayout()
        appearance.setLayout(appearanceLayout)
        appearanceLayout.addWidget(QLabel(self.str_circBgColor))
        circBgBtn = QPushButton(self.str_choose)
        circBgBtn.setPalette(QPalette(
            QColor(self.config.get('Appearance', 'circ_bg_color'))))
        circBgBtn.clicked.connect(
            lambda: self.chooseColor(circBgBtn, 'circ_bg_color'))
        appearanceLayout.addWidget(circBgBtn)
        appearanceLayout.addWidget(QLabel(self.str_logBgColor))
        logBgBtn = QPushButton(self.str_choose)
        logBgBtn.setPalette(QPalette(
            QColor(self.config.get('Appearance', 'log_bg_color'))))
        logBgBtn.clicked.connect(
            lambda: self.chooseColor(logBgBtn, 'log_bg_color'))
        appearanceLayout.addWidget(logBgBtn)
        # Saving settings to file and effectively setting them
        close = QPushButton(self.str_close)
        close.clicked.connect(self.closeAndApply)
        layout = QGridLayout(self)
        layout.addWidget(logHandlers, 0, 0, 1, 1)
        layout.addWidget(logVerbosity, 0, 1, 1, 1)
        layout.addWidget(clock, 1, 0, 1, 2)
        layout.addWidget(appearance, 2, 0, 1, 2)
        layout.addWidget(close, 3, 1, 1, 1)
        self.setLayout(layout)

    def chooseColor(self, button, option):
        """The user modifies an UI background color."""
        color = QColorDialog.getColor()
        if color.isValid():
            button.setPalette(QPalette(color))
            self.config.set('Appearance', option, color.name())

    def chooseHandler(self, checkbox, option):
        """The user chooses where to log messages."""
        self.config.set('LogHandlers', option, str(checkbox.isChecked()))

    def chooseVerbosity(self, item):
        """The user chooses which logs are shown."""
        option = item.text(1)
        if option:
            self.config.set('LogVerbosity', option, str(
                checkStateToBool(item.checkState(0))))
            if isinstance(item.parent(), QTreeWidgetItem):
                count = item.parent().childCount()
                for i in range(item.parent().childCount()):
                    if not checkStateToBool(
                            item.parent().child(i).checkState(0)):
                        count = count - 1
                self.verbosityOptions.blockSignals(True)
                if count == item.parent().childCount():
                    item.parent().setCheckState(0, Qt.Checked)
                elif count == 0:
                    item.parent().setCheckState(0, Qt.Unchecked)
                else:
                    item.parent().setCheckState(0, Qt.PartiallyChecked)
                self.verbosityOptions.blockSignals(False)
        else:
            for i in range(item.childCount()):
                self.verbosityOptions.blockSignals(True)
                item.child(i).setCheckState(0, item.checkState(0))
                self.config.set(
                    'LogVerbosity', item.child(i).text(1),
                    str(checkStateToBool(item.checkState(0))))
                self.verbosityOptions.blockSignals(False)

    def closeAndApply(self):
        """Settings saved to file and applied to GUI."""
        self.mainwindow.setSettings()
        with open(self.config.configFile, 'w+') as f:
            self.config.write(f)
        self.close()