1 /* 2 * DQt - D bindings for the Qt Toolkit 3 * 4 * GNU Lesser General Public License Usage 5 * This file may be used under the terms of the GNU Lesser 6 * General Public License version 3 as published by the Free Software 7 * Foundation and appearing in the file LICENSE.LGPL3 included in the 8 * packaging of this file. Please review the following information to 9 * ensure the GNU Lesser General Public License version 3 requirements 10 * will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 11 */ 12 module qt.core.metaobject; 13 extern(C++): 14 15 import qt.config; 16 import qt.core.bytearray; 17 import qt.core.global; 18 import qt.core.list; 19 import qt.core.metatype; 20 import qt.core.namespace; 21 import qt.core.object; 22 import qt.core.objectdefs; 23 import qt.core.property; 24 import qt.core.typeinfo; 25 import qt.core.variant; 26 import qt.helpers; 27 28 29 /+ #define Q_METAMETHOD_INVOKE_MAX_ARGS 10 +/ 30 31 /// Binding for C++ class [QMetaMethod](https://doc.qt.io/qt-6/qmetamethod.html). 32 @Q_RELOCATABLE_TYPE extern(C++, class) struct /+ Q_CORE_EXPORT +/ QMetaMethod 33 { 34 public: 35 @disable this(); 36 /+pragma(inline, true) this() 37 { 38 this.mobj = null; 39 this.data = { null} ; 40 }+/ 41 42 QByteArray methodSignature() const; 43 QByteArray name() const; 44 const(char)* typeName() const; 45 int returnType() const; 46 QMetaType returnMetaType() const; 47 int parameterCount() const; 48 int parameterType(int index) const; 49 QMetaType parameterMetaType(int index) const; 50 void getParameterTypes(int* types) const; 51 QList!(QByteArray) parameterTypes() const; 52 QByteArray parameterTypeName(int index) const; 53 QList!(QByteArray) parameterNames() const; 54 const(char)* tag() const; 55 enum Access { Private, Protected, Public } 56 Access access() const; 57 enum MethodType { Method, Signal, Slot, Constructor } 58 MethodType methodType() const; 59 enum Attributes { Compatibility = 0x1, Cloned = 0x2, Scriptable = 0x4 } 60 int attributes() const; 61 int methodIndex() const; 62 int relativeMethodIndex() const; 63 int revision() const; 64 bool isConst() const; 65 66 pragma(inline, true) const(QMetaObject)* enclosingMetaObject() const { return mobj; } 67 68 bool invoke(QObject object, 69 /+ Qt:: +/qt.core.namespace.ConnectionType connectionType, 70 QGenericReturnArgument returnValue, 71 QGenericArgument val0 = QGenericArgument(null), 72 QGenericArgument val1 = QGenericArgument(), 73 QGenericArgument val2 = QGenericArgument(), 74 QGenericArgument val3 = QGenericArgument(), 75 QGenericArgument val4 = QGenericArgument(), 76 QGenericArgument val5 = QGenericArgument(), 77 QGenericArgument val6 = QGenericArgument(), 78 QGenericArgument val7 = QGenericArgument(), 79 QGenericArgument val8 = QGenericArgument(), 80 QGenericArgument val9 = QGenericArgument()) const; 81 pragma(inline, true) bool invoke(QObject object, 82 QGenericReturnArgument returnValue, 83 QGenericArgument val0 = QGenericArgument(null), 84 QGenericArgument val1 = QGenericArgument(), 85 QGenericArgument val2 = QGenericArgument(), 86 QGenericArgument val3 = QGenericArgument(), 87 QGenericArgument val4 = QGenericArgument(), 88 QGenericArgument val5 = QGenericArgument(), 89 QGenericArgument val6 = QGenericArgument(), 90 QGenericArgument val7 = QGenericArgument(), 91 QGenericArgument val8 = QGenericArgument(), 92 QGenericArgument val9 = QGenericArgument()) const 93 { 94 return invoke(object, /+ Qt:: +/qt.core.namespace.ConnectionType.AutoConnection, returnValue, 95 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9); 96 } 97 pragma(inline, true) bool invoke(QObject object, 98 /+ Qt:: +/qt.core.namespace.ConnectionType connectionType, 99 QGenericArgument val0 = QGenericArgument(null), 100 QGenericArgument val1 = QGenericArgument(), 101 QGenericArgument val2 = QGenericArgument(), 102 QGenericArgument val3 = QGenericArgument(), 103 QGenericArgument val4 = QGenericArgument(), 104 QGenericArgument val5 = QGenericArgument(), 105 QGenericArgument val6 = QGenericArgument(), 106 QGenericArgument val7 = QGenericArgument(), 107 QGenericArgument val8 = QGenericArgument(), 108 QGenericArgument val9 = QGenericArgument()) const 109 { 110 return invoke(object, connectionType, QGenericReturnArgument(), 111 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9); 112 } 113 pragma(inline, true) bool invoke(QObject object, 114 QGenericArgument val0 = QGenericArgument(null), 115 QGenericArgument val1 = QGenericArgument(), 116 QGenericArgument val2 = QGenericArgument(), 117 QGenericArgument val3 = QGenericArgument(), 118 QGenericArgument val4 = QGenericArgument(), 119 QGenericArgument val5 = QGenericArgument(), 120 QGenericArgument val6 = QGenericArgument(), 121 QGenericArgument val7 = QGenericArgument(), 122 QGenericArgument val8 = QGenericArgument(), 123 QGenericArgument val9 = QGenericArgument()) const 124 { 125 return invoke(object, /+ Qt:: +/qt.core.namespace.ConnectionType.AutoConnection, QGenericReturnArgument(), 126 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9); 127 } 128 bool invokeOnGadget(void* gadget, 129 QGenericReturnArgument returnValue, 130 QGenericArgument val0 = QGenericArgument(null), 131 QGenericArgument val1 = QGenericArgument(), 132 QGenericArgument val2 = QGenericArgument(), 133 QGenericArgument val3 = QGenericArgument(), 134 QGenericArgument val4 = QGenericArgument(), 135 QGenericArgument val5 = QGenericArgument(), 136 QGenericArgument val6 = QGenericArgument(), 137 QGenericArgument val7 = QGenericArgument(), 138 QGenericArgument val8 = QGenericArgument(), 139 QGenericArgument val9 = QGenericArgument()) const; 140 pragma(inline, true) bool invokeOnGadget(void* gadget, 141 QGenericArgument val0 = QGenericArgument(null), 142 QGenericArgument val1 = QGenericArgument(), 143 QGenericArgument val2 = QGenericArgument(), 144 QGenericArgument val3 = QGenericArgument(), 145 QGenericArgument val4 = QGenericArgument(), 146 QGenericArgument val5 = QGenericArgument(), 147 QGenericArgument val6 = QGenericArgument(), 148 QGenericArgument val7 = QGenericArgument(), 149 QGenericArgument val8 = QGenericArgument(), 150 QGenericArgument val9 = QGenericArgument()) const 151 { 152 return invokeOnGadget(gadget, QGenericReturnArgument(), 153 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9); 154 } 155 156 pragma(inline, true) bool isValid() const { return mobj !is null; } 157 158 /+ template <typename PointerToMemberFunction> +/ 159 /+ static inline QMetaMethod fromSignal(PointerToMemberFunction signal) 160 { 161 typedef QtPrivate::FunctionPointer<PointerToMemberFunction> SignalType; 162 static_assert(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value, 163 "No Q_OBJECT in the class with the signal"); 164 return fromSignalImpl(&SignalType::Object::staticMetaObject, 165 reinterpret_cast<void **>(&signal)); 166 } +/ 167 168 private: 169 static QMetaMethod fromSignalImpl(const(QMetaObject)* , void** ); 170 static QMetaMethod fromRelativeMethodIndex(const(QMetaObject)* mobj, int index); 171 static QMetaMethod fromRelativeConstructorIndex(const(QMetaObject)* mobj, int index); 172 173 struct Data { 174 enum { Size = 6 } 175 176 uint name() const { return d[0]; } 177 uint argc() const { return d[1]; } 178 uint parameters() const { return d[2]; } 179 uint tag() const { return d[3]; } 180 uint flags() const { return d[4]; } 181 uint metaTypeOffset() const { return d[5]; } 182 /+bool operator ==(ref const(Data) other) const { return d == other.d; }+/ 183 184 const(uint)* d; 185 } 186 this(const(QMetaObject)* metaObject, ref const(Data) data_) 187 { 188 this.mobj = metaObject; 189 this.data = data_; 190 } 191 192 const(QMetaObject)* mobj = null; 193 Data data = {null}; 194 /+ friend class QMetaMethodPrivate; +/ 195 /+ friend struct QMetaObject; +/ 196 /+ friend struct QMetaObjectPrivate; +/ 197 /+ friend class QObject; +/ 198 /+ friend bool operator==(const QMetaMethod &m1, const QMetaMethod &m2) noexcept 199 { return m1.data == m2.data; } +/ 200 /+ friend bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2) noexcept 201 { return !(m1 == m2); } +/ 202 mixin(CREATE_CONVENIENCE_WRAPPERS); 203 } 204 /+ Q_DECLARE_TYPEINFO(QMetaMethod, Q_RELOCATABLE_TYPE); +/ 205 206 /// Binding for C++ class [QMetaEnum](https://doc.qt.io/qt-6/qmetaenum.html). 207 @Q_RELOCATABLE_TYPE extern(C++, class) struct /+ Q_CORE_EXPORT +/ QMetaEnum 208 { 209 public: 210 @disable this(); 211 /+pragma(inline, true) this() 212 { 213 this.mobj = null; 214 this.data = { null} ; 215 }+/ 216 217 const(char)* name() const; 218 const(char)* enumName() const; 219 bool isFlag() const; 220 bool isScoped() const; 221 222 int keyCount() const; 223 const(char)* key(int index) const; 224 int value(int index) const; 225 226 //const(char)* scope_() const; 227 228 int keyToValue(const(char)* key, bool* ok = null) const; 229 const(char)* valueToKey(int value) const; 230 int keysToValue(const(char)* keys, bool* ok = null) const; 231 QByteArray valueToKeys(int value) const; 232 233 pragma(inline, true) const(QMetaObject)* enclosingMetaObject() const { return mobj; } 234 235 pragma(inline, true) bool isValid() const { return name() !is null; } 236 237 /+ template<typename T> +/ 238 /+ static QMetaEnum fromType() 239 { 240 static_assert(QtPrivate::IsQEnumHelper<T>::Value, 241 "QMetaEnum::fromType only works with enums declared as " 242 "Q_ENUM, Q_ENUM_NS, Q_FLAG or Q_FLAG_NS"); 243 const QMetaObject *metaObject = qt_getEnumMetaObject(T()); 244 const char *name = qt_getEnumName(T()); 245 return metaObject->enumerator(metaObject->indexOfEnumerator(name)); 246 } +/ 247 248 private: 249 struct Data { 250 enum { Size = 5 } 251 quint32 name() const { return d[0]; } 252 quint32 alias_() const { return d[1]; } 253 quint32 flags() const { return d[2]; } 254 qint32 keyCount() const { return static_cast!(qint32)(d[3]); } 255 quint32 data() const { return d[4]; } 256 257 const(uint)* d; 258 } 259 260 this(const(QMetaObject)* mobj, int index); 261 262 const(QMetaObject)* mobj = null; 263 Data data = {null}; 264 /+ friend struct QMetaObject; +/ 265 /+ friend struct QMetaObjectPrivate; +/ 266 mixin(CREATE_CONVENIENCE_WRAPPERS); 267 } 268 /+ Q_DECLARE_TYPEINFO(QMetaEnum, Q_RELOCATABLE_TYPE); +/ 269 270 /// Binding for C++ class [QMetaProperty](https://doc.qt.io/qt-6/qmetaproperty.html). 271 extern(C++, class) struct /+ Q_CORE_EXPORT +/ QMetaProperty 272 { 273 public: 274 @disable this(); 275 /+this() 276 { 277 this.mobj = null; 278 this.data = { null} ; 279 }+/ 280 281 const(char)* name() const; 282 const(char)* typeName() const; 283 /+ #if QT_DEPRECATED_SINCE(6, 0) 284 QT_WARNING_PUSH 285 QT_WARNING_DISABLE_DEPRECATED +/ 286 /+ QT_DEPRECATED_VERSION_6_0 +/ 287 QVariant.Type type() const 288 { int t = userType(); return t >= QMetaType.Type.User ? QVariant.Type.UserType : cast(QVariant.Type)(t); } 289 /+ QT_WARNING_POP 290 #endif +/ 291 int userType() const { return typeId(); } 292 int typeId() const { return metaType().id(); } 293 QMetaType metaType() const; 294 int propertyIndex() const; 295 int relativePropertyIndex() const; 296 297 bool isReadable() const; 298 bool isWritable() const; 299 bool isResettable() const; 300 bool isDesignable() const; 301 bool isScriptable() const; 302 bool isStored() const; 303 bool isUser() const; 304 bool isConstant() const; 305 bool isFinal() const; 306 bool isRequired() const; 307 bool isBindable() const; 308 309 bool isFlagType() const; 310 bool isEnumType() const; 311 QMetaEnum enumerator() const; 312 313 bool hasNotifySignal() const; 314 QMetaMethod notifySignal() const; 315 int notifySignalIndex() const; 316 317 int revision() const; 318 319 mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{ 320 QVariant read(const(QObject) obj) const; 321 })); 322 bool write(QObject obj, ref const(QVariant) value) const; 323 bool reset(QObject obj) const; 324 325 QUntypedBindable bindable(QObject object) const; 326 327 QVariant readOnGadget(const(void)* gadget) const; 328 bool writeOnGadget(void* gadget, ref const(QVariant) value) const; 329 bool resetOnGadget(void* gadget) const; 330 331 bool hasStdCppSet() const; 332 bool isAlias() const; 333 pragma(inline, true) bool isValid() const { return isReadable(); } 334 pragma(inline, true) const(QMetaObject)* enclosingMetaObject() const { return mobj; } 335 336 private: 337 int registerPropertyType() const; 338 339 struct Data { 340 enum { Size = 5 } 341 342 uint name() const { return d[0]; } 343 uint type() const { return d[1]; } 344 uint flags() const { return d[2]; } 345 uint notifyIndex() const { return d[3]; } 346 uint revision() const { return d[4]; } 347 348 int index(const(QMetaObject)* mobj) const; 349 350 const(uint)* d; 351 } 352 353 this(const(QMetaObject)* mobj, int index); 354 //static Data getMetaPropertyData(const(QMetaObject)* mobj, int index); 355 356 const(QMetaObject)* mobj = null; 357 Data data = {null}; 358 QMetaEnum menum; 359 /+ friend struct QMetaObject; +/ 360 /+ friend struct QMetaObjectPrivate; +/ 361 mixin(CREATE_CONVENIENCE_WRAPPERS); 362 } 363 364 /// Binding for C++ class [QMetaClassInfo](https://doc.qt.io/qt-6/qmetaclassinfo.html). 365 @Q_RELOCATABLE_TYPE extern(C++, class) struct /+ Q_CORE_EXPORT +/ QMetaClassInfo 366 { 367 public: 368 @disable this(); 369 /+pragma(inline, true) this() 370 { 371 this.mobj = null; 372 this.data = { null} ; 373 }+/ 374 const(char)* name() const; 375 const(char)* value() const; 376 pragma(inline, true) const(QMetaObject)* enclosingMetaObject() const { return mobj; } 377 378 private: 379 struct Data { 380 enum { Size = 2 } 381 382 uint name() const { return d[0]; } 383 uint value() const { return d[1]; } 384 385 const(uint)* d; 386 } 387 388 const(QMetaObject)* mobj = null; 389 Data data = {null}; 390 /+ friend struct QMetaObject; +/ 391 mixin(CREATE_CONVENIENCE_WRAPPERS); 392 } 393 /+ Q_DECLARE_TYPEINFO(QMetaClassInfo, Q_RELOCATABLE_TYPE); +/ 394