# -*- coding: utf-8 -*- """ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . @author: mkaay """ from PyQt4.QtCore import * from PyQt4.QtGui import * from sip import delete class SettingsWidget(QWidget): def __init__(self): QWidget.__init__(self) self.connector = None self.sections = {} self.psections = {} self.data = None self.pdata = None self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) def setConnector(self, connector): self.connector = connector def loadConfig(self): if self.sections and self.psections: self.data = self.connector.getConfig() self.pdata = self.connector.getPluginConfig() self.reloadSection(self.sections, self.data) self.reloadSection(self.psections, self.pdata) return if self.layout(): delete(self.layout()) for s in self.sections.values()+self.psections.values(): delete(s) self.sections = {} self.setLayout(QVBoxLayout()) self.clearConfig() layout = self.layout() layout.setSizeConstraint(QLayout.SetMinAndMaxSize) general = QTabWidget() self.general = general plugins = QTabWidget() self.plugins = plugins tab = QTabWidget() self.tab = tab gw = QWidget() gw.setLayout(QVBoxLayout()) gw.layout().addWidget(self.general) pw = QWidget() pw.setLayout(QVBoxLayout()) pw.layout().addWidget(self.plugins) tab.addTab(gw, _("General")) tab.addTab(pw, _("Plugins")) layout.addWidget(tab) self.data = self.connector.getConfig() self.pdata = self.connector.getPluginConfig() for k, section in self.data.iteritems(): s = Section(section, general) self.sections[k] = s for k, section in self.pdata.iteritems(): s = Section(section, plugins, "plugin") self.psections[k] = s rel = QPushButton(_("Reload")) save = QPushButton(_("Save")) layout.addWidget(save) cont = QHBoxLayout() cont.addWidget(rel) cont.addWidget(save) layout.addLayout(cont) self.connect(save, SIGNAL("clicked()"), self.saveConfig) self.connect(rel, SIGNAL("clicked()"), self.loadConfig) def clearConfig(self): self.sections = {} def reloadSection(self, sections, pdata): for k, section in enumerate(pdata): if k in sections: widget = sections[k] for item in section.items: if item.name in widget.inputs: i = widget.inputs[item.name] if item.type == "int": i.setValue(int(item.value)) elif not item.type.find(";") == -1: i.setCurrentIndex(i.findText(item.value)) elif item.type == "bool": if True if item.value.lower() in ("1","true", "on", "an","yes") else False: i.setCurrentIndex(0) else: i.setCurrentIndex(1) else: i.setText(item.value) def saveConfig(self): self.data = self.connector.getConfig() self.pdata = self.connector.getPluginConfig() self.saveSection(self.sections, self.data) self.saveSection(self.psections, self.pdata, "plugin") def saveSection(self, sections, pdata, sec="core"): for k, section in enumerate(pdata): if k in sections: widget = sections[k] for item in section.items: if item.name in widget.inputs: i = widget.inputs[item.name] #TODO : unresolved reference: option if item.type == "int": if i.value() != int(item.value): self.connector.setConfigValue(k, option, i.value(), sec) elif not item.type.find(";") == -1: if i.currentText() != item.value: self.connector.setConfigValue(k, option, i.currentText(), sec) elif item.type == "bool": if (True if item.value.lower() in ("1","true", "on", "an","yes") else False) ^ (not i.currentIndex()): self.connector.setConfigValue(k, option, not i.currentIndex(), sec) else: if i.text() != item.value: self.connector.setConfigValue(k, option, str(i.text()), sec) class Section(QGroupBox): def __init__(self, data, parent, ctype="core"): self.data = data QGroupBox.__init__(self, data.description, parent) self.labels = {} self.inputs = {} self.ctype = ctype layout = QFormLayout(self) self.setLayout(layout) sw = QWidget() sw.setLayout(QVBoxLayout()) sw.layout().addWidget(self) sa = QScrollArea() sa.setWidgetResizable(True) sa.setWidget(sw) sa.setFrameShape(sa.NoFrame) parent.addTab(sa, data.description) for option in self.data.items: if option.type == "int": i = QSpinBox(self) i.setMaximum(999999) i.setValue(int(option.value)) elif not option.type.find(";") == -1: choices = option.type.split(";") i = QComboBox(self) i.addItems(choices) i.setCurrentIndex(i.findText(option.value)) elif option.type == "bool": i = QComboBox(self) i.addItem(_("Yes"), QVariant(True)) i.addItem(_("No"), QVariant(False)) if True if option.value.lower() in ("1","true", "on", "an","yes") else False: i.setCurrentIndex(0) else: i.setCurrentIndex(1) else: i = QLineEdit(self) i.setText(option.value) layout.addRow(option.description, i) layout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow)