Mercurial > projects > qtd
diff d2/qt/core/QMetaObject.d @ 372:a032df77b6ab
Simple debug helper. Unittests. Meta-object for polymorphic non-QObjects
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Thu, 08 Jul 2010 17:19:05 +0300 |
parents | 6e1857c521af |
children | e67ce7c21758 |
line wrap: on
line diff
--- a/d2/qt/core/QMetaObject.d Sun Jul 04 14:17:49 2010 +0100 +++ b/d2/qt/core/QMetaObject.d Thu Jul 08 17:19:05 2010 +0300 @@ -9,6 +9,7 @@ qtd.Marshal, qtd.MOC, qtd.String, + qtd.Signal, std.typetuple, std.traits, std.c.stdlib; @@ -85,32 +86,7 @@ } } -/** - Base class for QtD meta-classes. - */ -abstract class QtdMetaClass : MetaClass -{ -private: - void* nativeId_; -public: - - this() {} - - /** - */ - @property - void* nativeId() - { - return nativeId_; - } - - void construct(T)() - { - super.construct!T(); - nativeId_ = T.qtd_nativeStaticMetaObject(); - } -} struct QMetaObjectNative { @@ -120,6 +96,20 @@ void *extradata; } +// COMPILER BUG: causes a forward reference error if placed inside QMetaObject +enum MetaCall +{ + InvokeMetaMethod, + ReadProperty, + WriteProperty, + ResetProperty, + QueryPropertyDesignable, + QueryPropertyScriptable, + QueryPropertyStored, + QueryPropertyEditable, + QueryPropertyUser, + CreateInstance +} /** */ @@ -127,24 +117,8 @@ { alias typeof(this) This; - private QObject function(void* nativeId) _createWrapper; - this() {} - enum Call - { - InvokeMetaMethod, - ReadProperty, - WriteProperty, - ResetProperty, - QueryPropertyDesignable, - QueryPropertyScriptable, - QueryPropertyStored, - QueryPropertyEditable, - QueryPropertyUser, - CreateInstance - } - alias createImpl!This create; void construct(T : QObject)() @@ -158,12 +132,6 @@ else alias T Concrete; - _createWrapper = function QObject(void* nativeId) { - auto obj = new Concrete(nativeId, cast(QtdObjectFlags)(QtdObjectFlags.nativeOwnership | QtdObjectFlags.dynamicEntity)); - T.__createEntity(nativeId, cast(void*)obj); - return obj; - }; - T._populateMetaInfo(this); } // create run time meta-objects for user-defined signals and slots @@ -277,7 +245,7 @@ return this; } - QObject getObject(void* nativeObjId) + override QObject getWrapper(void* nativeObjId, QtdObjectInitFlags initFlags = QtdObjectInitFlags.none) { QObject result; @@ -289,7 +257,7 @@ auto moId = qtd_QObject_metaObject(nativeObjId); auto nId = nativeId; if (nId == moId) - result = _createWrapper(nativeObjId); + result = static_cast!QObject(_createWrapper(nativeObjId, initFlags)); else { // get native metaobjects for the entire derivation lattice @@ -311,7 +279,8 @@ while (moCount > 0) moIds[--moCount] = moId = qtd_QMetaObject_superClass(moId); - result = lookUpDerived(moIds)._createWrapper(nativeObjId); + auto mo = lookUpDerived(moIds); + result = static_cast!QObject(mo._createWrapper(nativeObjId, initFlags)); } } } @@ -321,19 +290,19 @@ 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); + qtd_QMetaObject_activate_3(sender.qtdNativeId, 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); + qtd_QMetaObject_activate_4(sender.qtdNativeId, m.nativeId, from_local_signal_index, to_local_signal_index, argv); } static bool connect(const QObject sender, int signal_index, const QObject receiver, int method_index, int type = 0, int *types = null) { - return qtd_QMetaObject_connect(sender.__nativeId, signal_index, receiver.__nativeId, method_index, type, types); + return qtd_QMetaObject_connect(sender.qtdNativeId, signal_index, receiver.qtdNativeId, method_index, type, types); } int indexOfMethod_Cpp(string method) @@ -425,6 +394,7 @@ */ mixin template Q_CLASSINFO(string name, string value) { + import qtd.meta.Compiletime; mixin InnerAttribute!("Q_CLASSINFO", AttributeOptions.allowMultiple, name, value); } @@ -435,44 +405,6 @@ static assert(false, "not implemented"); } -version (QtdUnittest) -{ - // COMPILER BUG: cannot put this inside the unittest block as static class. - class QMetaObject_A : QObject - { - mixin Q_CLASSINFO!("author", "Sabrina Schweinsteiger"); - mixin Q_CLASSINFO!("url", "http://doc.moosesoft.co.uk/1.0/"); - - static int slot1Called; - - final - { - void signal_signal1(); - void signal_signal2(int); - } - - - void slot_slot1() - { - slot1Called++; - } - - mixin Q_OBJECT; - } - - unittest - { - scope a = new QMetaObject_A; - QObject.connect(a, "signal1", a, "slot1"); - a.signal1(); - assert(QMetaObject_A.slot1Called == 1); - - QObject.connect(a, "signal2", a, "slot1"); - a.signal2(42); - assert(QMetaObject_A.slot1Called == 2); - } - } - extern(C) void qtd_QMetaObject_activate_3(void* sender, void* m, int local_signal_index, void **argv); extern(C) void qtd_QMetaObject_activate_4(void *sender, void* m, int from_local_signal_index, int to_local_signal_index, void **argv); extern(C) bool qtd_QMetaObject_connect(const void* sender, int signal_index,