1 module dqml.qdeclarative;
2 
3 import dqml.dothersideinterface;
4 import dqml.qobject;
5 import std.string;
6 import std.traits;
7 import std.stdio;
8 import core.memory;
9 
10 QObject createObject(T)()
11 {
12     return new T();
13 }
14 
15 extern(C) void createSafeObject(T)(int id, void* wrapper, ref void* dObject, ref void* dosQObject)
16 {
17     QObject qobject = createObject!T();
18     GC.addRoot(cast(void*)qobject);
19     GC.setAttr(cast(void*)qobject, GC.BlkAttr.NO_MOVE);
20     dObject = cast(void*)(qobject);
21     dosQObject = qobject.voidPointer();
22     qobject.setVoidPointer(wrapper, false);
23 }
24 
25 extern(C) void deleteSafeObject(int id, void* object)
26 {
27     GC.clrAttr(object, GC.BlkAttr.NO_MOVE);
28     GC.removeRoot(object);
29 }
30 
31 int qmlRegisterType(T)(string uri, int major, int minor, string qmlName) if (__traits(compiles, createObject!T))
32 {
33     auto createFunction = &(createSafeObject!T);
34     auto deleteFunction = &deleteSafeObject;
35     auto staticMetaObject = T.staticMetaObject();
36 
37     DosQmlRegisterType args;
38     args.uri = uri.toStringz();
39     args.major = major;
40     args.minor = minor;
41     args.qml = qmlName.toStringz();
42     args.staticMetaObject = staticMetaObject.voidPointer();
43     args.createFunction = createFunction;
44     args.deleteFunction = deleteFunction;
45 
46     return dos_qdeclarative_qmlregistertype(args);
47 }
48 
49 int qmlRegisterSingletonType(T)(string uri, int major, int minor, string qmlName) if (__traits(compiles, createObject!T))
50 {
51     auto createFunction = &(createSafeObject!T);
52     auto deleteFunction = &deleteSafeObject;
53     auto staticMetaObject = T.staticMetaObject();
54 
55     DosQmlRegisterType args;
56     args.uri = uri.toStringz();
57     args.major = major;
58     args.minor = minor;
59     args.qml = qmlName.toStringz();
60     args.staticMetaObject = staticMetaObject.voidPointer();
61     args.createFunction = createFunction;
62     args.deleteFunction = deleteFunction;
63 
64     return dos_qdeclarative_qmlregistersingletontype(args);
65 }