#include <QWidget>
#include <QButtonGroup>
#include <QLineEdit>
#include <QComboBox>
#include <QSpinBox>
#include <QSlider>
#include <QAbstractButton>
#include <QSignalMapper>
#include <QFont>
#include <QGroupBox>
#include "SciQSettingsPage.h"
#include "SciQSettingsLvItem.h"
#include "SciQUtil.h"
SciQSettingsPage::SciQSettingsPage(SciQSettingsLvItem *li, QWidget * parent) : QScrollArea(parent), lvi(li), modified(false), sm(this)
{
connect(&sm, SIGNAL(mapped(const QString &)), this, SIGNAL(mapped(const QString &)));
connect(this, SIGNAL(mapped(const QString &)), this, SLOT(mappedSlot(const QString &)));
qs.beginGroup(QString("settings/") + li->text(1));
setFrameShadow(QFrame::Plain);
setFrameShape(QFrame::NoFrame);
setLineWidth(0);
frame = new QWidget(this);
setWidget(frame);
setWidgetResizable(true);
}
SciQSettingsPage::~SciQSettingsPage() { /*qs.endGroup(); */ /*delete lvi;*/ }
void SciQSettingsPage::setModified(bool m)
{
modified = m;
}
void SciQSettingsPage::mappedSlot(const QString &l)
{
qDebug("mappedSlot: %s %s", qPrintable(l), widgets.contains(l) ? "true" : "false");
if(!widgets.contains(l))
return;
widgets[l].setChanged(true);
QFont fnt = lvi->font(0);
fnt.setBold(1);
lvi->setFont(0, fnt);
modified = true;
emit settingsChanged(this);
}
void SciQSettingsPage::applySettings()
{
if(!modified)
return;
QHashIterator<QString, Map> i(widgets);
while (i.hasNext()) {
i.next();
Map m = i.value();
if(m.isChanged()) {
applySetting(i.key());
m.setChanged(false);
}
}
QFont fnt = lvi->font(0);
fnt.setBold(0);
lvi->setFont(0, fnt);
modified = false;
emit settingsApplied(this);
}
void SciQSettingsPage::applySetting(const QString &l)
{
if(!widgets.contains(l))
return;
QObject *wid = widgets[l].wid;
if(QAbstractButton *cb = qobject_cast<QAbstractButton *>(wid)) {
qs.setValue(l, cb->isChecked());
} else
if(QButtonGroup *bg = qobject_cast<QButtonGroup *>(wid)) {
QAbstractButton *ab = bg->checkedButton();
if(ab)
qs.setValue(l, ab->text());
else
qDebug("WTFH?????????????????????");
} else
if(QLineEdit *le = qobject_cast<QLineEdit *>(wid)) {
qs.setValue(l, le->text());
} else
if(QComboBox *cb = qobject_cast<QComboBox *>(wid)) {
qs.setValue(l, cb->currentText());
} else
if(QAbstractSpinBox *sb = qobject_cast<QSpinBox *>(wid)) {
qs.setValue(l, sb->text());
} else
if(QAbstractSlider *sl = qobject_cast<QAbstractSlider *>(wid)) {
qs.setValue(l, sl->value());
} else
if(QGroupBox *gb = qobject_cast<QGroupBox *>(wid)) {
qs.setValue(l+"/checkable", gb->isCheckable());
qs.setValue(l+"/checked", gb->isChecked());
}
else {
qDebug("%s::applySetting(): don't know how to apply settings for a '%s'", metaObject()->className(), wid->metaObject()->className());
}
}
void SciQSettingsPage::loadSettings()
{
// if(!modified)
// return;
QHashIterator<QString, Map> i(widgets);
while (i.hasNext()) {
i.next();
loadSetting(i.key());
Map m = i.value(); m.setChanged(false);
}
QFont fnt = lvi->font(0);
fnt.setBold(0);
lvi->setFont(0, fnt);
modified = false;
}
void SciQSettingsPage::loadSetting(const QString &l)
{
if(!widgets.contains(l))
return;
QObject *wid = widgets[l].wid;
if(QAbstractButton *cb = qobject_cast<QAbstractButton *>(wid)) {
cb->setChecked(qs.value(l).toBool());
} else
if(QButtonGroup *bg = qobject_cast<QButtonGroup *>(wid)) {
QList<QAbstractButton *> btns = bg->buttons();
for(int i = 0; i < btns.size(); ++i) {
if(btns.at(i)->text() == l) {
btns.at(i)->setChecked(true);
break;
}
}
} else
if(QLineEdit *le = qobject_cast<QLineEdit *>(wid)) {
le->setText(qs.value(l).toString());
} else
if(QComboBox *cb = qobject_cast<QComboBox *>(wid)) {
int item = cb->findText(qs.value(l).toString());
qDebug("item: %s == %s == %i", qPrintable(l), qPrintable(qs.value(l).toString()), item);
cb->setCurrentIndex(item);
} else
if(QSpinBox *sb = qobject_cast<QSpinBox *>(wid)) {
sb->setValue(qs.value(l).toInt());
} else
if(QAbstractSlider *sl = qobject_cast<QAbstractSlider *>(wid)) {
sl->setValue(qs.value(l).toInt());
} else
if(QGroupBox *gb = qobject_cast<QGroupBox *>(wid)) {
qDebug("gb: checkable:%i, checked:%i", qs.value(l+"/checkable").toBool(), qs.value(l+"/checked").toBool());
gb->setCheckable(qs.value(l+"/checkable").toBool());
gb->setChecked(qs.value(l+"/checked").toBool());
}
else {
qDebug("%s::loadSetting(): don't know how to load settings for a '%s'", metaObject()->className(), wid->metaObject()->className());
}
}
//void SciQSettingsPage::registerSetting(QWidget *widget)
//{
//}
//void SciQSettingsPage::registerSetting(QString &l, QPushButton *widget)
//{
//}
void SciQSettingsPage::registerSetting(QGroupBox *widget, QString name)
{
// widget->setCheckable(qs.value(name+"/checkable").toBool());
// This one doesn't make sense, the checkability of a group is up to the ui designer, not the user...
widget->setChecked(qs.value(name+"/checked").toBool());
widgets[name] = Map(widget);
connect(widget, SIGNAL(toggled(bool)), &sm, SLOT(map()));
sm.setMapping(widget, name);
}
void SciQSettingsPage::registerSetting(QAbstractButton *widget, QString name)
{
widget->setChecked(qs.value(name).toBool());
widgets[name] = Map(widget);
connect(widget, SIGNAL(toggled(bool)), &sm, SLOT(map()));
sm.setMapping(widget, name);
}
void SciQSettingsPage::registerSetting(QButtonGroup *widget, QString name)
{
QList<QAbstractButton *> btns = widget->buttons();
for(int i = 0; i < btns.size(); ++i) {
if(btns.at(i)->text() == name) {
btns.at(i)->setChecked(true);
break;
}
}
widgets[name] = Map(widget);
connect(widget, SIGNAL(buttonClicked(QAbstractButton*)), &sm, SLOT(map()));
sm.setMapping(widget, name);
}
void SciQSettingsPage::registerSetting(QLineEdit *widget, QString name)
{
widget->setText(qs.value(name).toString());
widgets[name] = Map(widget);
connect(widget, SIGNAL(editingFinished()), &sm, SLOT(map()));
sm.setMapping(widget, name);
}
void SciQSettingsPage::registerSetting(QComboBox *widget, QString name)
{
widget->setCurrentIndex(qs.value(name).toInt());
widgets[name] = Map(widget);
connect(widget, SIGNAL(activated(int)), &sm, SLOT(map()));
sm.setMapping(widget, name);
}
void SciQSettingsPage::registerSetting(QSpinBox *widget, QString name)
{
widget->setValue(qs.value(name).toInt());
widgets[name] = Map(widget);
connect(widget, SIGNAL(editingFinished()), &sm, SLOT(map()));
sm.setMapping(widget, name);
}
void SciQSettingsPage::registerSetting(QAbstractSlider *widget, QString name)
{
widget->setValue(qs.value(name).toInt());
widgets[name] = Map(widget);
connect(widget, SIGNAL(valueChanged(int)), &sm, SLOT(map()));
sm.setMapping(widget, name);
}
QString SciQSettingsPage::objectKey(QObject *o)
{
QHashIterator<QString, Map> i(widgets);
while (i.hasNext()) {
i.next();
qDebug("objectKey(): wid:%x, o:%x", i.value().wid, o);
if(i.value().wid == o)
return i.key();
}
return QString();
}