From 9438c9d038bd8d8775f3dab1c1453d28287844b9 Mon Sep 17 00:00:00 2001 From: Filippo Cucchetto Date: Sun, 9 Apr 2017 11:57:24 +0200 Subject: [PATCH] Synched with the qaim changes --- examples/abstractitemmodel/mylistmodel.nim | 9 +-- examples/contactapp/contactlist.nim | 6 +- src/nimqml.nim | 2 + src/private/dotherside.nim | 74 ++++++++++++++++------ src/private/nimqmltypes.nim | 6 ++ src/private/qabstractitemmodel.nim | 41 +++++++++++- src/private/qabstractlistmodel.nim | 57 +++++++++++++++++ src/private/qabstracttablemodel.nim | 47 ++++++++++++++ src/private/qmetaobject.nim | 12 ++++ 9 files changed, 224 insertions(+), 30 deletions(-) create mode 100644 src/private/qabstractlistmodel.nim create mode 100644 src/private/qabstracttablemodel.nim diff --git a/examples/abstractitemmodel/mylistmodel.nim b/examples/abstractitemmodel/mylistmodel.nim index b9da1ff..a88dc67 100644 --- a/examples/abstractitemmodel/mylistmodel.nim +++ b/examples/abstractitemmodel/mylistmodel.nim @@ -6,23 +6,20 @@ type QtObject: type - MyListModel* = ref object of QAbstractItemModel + MyListModel* = ref object of QAbstractListModel names*: seq[string] proc delete(self: MyListModel) = - self.QAbstractItemModel.delete + self.QAbstractListModel.delete proc setup(self: MyListModel) = - self.QAbstractItemModel.setup + self.QAbstractListModel.setup proc newMyListModel*(): MyListModel = new(result, delete) result.names = @["John", "Max", "Paul", "Anna"] result.setup - method columnCount(self: MyListModel, index: QModelIndex = nil): int = - return 1 - method rowCount(self: MyListModel, index: QModelIndex = nil): int = return self.names.len diff --git a/examples/contactapp/contactlist.nim b/examples/contactapp/contactlist.nim index 724f6fb..6262652 100644 --- a/examples/contactapp/contactlist.nim +++ b/examples/contactapp/contactlist.nim @@ -7,17 +7,17 @@ type QtObject: type - ContactList* = ref object of QAbstractItemModel + ContactList* = ref object of QAbstractListModel contacts*: seq[Contact] proc delete(self: ContactList) = - self.QAbstractItemModel.delete + self.QAbstractListModel.delete for contact in self.contacts: contact.delete self.contacts = @[] proc setup(self: ContactList) = - self.QAbstractItemModel.setup + self.QAbstractListModel.setup proc newContactList*(): ContactList = new(result, delete) diff --git a/src/nimqml.nim b/src/nimqml.nim index 7aa46d3..175cc4c 100644 --- a/src/nimqml.nim +++ b/src/nimqml.nim @@ -24,6 +24,8 @@ include private/qquickview.nim include private/qhashintbytearray.nim include private/qmodelindex.nim include private/qabstractitemmodel.nim +include private/qabstractlistmodel.nim +include private/qabstracttablemodel.nim include private/qresource.nim include private/qdeclarative.nim include private/nimqmlmacros.nim diff --git a/src/private/dotherside.nim b/src/private/dotherside.nim index 0a7917e..64fe630 100644 --- a/src/private/dotherside.nim +++ b/src/private/dotherside.nim @@ -12,6 +12,8 @@ proc getDllName: string = type NimQObject = pointer NimQAbstractItemModel = pointer + NimQAbstractListModel = pointer + NimQAbstractTableModel = pointer DosQMetaObject = distinct pointer DosQObject = distinct pointer DosQObjectWrapper = distinct pointer @@ -26,6 +28,8 @@ type DosQHashIntByteArray = distinct pointer DosQModelIndex = distinct pointer DosQAbstractItemModel = distinct pointer + DosQAbstractTableModel = distinct pointer + DosQAbstractListModel = distinct pointer DosParameterDefinition = object name: cstring @@ -75,15 +79,33 @@ type DosQObjectCallBack = proc(nimobject: NimQObject, slotName: DosQVariant, numArguments: cint, arguments: ptr DosQVariantArray) {.cdecl.} - DosRowCountCallback = proc(nimmodel: NimQAbstractItemModel, rawIndex: DosQModelIndex, result: var cint) {.cdecl.} - DosColumnCountCallback = proc(nimmodel: NimQAbstractItemModel, rawIndex: DosQModelIndex, result: var cint) {.cdecl.} - DosDataCallback = proc(nimmodel: NimQAbstractItemModel, rawIndex: DosQModelIndex, role: cint, result: DosQVariant) {.cdecl.} - DosSetDataCallback = proc(nimmodel: NimQAbstractItemModel, rawIndex: DosQModelIndex, value: DosQVariant, role: cint, result: var bool) {.cdecl.} - DosRoleNamesCallback = proc(nimmodel: NimQAbstractItemModel, result: DosQHashIntByteArray) {.cdecl.} - DosFlagsCallback = proc(nimmodel: NimQAbstractItemModel, index: DosQModelIndex, result: var cint) {.cdecl.} - DosHeaderDataCallback = proc(nimmodel: NimQAbstractItemModel, section: cint, orientation: cint, role: cint, result: DosQVariant) {.cdecl.} - DosIndexCallback = proc(nimmodel: NimQAbstractItemModel, row: cint, column: cint, parent: DosQModelIndex, result: DosQModelIndex) {.cdecl.} - DosParentCallback = proc(nimmodel: NimQAbstractItemModel, child: DosQModelIndex, result: DosQModelIndex) {.cdecl.} + DosRowCountCallback = proc(nimmodel: NimQAbstractItemModel, rawIndex: DosQModelIndex, result: var cint) {.cdecl.} + DosColumnCountCallback = proc(nimmodel: NimQAbstractItemModel, rawIndex: DosQModelIndex, result: var cint) {.cdecl.} + DosDataCallback = proc(nimmodel: NimQAbstractItemModel, rawIndex: DosQModelIndex, role: cint, result: DosQVariant) {.cdecl.} + DosSetDataCallback = proc(nimmodel: NimQAbstractItemModel, rawIndex: DosQModelIndex, value: DosQVariant, role: cint, result: var bool) {.cdecl.} + DosRoleNamesCallback = proc(nimmodel: NimQAbstractItemModel, result: DosQHashIntByteArray) {.cdecl.} + DosFlagsCallback = proc(nimmodel: NimQAbstractItemModel, index: DosQModelIndex, result: var cint) {.cdecl.} + DosHeaderDataCallback = proc(nimmodel: NimQAbstractItemModel, section: cint, orientation: cint, role: cint, result: DosQVariant) {.cdecl.} + DosIndexCallback = proc(nimmodel: NimQAbstractItemModel, row: cint, column: cint, parent: DosQModelIndex, result: DosQModelIndex) {.cdecl.} + DosParentCallback = proc(nimmodel: NimQAbstractItemModel, child: DosQModelIndex, result: DosQModelIndex) {.cdecl.} + DosHasChildrenCallback = proc(nimmodel: NimQAbstractItemModel, parent: DosQModelIndex, result: var bool) {.cdecl.} + DosCanFetchMoreCallback = proc(nimmodel: NimQAbstractItemModel, parent: DosQModelIndex, result: var bool) {.cdecl.} + DosFetchMoreCallback = proc(nimmodel: NimQAbstractItemModel, parent: DosQModelIndex) {.cdecl.} + + DosQAbstractItemModelCallbacks = object + rowCount: DosRowCountCallback + columnCount: DosColumnCountCallback + data: DosDataCallback + setData: DosSetDataCallback + roleNames: DosRoleNamesCallback + flags: DosFlagsCallback + headerData: DosHeaderDataCallback + index: DosIndexCallback + parent: DosParentCallback + hasChildren: DosHasChildrenCallback + canFetchMore: DosCanFetchMoreCallback + fetchMore: DosFetchMoreCallback + # Conversion proc resetToNil[T](x: var T) = x = nil.pointer.T @@ -204,15 +226,7 @@ proc dos_qmodelindex_assign(leftSide: DosQModelIndex, rightSide: DosQModelIndex) proc dos_qabstractitemmodel_create(modelPtr: NimQAbstractItemModel, metaObject: DosQMetaObject, qobjectCallback: DosQObjectCallBack, - rowCountCallback: DosRowCountCallback, - columnCountCallback: DosColumnCountCallback, - dataCallback: DosDataCallback, - setDataCallback: DosSetDataCallBack, - roleNamesCallback: DosRoleNamesCallback, - flagsCallback: DosFlagsCallback, - headerDataCallback: DosHeaderDataCallback, - indexCallback: DosIndexCallback, - parentCallback: DosParentCallback): DosQAbstractItemModel {.cdecl, dynlib: getDllName(), importc.} + qaimCallbacks: DosQAbstractItemModelCallbacks): DosQAbstractItemModel {.cdecl, dynlib: getDllName(), importc.} proc dos_qabstractitemmodel_beginInsertRows(model: DosQAbstractItemModel, parentIndex: DosQModelIndex, @@ -242,6 +256,10 @@ proc dos_qabstractitemmodel_dataChanged(model: DosQAbstractItemModel, rolesArrayPtr: ptr cint, rolesArrayLength: cint) {.cdecl, dynlib: getDllName(), importc.} proc dos_qabstractitemmodel_createIndex(model: DosQAbstractItemModel, row: cint, column: cint, data: pointer): DosQModelIndex {.cdecl, dynlib: getDllName(), importc.} +proc dos_qabstractitemmodel_hasChildren(model: DosQAbstractItemModel, parent: DosQModelIndex): bool {.cdecl, dynlib: getDllName(), importc.} +proc dos_qabstractitemmodel_canFetchMore(model: DosQAbstractItemModel, parent: DosQModelIndex): bool {.cdecl, dynlib: getDllName(), importc.} +proc dos_qabstractitemmodel_fetchMore(model: DosQAbstractItemModel, parent: DosQModelIndex) {.cdecl, dynlib: getDllName(), importc.} + # QResource proc dos_qresource_register(filename: cstring) {.cdecl, dynlib: getDllName(), importc.} @@ -249,3 +267,23 @@ proc dos_qresource_register(filename: cstring) {.cdecl, dynlib: getDllName(), im # QDeclarative proc dos_qdeclarative_qmlregistertype(value: ptr DosQmlRegisterType): cint {.cdecl, dynlib: getDllName(), importc.} proc dos_qdeclarative_qmlregistersingletontype(value: ptr DosQmlRegisterType): cint {.cdecl, dynlib: getDllName(), importc.} + +# QAbstractListModel +proc dos_qabstractlistmodel_qmetaobject(): DosQMetaObject {.cdecl dynlib: getDllName(), importc.} + +proc dos_qabstractlistmodel_create(modelPtr: NimQAbstractListModel, + metaObject: DosQMetaObject, + qobjectCallback: DosQObjectCallBack, + qaimCallbacks: DosQAbstractItemModelCallbacks): DosQAbstractListModel {.cdecl, dynlib: getDllName(), importc.} +proc dos_qabstractlistmodel_columnCount(modelPtr: DosQAbstractListModel, index: DosQModelIndex): cint {.cdecl, dynlib: getDllName(), importc.} +proc dos_qabstractlistmodel_parent(modelPtr: DosQAbstractListModel, index: DosQModelIndex): DosQModelIndex {.cdecl, dynlib: getDllName(), importc.} +proc dos_qabstractlistmodel_index(modelPtr: DosQAbstractListModel, row: cint, column: cint, parent: DosQModelIndex): DosQModelIndex {.cdecl, dynlib: getDllName(), importc.} + +# QAbstractTableModel +proc dos_qabstracttablemodel_qmetaobject(): DosQMetaObject {.cdecl dynlib: getDllName(), importc.} +proc dos_qabstracttablemodel_create(modelPtr: NimQAbstractTableModel, + metaObject: DosQMetaObject, + qobjectCallback: DosQObjectCallBack, + qaimCallbacks: DosQAbstractItemModelCallbacks): DosQAbstractTableModel {.cdecl, dynlib: getDllName(), importc.} +proc dos_qabstracttablemodel_parent(modelPtr: DosQAbstractTableModel, index: DosQModelIndex): DosQModelIndex {.cdecl, dynlib: getDllName(), importc.} +proc dos_qabstracttablemodel_index(modelPtr: DosQAbstractTableModel, row: cint, column: cint, parent: DosQModelIndex): DosQModelIndex {.cdecl, dynlib: getDllName(), importc.} diff --git a/src/private/nimqmltypes.nim b/src/private/nimqmltypes.nim index 86e3f4b..c1ebd44 100644 --- a/src/private/nimqmltypes.nim +++ b/src/private/nimqmltypes.nim @@ -7,6 +7,12 @@ type QAbstractItemModel* = ref object of QObject ## \ ## A QAbstractItemModel + QAbstractListModel* = ref object of QAbstractItemModel ## \ + ## A QAbstractListModel + + QAbstractTableModel* = ref object of QAbstractItemModel ## \ + ## A QAbstractTableModel + QVariant* = ref object of RootObj ## \ ## A QVariant vptr: DosQVariant diff --git a/src/private/qabstractitemmodel.nim b/src/private/qabstractitemmodel.nim index 9666d8a..358b866 100644 --- a/src/private/qabstractitemmodel.nim +++ b/src/private/qabstractitemmodel.nim @@ -115,16 +115,51 @@ proc parentCallback(modelPtr: pointer, child: DosQModelIndex, result: DosQModelI let index = model.parent(newQModelIndex(child, Ownership.Clone)) dos_qmodelindex_assign(result, index.vptr) +method hasChildren(self: QAbstractItemModel, parent: QModelIndex): bool {.base.} = + return dos_qabstractitemmodel_hasChildren(self.vptr.DosQAbstractItemModel, parent.vptr.DosQModelIndex) + +proc hasChildrenCallback(modelPtr: pointer, parent: DosQModelIndex, result: var bool) {.cdecl, exportc.} = + let model = cast[QAbstractItemModel](modelPtr) + result = model.hasChildren(newQModelIndex(parent, Ownership.Clone)) + +method canFetchMore(self: QAbstractItemModel, parent: QModelIndex): bool {.base.} = + return dos_qabstractitemmodel_canFetchMore(self.vptr.DosQAbstractItemModel, parent.vptr.DosQModelIndex) + +proc canFetchMoreCallback(modelPtr: pointer, parent: DosQModelIndex, result: var bool) {.cdecl, exportc.} = + let model = cast[QAbstractItemModel](modelPtr) + result = model.canFetchMore(newQModelIndex(parent, Ownership.Clone)) + +method fetchMore(self: QAbstractItemModel, parent: QModelIndex) {.base.} = + dos_qabstractitemmodel_fetchMore(self.vptr.DosQAbstractItemModel, parent.vptr.DosQModelIndex) + +proc fetchMoreCallback(modelPtr: pointer, parent: DosQModelIndex) {.cdecl, exportc.} = + let model = cast[QAbstractItemModel](modelPtr) + model.fetchMore(newQModelIndex(parent, Ownership.Clone)) + + + method onSlotCalled*(self: QAbstractItemModel, slotName: string, arguments: openarray[QVariant]) = ## Called from the dotherside library when a slot is called from Qml. proc setup*(self: QAbstractItemModel) = ## Setup a new QAbstractItemModel debugMsg("QAbstractItemModel", "setup") + + let qaimCallbacks = DosQAbstractItemModelCallbacks(rowCount: rowCountCallback, + columnCount: columnCountCallback, + data: dataCallback, + setData: setDataCallback, + roleNames: roleNamesCallback, + flags: flagsCallback, + headerData: headerDataCallback, + index: indexCallback, + parent: parentCallback, + hasChildren: hasChildrenCallback, + canFetchMore: canFetchMoreCallback, + fetchMore: fetchMoreCallback) + self.vptr = dos_qabstractitemmodel_create(addr(self[]), self.metaObject.vptr, - qobjectCallback, rowCountCallback, columnCountCallback, - dataCallback, setDataCallback, roleNamesCallback, - flagsCallback, headerDataCallback, indexCallback, parentCallback).DosQObject + qobjectCallback, qaimCallbacks).DosQObject proc delete*(self: QAbstractItemModel) = ## Delete the given QAbstractItemModel diff --git a/src/private/qabstractlistmodel.nim b/src/private/qabstractlistmodel.nim new file mode 100644 index 0000000..5d4cf9e --- /dev/null +++ b/src/private/qabstractlistmodel.nim @@ -0,0 +1,57 @@ +let qAbstractListModelStaticMetaObjectInstance = newQAbstractListModelMetaObject() + +proc staticMetaObject*(c: type QAbstractListModel): QMetaObject = + ## Return the metaObject of QAbstractListModel + qAbstractListModelStaticMetaObjectInstance + +proc staticMetaObject*(self: QAbstractListModel): QMetaObject = + ## Return the metaObject of QAbstractListModel + qAbstractListModelStaticMetaObjectInstance + +method metaObject*(self: QAbstractListModel): QMetaObject = + # Return the metaObject + QAbstractListModel.staticMetaObject + +proc setup*(self: QAbstractListModel) = + ## Setup a new QAbstractListModel + debugMsg("QAbstractListModel", "setup") + + let qaimCallbacks = DosQAbstractItemModelCallbacks(rowCount: rowCountCallback, + columnCount: columnCountCallback, + data: dataCallback, + setData: setDataCallback, + roleNames: roleNamesCallback, + flags: flagsCallback, + headerData: headerDataCallback, + index: indexCallback, + parent: parentCallback, + hasChildren: hasChildrenCallback, + canFetchMore: canFetchMoreCallback, + fetchMore: fetchMoreCallback) + + self.vptr = dos_qabstractlistmodel_create(addr(self[]), self.metaObject.vptr, + qobjectCallback, qaimCallbacks).DosQObject + +proc delete*(self: QAbstractListModel) = + ## Delete the given QAbstractItemModel + debugMsg("QAbstractItemModel", "delete") + self.QObject.delete() + +proc newQAbstractListModel*(): QAbstractListModel = + ## Return a new QAbstractListModel + debugMsg("QAbstractListModel", "new") + new(result, delete) + result.setup() + + +method columnCount(self: QAbstractListModel, index: QModelIndex): int = + return dos_qabstractlistmodel_columnCount(self.vptr.DosQAbstractListModel, index.vptr.DosQModelIndex) + +method parent(self: QAbstractListModel, child: QModelIndex): QModelIndex = + let indexPtr = dos_qabstractlistmodel_parent(self.vptr.DosQAbstractListModel, child.vptr.DosQModelIndex) + result = newQModelIndex(indexPtr, Ownership.Take) + +method index*(self: QAbstractListModel, row: int, column: int, parent: QModelIndex): QModelIndex = + let indexPtr = dos_qabstractlistmodel_index(self.vptr.DosQAbstractListModel, row.cint, column.cint, parent.vptr.DosQModelIndex) + result = newQModelIndex(indexPtr, Ownership.Take) + diff --git a/src/private/qabstracttablemodel.nim b/src/private/qabstracttablemodel.nim new file mode 100644 index 0000000..50406d0 --- /dev/null +++ b/src/private/qabstracttablemodel.nim @@ -0,0 +1,47 @@ +let qAbstractTableModelStaticMetaObjectInstance = newQAbstractTableModelMetaObject() + +proc staticMetaObject*(c: type QAbstractTableModel): QMetaObject = + ## Return the metaObject of QAbstractTableModel + qAbstractTableModelStaticMetaObjectInstance + +proc staticMetaObject*(self: QAbstractTableModel): QMetaObject = + ## Return the metaObject of QAbstractTableModel + qAbstractTableModelStaticMetaObjectInstance + +method metaObject*(self: QAbstractTableModel): QMetaObject = + # Return the metaObject + QAbstractTableModel.staticMetaObject + +proc setup*(self: QAbstractTableModel) = + ## Setup a new QAbstractTableModel + debugMsg("QAbstractTableModel", "setup") + + let qaimCallbacks = DosQAbstractItemModelCallbacks(rowCount: rowCountCallback, + columnCount: columnCountCallback, + data: dataCallback, + setData: setDataCallback, + roleNames: roleNamesCallback, + flags: flagsCallback, + headerData: headerDataCallback, + index: indexCallback, + parent: parentCallback, + hasChildren: hasChildrenCallback, + canFetchMore: canFetchMoreCallback, + fetchMore: fetchMoreCallback) + + self.vptr = dos_qabstracttablemodel_create(addr(self[]), self.metaObject.vptr, + qobjectCallback, qaimCallbacks).DosQObject + +proc delete*(self: QAbstractTableModel) = + ## Delete the given QAbstractItemModel + debugMsg("QAbstractItemModel", "delete") + self.QObject.delete() + +proc newQAbstractTableModel*(): QAbstractTableModel = + ## Return a new QAbstractTableModel + debugMsg("QAbstractTableModel", "new") + new(result, delete) + result.setup() + + + diff --git a/src/private/qmetaobject.nim b/src/private/qmetaobject.nim index 90dbcc5..9c71f38 100644 --- a/src/private/qmetaobject.nim +++ b/src/private/qmetaobject.nim @@ -18,6 +18,18 @@ proc newQAbstractItemModelMetaObject*(): QMetaObject = new(result, delete) result.vptr = dos_qabstractitemmodel_qmetaobject() +proc newQAbstractListModelMetaObject*(): QMetaObject = + ## Create the QMetaObject of QAbstractListModel + debugMsg("QMetaObject", "newQAbstractListModelMetaObject") + new(result, delete) + result.vptr = dos_qabstractlistmodel_qmetaobject() + +proc newQAbstractTableModelMetaObject*(): QMetaObject = + ## Create the QMetaObject of QAbstractTableModel + debugMsg("QMetaObject", "newQAbstractItemTableMetaObject") + new(result, delete) + result.vptr = dos_qabstracttablemodel_qmetaobject() + proc newQMetaObject*(superClass: QMetaObject, className: string, signals: seq[SignalDefinition], slots: seq[SlotDefinition],