| 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));
}