Mercurial > projects > qtd
diff qt/core/QMetaObject.d @ 288:f9559a957be9 signals
new signals and slots implementation
author | eldar |
---|---|
date | Sun, 08 Nov 2009 19:28:01 +0000 |
parents | 073b9153ed8a |
children | 7c2cf27391c4 |
line wrap: on
line diff
--- a/qt/core/QMetaObject.d Sun Nov 08 19:20:53 2009 +0000 +++ b/qt/core/QMetaObject.d Sun Nov 08 19:28:01 2009 +0000 @@ -4,14 +4,96 @@ import qt.core.QObject; import qt.QtdObject; +import std.algorithm; + +class Meta +{ + string name; +} + +class MetaType : Meta +{ + this() + { + } +} + +class MetaVariable : Meta +{ + MetaType type; +} + +class MetaCallable : Meta { } + +class MetaMethod : Meta { } + +class QMetaArgument : MetaVariable { } + +class QMetaMethod : MetaMethod +{ +// QMetaArgument[] arguments; + string signature; + int indexOfMethod; + + this(string signature_, int indexOfMethod_) + { + signature = signature_; + indexOfMethod = indexOfMethod_; + } +} + +class QMetaSignal : QMetaMethod +{ + this(string signature_, int indexOfMethod_) + { + super(signature_, indexOfMethod_); + } +} + +class QMetaSlot : QMetaMethod +{ + this(string signature_, int indexOfMethod_) + { + super(signature_, indexOfMethod_); + } +} + +class MetaObject : MetaType +{ + MetaObject _base; +} + +struct QMetaObjectNative +{ + QMetaObjectNative *superdata; + immutable(char) *stringdata; + const(uint) *data; + void *extradata; +} + final class QMetaObject { + enum Call + { + InvokeMetaMethod, + ReadProperty, + WriteProperty, + ResetProperty, + QueryPropertyDesignable, + QueryPropertyScriptable, + QueryPropertyStored, + QueryPropertyEditable, + QueryPropertyUser, + CreateInstance + } + private { - void* _nativeId; + 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; @@ -24,7 +106,7 @@ } // NOTE: construction is split between this non-templated constructor and 'construct' function below. - this(void* nativeId, QMetaObject base) + this(QMetaObjectNative* nativeId, QMetaObject base) { _nativeId = nativeId; if (base) @@ -57,7 +139,7 @@ /++ +/ - void* nativeId() + QMetaObjectNative* nativeId() { return _nativeId; } @@ -69,6 +151,39 @@ return _classInfo; } + const (QMetaMethod[]) methods() + { + return _methods; + } + + void addMethod(QMetaMethod method_) + { + _methods ~= method_; + } + + int lookUpMethod(string slot) + { + foreach (method; _methods) + if (method.signature == slot) + return method.indexOfMethod; + if (_base) + return _base.lookUpMethod(slot); + else + return -1; + } + + int lookUpSignal(string signal) + { +// auto signalBegin = signal[0..$-1]; + foreach (method; _methods) + if (method.signature == signal && cast(QMetaSignal)method) + return method.indexOfMethod; + if (_base) + return _base.lookUpSignal(signal); + else + return -1; + } + private QMetaObject lookupDerived(void*[] moIds) { assert (moIds.length >= 1); @@ -123,12 +238,49 @@ moIds[--moCount] = moId = qtd_QMetaObject_superClass(moId); result = lookupDerived(moIds)._createWrapper(nativeObjId); - } + } } } 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); + } + + 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); + } + + int indexOfMethod_Cpp(string method) + { + return qtd_QMetaObject_indexOfMethod(_nativeId, toStringz(method)); + } + + int methodCount() + { + return qtd_QMetaObject_methodCount(_nativeId); + } + } +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, + const void* receiver, int method_index, + int type, int *types); + +extern(C) int qtd_QMetaObject_indexOfMethod(void *nativeId, const(char) *method); +extern(C) int qtd_QMetaObject_methodCount(void *nativeId); + extern(C) void* qtd_QMetaObject_superClass(void* nativeId); \ No newline at end of file