From cee83ba832931779793afdc81435428a38936b15 Mon Sep 17 00:00:00 2001 From: Filippo Cucchetto Date: Sun, 21 Feb 2016 18:15:49 +0100 Subject: [PATCH] Added initial support for qmlRegisterType --- src/nimqml.nim | 1 + src/private/dotherside.nim | 93 ++++++++++++++++++++---------------- src/private/nimqmltypes.nim | 4 +- src/private/qdeclarative.nim | 22 +++++++++ 4 files changed, 78 insertions(+), 42 deletions(-) create mode 100644 src/private/qdeclarative.nim diff --git a/src/nimqml.nim b/src/nimqml.nim index 73ecf80..545f8db 100644 --- a/src/nimqml.nim +++ b/src/nimqml.nim @@ -25,5 +25,6 @@ include private/qhashintbytearray.nim include private/qmodelindex.nim include private/qabstractlistmodel.nim include private/qresource.nim +include private/qdeclarative.nim #var qobjectRegistry = initTable[ptr QObjectObj, bool]() #include private.nimqmlmacros diff --git a/src/private/dotherside.nim b/src/private/dotherside.nim index bb17eb4..6771797 100644 --- a/src/private/dotherside.nim +++ b/src/private/dotherside.nim @@ -1,50 +1,61 @@ type NimQObject = pointer NimQAbstractListModel = pointer - DosQMetaObject* = distinct pointer - DosQObject* = distinct pointer - DosQVariant* = distinct pointer - DosQQmlContext* = distinct pointer - DosQQmlApplicationEngine* = distinct pointer - DosQVariantArray* {.unchecked.} = array[0..0, DosQVariant] + DosQMetaObject = distinct pointer + DosQObject = distinct pointer + DosQVariant = distinct pointer + DosQQmlContext = distinct pointer + DosQQmlApplicationEngine = distinct pointer + DosQVariantArray {.unchecked.} = array[0..0, DosQVariant] DosQMetaType = cint - DosQMetaTypeArray* {.unchecked.} = array[0..0, DosQMetaType] - DosQUrl* = distinct pointer - DosQQuickView* = distinct pointer - DosQHashIntByteArray* = distinct pointer + DosQMetaTypeArray {.unchecked.} = array[0..0, DosQMetaType] + DosQUrl = distinct pointer + DosQQuickView = distinct pointer + DosQHashIntByteArray = distinct pointer DosQModelIndex = distinct pointer DosQAbstractListModel = distinct pointer + DosSignalDefinition = object + name: cstring + parametersCount: cint + parametersMetaTypes: pointer - DosSignalDefinition* = object - name*: cstring - parametersCount*: cint - parametersMetaTypes*: pointer + DosSignalDefinitions = object + count: cint + definitions: pointer - DosSignalDefinitions* = object - count*: cint - definitions*: pointer + DosSlotDefinition = object + name: cstring + returnMetaType: cint + parametersCount: cint + parametersMetaTypes: pointer - DosSlotDefinition* = object - name*: cstring - returnMetaType*: cint - parametersCount*: cint - parametersMetaTypes*: pointer + DosSlotDefinitions = object + count: cint + definitions: pointer - DosSlotDefinitions* = object - count*: cint - definitions*: pointer + DosPropertyDefinition = object + name: cstring + propertyMetaType: cint + readSlot: cstring + writeSlot: cstring + notifySignal: cstring - DosPropertyDefinition* = object - name*: cstring - propertyMetaType*: cint - readSlot*: cstring - writeSlot*: cstring - notifySignal*: cstring + DosPropertyDefinitions = object + count: cint + definitions: pointer - DosPropertyDefinitions* = object - count*: cint - definitions*: pointer + DosCreateCallback = proc(id: cint, nimQObject: var NimQObject, dosQObject: var DosQObject) {.cdecl.} + DosDeleteCallback = proc(id: cint, nimQObject: NimQObject) {.cdecl.} + + DosQmlRegisterType = object + major: cint + minor: cint + uri: cstring + qml: cstring + staticMetaObject: DosQMetaObject + createCallback: DosCreateCallback + deleteCallback: DosDeleteCallback DosQObjectCallBack = proc(nimobject: NimQObject, slotName: DosQVariant, numArguments: cint, arguments: ptr DosQVariantArray) {.cdecl.} @@ -57,8 +68,8 @@ type DosHeaderDataCallback = proc(nimmodel: NimQAbstractListModel, section: cint, orientation: cint, role: cint, result: DosQVariant) {.cdecl.} # Conversion -proc resetToNil*[T](x: var T) = x = nil.pointer.T -proc isNil*[T](x: T): bool = x.pointer == nil +proc resetToNil[T](x: var T) = x = nil.pointer.T +proc isNil[T](x: T): bool = x.pointer == nil # QApplication proc dos_qapplication_create() {.cdecl, importc.} @@ -109,7 +120,7 @@ proc dos_qvariant_setQObject(variant: DosQVariant, value: DosQObject) {.cdecl, i proc dos_chararray_delete(str: cstring) {.cdecl, importc.} # QObject -proc dos_qobject_qmetaobject*(vptr: var DosQmetaObject) {.cdecl, importc.} +proc dos_qobject_qmetaobject(vptr: var DosQmetaObject) {.cdecl, importc.} proc dos_qobject_create(qobject: var DosQObject, nimobject: NimQObject, metaObject: DosQMetaObject, dosQObjectCallback: DosQObjectCallBack) {.cdecl, importc.} proc dos_qobject_objectName(qobject: DosQObject, result: var cstring) {.cdecl, importc.} proc dos_qobject_setObjectName(qobject: DosQObject, name: cstring) {.cdecl, importc.} @@ -117,16 +128,16 @@ proc dos_qobject_signal_emit(qobject: DosQObject, signalName: cstring, arguments proc dos_qobject_delete(qobject: DosQObject) {.cdecl, importc.} # QAbstractListModel -proc dos_qabstractlistmodel_qmetaobject*(vptr: var DosQmetaObject) {.cdecl importc.} +proc dos_qabstractlistmodel_qmetaobject(vptr: var DosQmetaObject) {.cdecl importc.} # QMetaObject -proc dos_qmetaobject_create*(vptr: var DosQmetaObject, +proc dos_qmetaobject_create(vptr: var DosQmetaObject, superclassMetaObject: DosQMetaObject, className: cstring, signalDefinitions: DosSignalDefinitions, slotDefinitions: DosSlotDefinitions, propertyDefinitions: DosPropertyDefinitions) {.cdecl, importc.} -proc dos_qmetaobject_delete*(vptr: DosQmetaObject) {.cdecl, importc.} +proc dos_qmetaobject_delete(vptr: DosQmetaObject) {.cdecl, importc.} # QUrl proc dos_qurl_create(vptr: var DosQUrl, url: cstring, parsingMode: cint) {.cdecl, importc.} @@ -192,3 +203,5 @@ proc dos_qabstractlistmodel_dataChanged(model: DosQAbstractListModel, # QResource proc dos_qresource_register(filename: cstring) {.cdecl, importc.} +# QDeclarative +proc dos_qdeclarative_qmlregistertype(value: ptr DosQmlRegisterType, result: var cint) {.cdecl, importc.} diff --git a/src/private/nimqmltypes.nim b/src/private/nimqmltypes.nim index 7054a5c..2c82f65 100644 --- a/src/private/nimqmltypes.nim +++ b/src/private/nimqmltypes.nim @@ -14,11 +14,11 @@ type ## A QQmlApplicationEngine vptr: DosQQmlApplicationEngine - QApplication = ref object of RootObj ## \ + QApplication* = ref object of RootObj ## \ ## A QApplication deleted: bool - QGuiApplication = ref object of RootObj ## \ + QGuiApplication* = ref object of RootObj ## \ ## A QGuiApplication deleted: bool diff --git a/src/private/qdeclarative.nim b/src/private/qdeclarative.nim new file mode 100644 index 0000000..22f4270 --- /dev/null +++ b/src/private/qdeclarative.nim @@ -0,0 +1,22 @@ +import tables + +var ctorTable = initTable[cint, proc():QObject]() + +proc creator(id: cint, nimQObject:var NimQObject, dosQObject: var DosQObject) {.cdecl.} = + let qobject: QObject = ctorTable[id]() + GC_ref(qobject) + nimQObject = addr(qobject[]) + dosQObject = qobject.vptr + +proc deleter(id: cint, nimQObject: NimQObject) {.cdecl.} = + let qobject = cast[QObject](nimQObject) + GC_unref(qobject) + +proc qmlRegisterType*[T](uri: string, major: int, minor: int, qmlName: string, ctor: proc(): T) {.cdecl.} = + var result: cint = 0 + let metaObject: QMetaObject = T.staticMetaObject() + let dosQmlRegisterType = DosQmlRegisterType(major: major.cint, minor: minor.cint, uri: uri.cstring, + qml: qmlName.cstring, staticMetaObject: metaObject.vptr, + createCallback: creator, deleteCallback: deleter) + dos_qdeclarative_qmlregistertype(dosQmlRegisterType.unsafeAddr, result) + ctorTable[result] = proc(): QObject = ctor().QObject