Revision 1 (by moose, 2006/03/06 10:35:57) Initial Import
#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();
}