@@ -502,16 +502,106 @@ pub fn qml_register_type<T: QObject + Default + Sized>(
502
502
} )
503
503
}
504
504
505
- /// Wrapper around [`void qmlRegisterModule(const char *uri, int versionMajor, int versionMinor)`][qt] function.
505
+ /// Register the given type as an uncreatable QML type
506
506
///
507
- /// [qt]: https://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterModule
508
- #[ cfg( qt_5_9) ]
509
- pub fn qml_register_module (
507
+ /// Refer to the Qt documentation for QQmlEngine::qmlRegisterUncreatableType.
508
+ pub fn qml_register_uncreatable_type < T : QObject + Sized > (
510
509
uri : & CStr ,
511
510
version_major : u32 ,
512
511
version_minor : u32 ,
512
+ qml_name : & CStr ,
513
+ no_creation_reason : & CStr ,
513
514
) {
514
515
let uri_ptr = uri. as_ptr ( ) ;
516
+ let qml_name_ptr = qml_name. as_ptr ( ) ;
517
+ let no_creation_reason_ptr = no_creation_reason. as_ptr ( ) ;
518
+ let meta_object = T :: static_meta_object ( ) ;
519
+
520
+ extern "C" fn extra_destruct ( c : * mut c_void ) {
521
+ cpp ! ( unsafe [ c as "QObject *" ] {
522
+ QQmlPrivate :: qdeclarativeelement_destructor( c) ;
523
+ } )
524
+ }
525
+
526
+ let size = T :: cpp_size ( ) ;
527
+
528
+ let type_id = <RefCell < T > as PropertyType >:: register_type ( Default :: default ( ) ) ;
529
+
530
+ cpp ! ( unsafe [
531
+ qml_name_ptr as "char *" ,
532
+ uri_ptr as "char *" ,
533
+ version_major as "int" ,
534
+ version_minor as "int" ,
535
+ meta_object as "const QMetaObject *" ,
536
+ size as "size_t" ,
537
+ type_id as "int" ,
538
+ no_creation_reason_ptr as "char *"
539
+ ] {
540
+ // BEGIN: From QML_GETTYPENAMES
541
+ // FIXME: list type?
542
+ /*const int listLen = int(strlen("QQmlListProperty<"));
543
+ QVarLengthArray<char,64> listName(listLen + nameLen + 2);
544
+ memcpy(listName.data(), "QQmlListProperty<", size_t(listLen));
545
+ memcpy(listName.data()+listLen, className, size_t(nameLen));
546
+ listName[listLen+nameLen] = '>';
547
+ listName[listLen+nameLen+1] = '\0';*/
548
+ // END
549
+
550
+ int parserStatusCast = meta_object && qmeta_inherits( meta_object, & QQuickItem :: staticMetaObject)
551
+ ? QQmlPrivate :: StaticCastSelector <QQuickItem , QQmlParserStatus >:: cast( )
552
+ : -1 ;
553
+
554
+ QQmlPrivate :: RegisterType api = {
555
+ /*version*/ 0 ,
556
+
557
+ #if QT_VERSION < QT_VERSION_CHECK ( 6 , 0 , 0 )
558
+ /*typeId*/ type_id,
559
+ #else
560
+ /*typeId*/ QMetaType ( type_id) ,
561
+ #endif
562
+ /*listId*/ { } , // FIXME: list type?
563
+ /*objectSize*/ int( size) ,
564
+ /*create*/ nullptr,
565
+ #if QT_VERSION >= QT_VERSION_CHECK ( 6 , 0 , 0 )
566
+ /* userdata */ nullptr,
567
+ #endif
568
+ /*noCreationReason*/ no_creation_reason_ptr,
569
+ #if QT_VERSION >= QT_VERSION_CHECK ( 6 , 0 , 0 )
570
+ /* createValueType */ nullptr,
571
+ #endif
572
+
573
+ /*uri*/ uri_ptr,
574
+ #if QT_VERSION < QT_VERSION_CHECK ( 6 , 0 , 0 )
575
+ /*versionMajor*/ version_major,
576
+ /*versionMinor*/ version_minor,
577
+ #else
578
+ /*version*/ QTypeRevision :: fromVersion( version_major, version_minor) ,
579
+ #endif
580
+ /*elementName*/ qml_name_ptr,
581
+ /*metaObject*/ meta_object,
582
+
583
+ /*attachedPropertiesFunction*/ nullptr,
584
+ /*attachedPropertiesMetaObject*/ nullptr,
585
+
586
+ /*parserStatusCast*/ parserStatusCast,
587
+ /*valueSourceCast*/ -1 ,
588
+ /*valueInterceptorCast*/ -1 ,
589
+
590
+ /*extensionObjectCreate*/ nullptr,
591
+ /*extensionMetaObject*/ nullptr,
592
+ /*customParser*/ nullptr,
593
+ /*revision*/ { } // FIXME: support revisions?
594
+ } ;
595
+ QQmlPrivate :: qmlregister( QQmlPrivate :: TypeRegistration , & api) ;
596
+ } )
597
+ }
598
+
599
+ /// Wrapper around [`void qmlRegisterModule(const char *uri, int versionMajor, int versionMinor)`][qt] function.
600
+ ///
601
+ /// [qt]: https://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterModule
602
+ #[ cfg( qt_5_9) ]
603
+ pub fn qml_register_module ( uri : & CStr , version_major : u32 , version_minor : u32 ) {
604
+ let uri_ptr = uri. as_ptr ( ) ;
515
605
516
606
cpp ! ( unsafe [
517
607
uri_ptr as "const char *" ,
0 commit comments