From 733266b36205d1768b6cfd257575b408dfae2604 Mon Sep 17 00:00:00 2001 From: Filippo Cucchetto Date: Sun, 18 Jan 2015 12:26:51 +0100 Subject: [PATCH] Add wrapping of the QModelIndex data type --- DOtherSide/DOtherSide/DOtherSide.cpp | 59 +++++++++++++++++++++++++++ DOtherSide/DOtherSide/DOtherSide.h | 11 +++++ Nim/NimQml/NimQml.nim | 61 ++++++++++++++++++++++++++++ Nim/NimQml/NimQmlTypes.nim | 4 ++ 4 files changed, 135 insertions(+) diff --git a/DOtherSide/DOtherSide/DOtherSide.cpp b/DOtherSide/DOtherSide/DOtherSide.cpp index 7c0f32a..0d89242 100644 --- a/DOtherSide/DOtherSide/DOtherSide.cpp +++ b/DOtherSide/DOtherSide/DOtherSide.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "DynamicQObject.h" @@ -356,3 +357,61 @@ void dos_qobject_property_create(void* vptr, QString(writeSlot), QString(notifySignal)); } + +void dos_qmodelindex_create(void** vptr) +{ + auto index = new QModelIndex(); + *vptr = index; +} + +void dos_qmodelindex_delete(void* vptr) +{ + auto index = reinterpret_cast(vptr); + delete index; +} + +void dos_qmodelindex_row(void* vptr, int& row) +{ + auto index = reinterpret_cast(vptr); + row = index->row(); +} + +void dos_qmodelindex_column(void* vptr, int& column) +{ + auto index = reinterpret_cast(vptr); + column = index->column(); +} + +void dos_qmodelindex_isValid(void* vptr, bool& isValid) +{ + auto index = reinterpret_cast(vptr); + isValid = index->isValid(); +} + +void dos_qmodelindex_data(void* vptr, int role, void* data) +{ + auto index = reinterpret_cast(vptr); + auto result = reinterpret_cast(data); + *result = index->data(role); +} + +void dos_qmodelindex_parent(void* vptr, void* parent) +{ + auto index = reinterpret_cast(vptr); + auto parentIndex = reinterpret_cast(parent); + *parentIndex = index->parent(); +} + +void dos_qmodelindex_child(void* vptr, int row, int column, void* child) +{ + auto index = reinterpret_cast(vptr); + auto childIndex = reinterpret_cast(child); + *childIndex = index->child(row, column); +} + +void dos_qmodelindex_sibling(void* vptr, int row, int column, void* sibling) +{ + auto index = reinterpret_cast(vptr); + auto siblingIndex = reinterpret_cast(sibling); + *siblingIndex = index->sibling(row, column); +} diff --git a/DOtherSide/DOtherSide/DOtherSide.h b/DOtherSide/DOtherSide/DOtherSide.h index 5b66cc5..c921e50 100644 --- a/DOtherSide/DOtherSide/DOtherSide.h +++ b/DOtherSide/DOtherSide/DOtherSide.h @@ -98,6 +98,17 @@ extern "C" const char* notifySignal); void dos_qobject_delete(void *vptr); + // QModelIndex + void dos_qmodelindex_create(void** vptr); + void dos_qmodelindex_delete(void* vptr); + void dos_qmodelindex_row(void* vptr, int& row); + void dos_qmodelindex_column(void* vptr, int& column); + void dos_qmodelindex_isValid(void* vptr, bool& isValid); + void dos_qmodelindex_data(void* vptr, int role, void* data); + void dos_qmodelindex_parent(void* vptr, void* parent); + void dos_qmodelindex_child(void* vptr, int row, int column, void* child); + void dos_qmodelindex_sibling(void* vptr, int row, int column, void* sibling); + #ifdef __cplusplus } #endif diff --git a/Nim/NimQml/NimQml.nim b/Nim/NimQml/NimQml.nim index 5f20fb3..11dd89f 100644 --- a/Nim/NimQml/NimQml.nim +++ b/Nim/NimQml/NimQml.nim @@ -491,3 +491,64 @@ proc newQQuickView*(): QQuickView = ## Return a new QQuickView newWithCondFinalizer(result, delete) result.create() + +# QModelIndex +proc dos_qmodelindex_create(modelIndex: var RawQModelIndex) {.cdecl, dynlib:"libDOtherSide.so", importc.} +proc dos_qmodelindex_delete(modelIndex: RawQModelIndex) {.cdecl, dynlib:"libDOtherSide.so", importc.} +proc dos_qmodelindex_row(modelIndex: RawQModelIndex, row: var cint) {.cdecl, dynlib:"libDOtherSide.so", importc.} +proc dos_qmodelindex_column(modelIndex: RawQModelIndex, column: var cint) {.cdecl, dynlib:"libDOtherSide.so", importc.} +proc dos_qmodelindex_isValid(modelIndex: RawQModelIndex, column: var bool) {.cdecl, dynlib:"libDOtherSide.so", importc.} +proc dos_qmodelindex_data(modelIndex: RawQModelIndex, role: cint, data: RawQVariant) {.cdecl, dynlib:"libDOtherSide.so", importc.} +proc dos_qmodelindex_parent(modelIndex: RawQModelIndex, parent: RawQModelIndex) {.cdecl, dynlib:"libDOtherSide.so", importc.} +proc dos_qmodelindex_child(modelIndex: RawQModelIndex, row: cint, column: cint, parent: RawQModelIndex) {.cdecl, dynlib:"libDOtherSide.so", importc.} +proc dos_qmodelindex_sibling(modelIndex: RawQModelIndex, row: cint, column: cint, sibling: RawQModelIndex) {.cdecl, dynlib:"libDOtherSide.so", importc.} + +proc create(modelIndex: var QModelIndex) = + ## Create a new QModelIndex + dos_qmodelindex_create(modelIndex.data) + modelIndex.deleted = false + +proc delete(modelIndex: QModelIndex) = + ## Delete the given QModelIndex + if not modelIndex.deleted: + debugMsg("QModelIndex", "delete") + dos_qmodelindex_delete(modelIndex.data) + modelIndex.data = nil.RawQModelIndex + modelIndex.deleted = true + +proc newQModelIndex*(): QModelIndex = + ## Return a new QModelIndex + newWithCondFinalizer(result, delete) + result.create() + +proc row(modelIndex: QModelIndex): cint = + ## Return the index row + dos_qmodelindex_row(modelIndex.data, result) + +proc column(modelIndex: QModelIndex): cint = + ## Return the index column + dos_qmodelindex_column(modelIndex.data, result) + +proc isValid(modelIndex: QModelIndex): bool = + ## Return true if the index is valid, false otherwise + dos_qmodelindex_isValid(modelIndex.data, result) + +proc data(modelIndex: QModelIndex, role: cint): QVariant = + ## Return the model data associated to the given role + result = newQVariant() + dos_qmodelindex_data(modelIndex.data, role, result.data) + +proc parent(modelIndex: QModelIndex): QModelIndex = + ## Return the parent index + result = newQModelIndex() + dos_qmodelindex_parent(modelIndex.data, result.data) + +proc child(modelIndex: QModelIndex, row: cint, column: cint): QModelIndex = + ## Return the child index associated to the given row and column + result = newQModelIndex() + dos_qmodelindex_child(modelIndex.data, row, column, result.data) + +proc sibling(modelIndex: QModelIndex, row: cint, column: cint): QModelIndex = + ## Return the sibling index associated to the given row and column + result = newQModelIndex() + dos_qmodelindex_sibling(modelIndex.data, row, column, result.data) diff --git a/Nim/NimQml/NimQmlTypes.nim b/Nim/NimQml/NimQmlTypes.nim index 6874d72..bc4f5ec 100644 --- a/Nim/NimQml/NimQmlTypes.nim +++ b/Nim/NimQml/NimQmlTypes.nim @@ -33,3 +33,7 @@ type QQmlContext* = distinct pointer ## A QQmlContext + RawQModelIndex = distinct pointer + QModelIndex = ref object of RootObj ## A QModelIndex + data: RawQModelIndex + deleted: bool