Mercurial > projects > qtd
diff d2/qt/core/QMetaObject.d @ 357:9784459f0750
An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables
Q_CLASSINFO implementation
Now Qtd can be built on Windows
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Wed, 02 Jun 2010 19:38:05 +0300 |
parents | 31520b2c0b3c |
children | a084e2df3776 |
line wrap: on
line diff
--- a/d2/qt/core/QMetaObject.d Tue May 25 20:14:04 2010 +0300 +++ b/d2/qt/core/QMetaObject.d Wed Jun 02 19:38:05 2010 +0300 @@ -1,15 +1,17 @@ module qt.core.QMetaObject; -import qt.QGlobal; -import qt.core.QObject; -import qtd.QtdObject; - -import std.algorithm; -import std.string; -import std.stdio; - -import qtd.meta.Runtime; -import qtd.Marshal; +import + qt.QGlobal, + qt.core.QObject, + qtd.QtdObject, + std.algorithm, + qtd.meta.Runtime, + qtd.meta.Compiletime, + qtd.Marshal, + qtd.MOC, + std.string, + std.typetuple, + std.c.stdlib; class QMetaArgument : Meta { @@ -22,13 +24,13 @@ // QMetaArgument[] arguments; string signature; int indexOfMethod; - + this(string signature_, int indexOfMethod_) { signature = signature_; indexOfMethod = indexOfMethod_; } - + string args() const { int openBracket = indexOf(signature, '('); @@ -37,7 +39,7 @@ else return ""; } - + string name() const { int openBracket = indexOf(signature, '('); @@ -55,7 +57,7 @@ class QMetaSignal : QMetaMethod { alias typeof(this) This; - + this(string signature_, int indexOfMethod_) { super(signature_, indexOfMethod_); @@ -70,7 +72,7 @@ class QMetaSlot : QMetaMethod { alias typeof(this) This; - + this(string signature_, int indexOfMethod_) { super(signature_, indexOfMethod_); @@ -102,7 +104,7 @@ alias typeof(this) This; private this() {} - + enum Call { InvokeMetaMethod, @@ -116,7 +118,7 @@ QueryPropertyUser, CreateInstance } - + private { QMetaObjectNative* _nativeId; @@ -208,7 +210,7 @@ { return _base; } - + /++ +/ QMetaObjectNative* nativeId() @@ -222,17 +224,17 @@ { return _classInfo; } - + const (QMetaMethod[]) methods() { return _methods; } - + void addMethod(QMetaMethod method_) { _methods ~= method_; } - + QMetaMethod lookUpMethod(string slot) { foreach (method; _methods) @@ -243,7 +245,7 @@ else return null; } - + QMetaSignal lookUpSignal(string signal) { foreach (method; _methods) @@ -276,11 +278,11 @@ result ~= _base.lookUpSignalOverloads(signalName); return result; } - + private QMetaObject lookupDerived(void*[] moIds) { assert (moIds.length >= 1); - + for (auto mo = _firstDerived; mo !is null; mo = mo._next) { if (mo._nativeId == moIds[0]) @@ -291,19 +293,19 @@ return mo.lookupDerived(moIds[1..$]); } } - + // no initialized wrapper that matches the native object. // use the base class wrapper return this; } - + QObject getObject(void* nativeObjId) { QObject result; if (nativeObjId) { - result = cast(QObject)qtd_get_d_qobject(nativeObjId); + result = cast(QObject)qtd_get_d_qobject(nativeObjId); if (!result) { auto moId = qtd_QObject_metaObject(nativeObjId); @@ -317,9 +319,9 @@ for (void* tmp = moId;;) { - tmp = qtd_QMetaObject_superClass(tmp); + tmp = qtd_QMetaObject_superClass(tmp); assert(tmp); - if (tmp == _nativeId) + if (tmp == _nativeId) break; moCount++; } @@ -337,12 +339,12 @@ return result; } - + static void activate(QObject sender, QMetaObject m, int local_signal_index, void **argv) { qtd_QMetaObject_activate_3(sender.__nativeId, m.nativeId, local_signal_index, argv); } - + static void activate(QObject sender, QMetaObject m, int from_local_signal_index, int to_local_signal_index, void **argv) { qtd_QMetaObject_activate_4(sender.__nativeId, m.nativeId, from_local_signal_index, to_local_signal_index, argv); @@ -354,7 +356,7 @@ { return qtd_QMetaObject_connect(sender.__nativeId, signal_index, receiver.__nativeId, method_index, type, types); } - + int indexOfMethod_Cpp(string method) { return qtd_QMetaObject_indexOfMethod(_nativeId, toStringz(method)); @@ -423,11 +425,33 @@ { int signalIndex = signal.indexOfMethod; int methodIndex = method.indexOfMethod; + success = QMetaObject.connect(sender, signalIndex, receiver, methodIndex, type); } if(!success) - throw new QMetaException("QMetaObject: Signal " ~ signalString ~ " and slot " ~ methodString ~ " cannot be found"); + throw new QMetaException("QMetaObject: Signal " ~ signalString ~ " cannot be connected to slot " ~ methodString); + } +} + +/** + */ +mixin template Q_CLASSINFO(string name, string value) +{ + mixin InnerAttribute!("Q_CLASSINFO", AttributeOptions.allowMultiple, name, value); +} + +version (QtdUnittest) +{ + unittest + { + static class Test : QObject + { + mixin Q_CLASSINFO!("author", "Sabrina Schweinsteiger"); + mixin Q_CLASSINFO!("url", "http://doc.moosesoft.co.uk/1.0/"); + + mixin Q_OBJECT; + } } }