Revision 1 (by moose, 2006/03/06 10:35:57) Initial Import
#include "SciQSettings.h"

#include <QMetaObject>
#include <QMetaMethod>

SciQSettings::SciQSettings(SciQSettings *p, QObject *op)
{
	if(p)
		beginGroup(QString().sprintf("%s/%s/%s/", p->group().toAscii().data(), op->metaObject()->className(), op->objectName().toAscii().data()));
}

SciQSettings::SciQSettings(QObject *p)
{
	if(p)
		beginGroup(QString().sprintf("%s/%s/", p->metaObject()->className(), p->objectName().toAscii().data()));
}

SciQSettings::~SciQSettings() {
	endGroup();
}

void SciQSettings::setValue ( const QString & key, const QVariant & value )
{
	QSettings::setValue(key, value);

	QList<SciQSettings::Method *> methods = mapping.values(key);
	for(int i = 0; i < methods.size(); ++i) {
		methods[i]->invoke(this, key);
	}
}

void SciQSettings::registerMethod(QString key, QObject *o, QString sig)
{
	mapping.insert(key, new SciQSettings::Method(o, sig));
}





SciQSettings::Method::Method(QObject *o, QString sig)
{
	iobj = o;

	QByteArray normalized = QMetaObject::normalizedSignature(sig);

	int index = o->metaObject()->indexOfMethod((const char *)normalized);
	if(index < 0)
		return;

	methname = QString(normalized).section('(', 0, 0);

	QMetaMethod meth = o->metaObject()->method(index);
	QList<QByteArray> argtypes = meth.parameterTypes();

	if(argtypes.count() > 0) {
		printf("Method(): argtypes[0]: %s\n", (const char *)argtypes[0]);
		if(argtypes[0] == "int")
			argtype = "int";
		else
		if(argtypes[0] == "QString")
			argtype = "QString";
		else
		if(argtypes[0] == "double")
			argtype = "double";
		else
		if(argtypes[0] == "bool")
			argtype = "bool";
		else
			argtype = "void";
	} else
		argtype = "void";

	printf("Method(): argtype: %s\n", qPrintable(argtype));
}

SciQSettings::Method::~Method()
{

}

// FIXME: change this stuff to use a QVariant instead of a few fixed types.
void SciQSettings::Method::invoke(SciQSettings *qs, QString key)
{
	if(!iobj)
		return;

	if(argtype == "int") {
		QMetaObject::invokeMethod(iobj, methname, Q_ARG(int, qs->value(key).toInt()));
	} else
	if(argtype == "QString") {
		QMetaObject::invokeMethod(iobj, methname, Q_ARG(QString, qs->value(key).toString()));
	} else
	if(argtype == "double") {
		QMetaObject::invokeMethod(iobj, methname, Q_ARG(double, qs->value(key).toDouble()));
	} else
	if(argtype == "bool") {
		QMetaObject::invokeMethod(iobj, methname, Q_ARG(bool, qs->value(key).toBool()));
	} else
		QMetaObject::invokeMethod(iobj, methname);

	printf("Method::invoke(%s, %s, %s/%s);\n", qPrintable(methname), qPrintable(argtype), qPrintable(qs->group()), qPrintable(key));
}