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);
23     qobject.setDisableDosCalls(true);
24 }
25 
26 extern(C) void deleteSafeObject(int id, void* object)
27 {
28     GC.clrAttr(object, GC.BlkAttr.NO_MOVE);
29     GC.removeRoot(object);
30 }
31 
32 int qmlRegisterType(T)(string uri, int major, int minor, string qmlName) if (__traits(compiles, createObject!T))
33 {
34     auto createFunction = &(createSafeObject!T);
35     auto deleteFunction = &deleteSafeObject;
36     auto staticMetaObject = T.staticMetaObject();
37 
38     DosQmlRegisterType args;
39     args.uri = uri.toStringz();
40     args.major = major;
41     args.minor = minor;
42     args.qml = qmlName.toStringz();
43     args.staticMetaObject = staticMetaObject.voidPointer();
44     args.createFunction = createFunction;
45     args.deleteFunction = deleteFunction;
46 
47     return dos_qdeclarative_qmlregistertype(args);
48 }
49 
50 int qmlRegisterSingletonType(T)(string uri, int major, int minor, string qmlName) if (__traits(compiles, createObject!T))
51 {
52     auto createFunction = &(createSafeObject!T);
53     auto deleteFunction = &deleteSafeObject;
54     auto staticMetaObject = T.staticMetaObject();
55 
56     DosQmlRegisterType args;
57     args.uri = uri.toStringz();
58     args.major = major;
59     args.minor = minor;
60     args.qml = qmlName.toStringz();
61     args.staticMetaObject = staticMetaObject.voidPointer();
62     args.createFunction = createFunction;
63     args.deleteFunction = deleteFunction;
64 
65     return dos_qdeclarative_qmlregistersingletontype(args);
66 }