Mercurial > projects > qtd
diff d2/qt/core/QMetaObject.d @ 365:958e8b9a89bd
Changeset a084e2df3776 is broken. Backing out.
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Fri, 11 Jun 2010 20:09:25 +0300 |
parents | a084e2df3776 |
children | da4235301224 |
line wrap: on
line diff
--- a/d2/qt/core/QMetaObject.d Fri Jun 11 12:16:09 2010 +0300 +++ b/d2/qt/core/QMetaObject.d Fri Jun 11 20:09:25 2010 +0300 @@ -13,11 +13,11 @@ std.typetuple, std.c.stdlib; -class QMetaArgument : MetaBase +class QMetaArgument : Meta { } -class QMetaMethod : MetaBase +class QMetaMethod : Meta { alias typeof(this) This; @@ -84,31 +84,9 @@ } } -/** - Base class for QtD meta-classes. - */ -abstract class QtdMetaClass : MetaClass +class MetaObject : MetaType { -private: - void* nativeId_; - - this() {} - -public: - - /** - */ - @property - void* nativeId() - { - return nativeId_; - } - - /* internal */ void construct(T)() - { - super.construct!T(); - nativeId_ = T.qtd_nativeMetaObject; - } + MetaObject _base; } struct QMetaObjectNative @@ -121,10 +99,12 @@ class QMetaException : Exception { this(string msg) { super(msg); } } -final class QMetaObject : QtdMetaClass +final class QMetaObject { alias typeof(this) This; + private this() {} + enum Call { InvokeMetaMethod, @@ -141,13 +121,40 @@ private { + QMetaObjectNative* _nativeId; + QMetaObject _base; // super class + QMetaObject _firstDerived; // head of the linked list of derived classes + QMetaObject _next; // next sibling on this derivation level QMetaMethod[] _methods; + ClassInfo _classInfo; + QObject function(void* nativeId) _createWrapper; } - void construct(T : QObject)() + private void addDerived(QMetaObject mo) + { + mo._next = _firstDerived; + _firstDerived = mo; + } + + // ctor + void construct(T : QObject)(void* nativeId) { - super.construct!T(); + alias BaseClassesTuple!(T)[0] Base; + This base; + static if (is(Base : QObject)) + base = Base.staticMetaObject; + + _nativeId = cast(QMetaObjectNative*)nativeId; + T.setStaticMetaObject(this); + + if (base) + { + base.addDerived(this); + _base = base; + } + _classInfo = T.classinfo; + static if (isQtType!T) { @@ -164,11 +171,9 @@ T._populateMetaInfo; } - // create run time meta-objects for user-defined signals and slots else static if (is(typeof(T.methods))) { - alias BaseClassesTuple!(T)[0] Base; int index = Base.staticMetaObject().methodCount(); static if (T.signals.length) @@ -191,41 +196,35 @@ } } - /* internal */ alias createImpl!This create; - - /** - */ - @property - override This base() + // new + static This create(T : QObject)(void* nativeId) { - return super.base; + auto m = new This(); + m.construct!T(nativeId); + return m; } - /** - */ - @property - override This firstDerived() + /++ + +/ + QMetaObject base() { - return super.firstDerived; + return _base; } - /** - */ - @property - override This next() + /++ + +/ + QMetaObjectNative* nativeId() { - return super.next; + return _nativeId; } - /** - */ - @property - override QMetaObjectNative* nativeId() + /++ + +/ + ClassInfo classInfo() { - return cast(QMetaObjectNative*)super.nativeId; + return _classInfo; } - @property const (QMetaMethod[]) methods() { return _methods; @@ -241,8 +240,8 @@ foreach (method; _methods) if (method.signature == slot) return method; - if (base) - return base.lookUpMethod(slot); + if (_base) + return _base.lookUpMethod(slot); else return null; } @@ -252,8 +251,8 @@ foreach (method; _methods) if (method.signature == signal && cast(QMetaSignal)method) return cast(QMetaSignal)method; - if (base) - return base.lookUpSignal(signal); + if (_base) + return _base.lookUpSignal(signal); else return null; } @@ -264,8 +263,8 @@ foreach (method; _methods) if (method.name == methodName) result ~= method; - if (base) - result ~= base.lookUpMethodOverloads(methodName); + if (_base) + result ~= _base.lookUpMethodOverloads(methodName); return result; } @@ -275,8 +274,8 @@ foreach (method; _methods) if (method.name == signalName && cast(QMetaSignal)method) result ~= cast(QMetaSignal)method; - if (base) - result ~= base.lookUpSignalOverloads(signalName); + if (_base) + result ~= _base.lookUpSignalOverloads(signalName); return result; } @@ -284,9 +283,9 @@ { assert (moIds.length >= 1); - for (auto mo = firstDerived; mo !is null; mo = mo.next) + for (auto mo = _firstDerived; mo !is null; mo = mo._next) { - if (mo.nativeId == moIds[0]) + if (mo._nativeId == moIds[0]) { if (moIds.length == 1) // exact match found return mo; @@ -309,9 +308,8 @@ result = cast(QObject)qtd_get_d_qobject(nativeObjId); if (!result) { - auto nId = nativeId; auto moId = qtd_QObject_metaObject(nativeObjId); - if (nId == moId) + if (_nativeId == moId) result = _createWrapper(nativeObjId); else { @@ -323,7 +321,7 @@ { tmp = qtd_QMetaObject_superClass(tmp); assert(tmp); - if (tmp == nId) + if (tmp == _nativeId) break; moCount++; } @@ -361,12 +359,12 @@ int indexOfMethod_Cpp(string method) { - return qtd_QMetaObject_indexOfMethod(nativeId, toStringz(method)); + return qtd_QMetaObject_indexOfMethod(_nativeId, toStringz(method)); } int methodCount() { - return qtd_QMetaObject_methodCount(nativeId); + return qtd_QMetaObject_methodCount(_nativeId); } static void connectImpl(QObject sender, string signalString, QObject receiver, string methodString, int type)