1 module dqml.qmetaobject; 2 3 import dqml.dothersideinterface; 4 import dqml.qmetatype; 5 import std.string; 6 7 public struct SignalDefinition 8 { 9 this(string name, QMetaType[] types) 10 { 11 this.name = name; 12 this.parametersTypes = types; 13 } 14 15 string name; 16 QMetaType[] parametersTypes; 17 } 18 19 public struct SlotDefinition 20 { 21 this(string name, QMetaType returnType, QMetaType[] parametersTypes) 22 { 23 this.name = name; 24 this.returnType = returnType; 25 this.parametersTypes = parametersTypes; 26 } 27 28 string name; 29 QMetaType returnType; 30 QMetaType[] parametersTypes; 31 } 32 33 public struct PropertyDefinition 34 { 35 this(string name, QMetaType type, string readSlot, string writeSlot, string notifySignal) 36 { 37 this.name = name; 38 this.type = type; 39 this.readSlot = readSlot; 40 this.writeSlot = writeSlot; 41 this.notifySignal = notifySignal; 42 } 43 44 string name; 45 QMetaType type; 46 string readSlot; 47 string writeSlot; 48 string notifySignal; 49 } 50 51 public class QMetaObject 52 { 53 public this(void* vptr) 54 { 55 this.vptr = vptr; 56 } 57 58 public this(QMetaObject superClass, 59 string className, 60 SignalDefinition[] signalDefinitions, 61 SlotDefinition[] slotDefinitions, 62 PropertyDefinition[] propertyDefinitions) 63 { 64 this.signalDefinitions = signalDefinitions; 65 this.slotDefinitions = slotDefinitions; 66 this.propertyDefinitions = propertyDefinitions; 67 68 auto dosSignalDefinitionsArray = convert(signalDefinitions); 69 DosSignalDefinitions dosSignalDefinitions; 70 dosSignalDefinitions.count = cast(int) dosSignalDefinitionsArray.length; 71 dosSignalDefinitions.definitions = dosSignalDefinitionsArray.ptr; 72 73 auto dosSlotDefinitionsArray = convert(slotDefinitions); 74 DosSlotDefinitions dosSlotDefinitions; 75 dosSlotDefinitions.count = cast(int) dosSlotDefinitionsArray.length; 76 dosSlotDefinitions.definitions = dosSlotDefinitionsArray.ptr; 77 78 auto propertyDefinitionsArray = convert(propertyDefinitions); 79 DosPropertyDefinitions dosPropertyDefinitions; 80 dosPropertyDefinitions.count = cast(int) propertyDefinitionsArray.length; 81 dosPropertyDefinitions.definitions = propertyDefinitionsArray.ptr; 82 83 this.vptr = dos_qmetaobject_create(superClass.vptr, 84 className.toStringz(), 85 dosSignalDefinitions, 86 dosSlotDefinitions, 87 dosPropertyDefinitions); 88 } 89 90 public ~this() 91 { 92 dos_qmetaobject_delete(this.vptr); 93 } 94 95 @property SignalDefinition[] signals() { return signalDefinitions; } 96 @property SlotDefinition[] slots() { return slotDefinitions; } 97 @property PropertyDefinition[] properties() { return propertyDefinitions; } 98 99 private DosSignalDefinition[] convert(SignalDefinition[] definitions) 100 { 101 DosSignalDefinition[] result; 102 foreach (SignalDefinition definition; definitions) { 103 DosSignalDefinition dosDefinition; 104 dosDefinition.name = definition.name.toStringz(); 105 dosDefinition.parametersCount = cast(int)definition.parametersTypes.length; 106 dosDefinition.parametersTypes = cast(int*)definition.parametersTypes.ptr; 107 result ~= dosDefinition; 108 } 109 return result; 110 } 111 112 private DosSlotDefinition[] convert(SlotDefinition[] definitions) 113 { 114 DosSlotDefinition[] result; 115 foreach (SlotDefinition definition; definitions) { 116 DosSlotDefinition dosDefinition; 117 dosDefinition.name = definition.name.toStringz(); 118 dosDefinition.returnType = definition.returnType; 119 dosDefinition.parametersCount = cast(int)definition.parametersTypes.length; 120 dosDefinition.parametersTypes = cast(int*)definition.parametersTypes.ptr; 121 result ~= dosDefinition; 122 } 123 return result; 124 } 125 126 private DosPropertyDefinition[] convert(PropertyDefinition[] definitions) 127 { 128 DosPropertyDefinition[] result; 129 foreach (PropertyDefinition definition; definitions) { 130 DosPropertyDefinition dosDefinition; 131 dosDefinition.name = definition.name.toStringz(); 132 dosDefinition.type = definition.type; 133 dosDefinition.readSlot = definition.readSlot.toStringz(); 134 dosDefinition.writeSlot = definition.writeSlot.toStringz(); 135 dosDefinition.notifySignal = definition.notifySignal.toStringz(); 136 result ~= dosDefinition; 137 } 138 return result; 139 } 140 141 public void* voidPointer() 142 { 143 return this.vptr; 144 } 145 146 private void* vptr; 147 private PropertyDefinition[] propertyDefinitions; 148 private SignalDefinition[] signalDefinitions; 149 private SlotDefinition[] slotDefinitions; 150 }