# -*- 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 <http://www.gnu.org/licenses/>.
@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)