Updated the ContactApp for testing the QAbstractListModel generation of slots and properties

This commit is contained in:
Filippo Cucchetto 2015-02-10 00:40:20 +01:00
parent 67e7efbcd0
commit 55341ab3e2
7 changed files with 97 additions and 122 deletions

View File

@ -442,6 +442,7 @@ void dos_qmodelindex_sibling(void* vptr, int row, int column, void* sibling)
void dos_qabstractlistmodel_create(void** vptr,
void* modelObject,
DObjectCallback dObjectCallback,
RowCountCallback rowCountCallback,
DataCallback dataCallback,
RoleNamesCallback roleNamesCallaback)
@ -450,6 +451,8 @@ void dos_qabstractlistmodel_create(void** vptr,
rowCountCallback,
dataCallback,
roleNamesCallaback);
model->setDObjectPointer(modelObject);
model->setDObjectCallback(dObjectCallback);
*vptr = model;
}

View File

@ -122,6 +122,7 @@ void dos_qhash_int_qbytearray_value(QHashIntQByteArrayVoidPtr vptr, int key, cha
// QAbstractListModel
void dos_qabstractlistmodel_create(void** vptr,
void* callbackObject,
DObjectCallback dObjectCallback,
RowCountCallback rowCountCallback,
DataCallback dataCallback,
RoleNamesCallback roleNamesCallback);

View File

@ -29,11 +29,5 @@ QtObject:
method onExitTriggered(self: ApplicationLogic) {.slot.} =
self.app.quit
method addContact(self: ApplicationLogic, name: string, surname: string) {.slot.} =
self.contactList.add(name, surname)
method delContact(self: ApplicationLogic, index: int) {.slot.} =
self.contactList.del(index)
QtProperty[QVariant] contactList:
read = getContactList

View File

@ -1,73 +1,62 @@
import NimQml, NimQmlMacros, Contact, Tables
type
ContactList* = ref object of QAbstractListModel
contacts*: seq[Contact]
ContactRoles = enum
FirstNameRole = 0
SurnameRole = 1
QtObject:
type
ContactList* = ref object of QAbstractListModel
contacts*: seq[Contact]
ContactRoles = enum
FirstNameRole = 0
SurnameRole = 1
converter toCInt(value: ContactRoles): cint = return value.cint
converter toCInt(value: int): cint = return value.cint
converter toInt(value: ContactRoles): int = return value.int
converter toInt(value: cint): int = return value.int
converter toQVariant(value: string): QVariant = return value.newQVariant
converter toCInt(value: ContactRoles): cint = return value.cint
converter toCInt(value: int): cint = return value.cint
converter toInt(value: ContactRoles): int = return value.int
converter toInt(value: cint): int = return value.int
converter toQVariant(value: string): QVariant = return value.newQVariant
proc create(self: ContactList) =
var model = self.QAbstractListModel
model.create
self.contacts = @[]
proc delete(self: ContactList) =
let model = self.QAbstractListModel
model.delete
for contact in self.contacts:
contact.delete
self.contacts = @[]
proc delete(self: ContactList) =
let model = self.QAbstractListModel
model.delete
for contact in self.contacts:
contact.delete
self.contacts = @[]
proc newContactList*(): ContactList =
new(result, delete)
result.create()
proc newContactList*(): ContactList =
new(result, delete)
result.contacts = @[]
result.create
proc isRowValid(self: ContactList, row: cint): bool =
return row >= 0 and row < self.contacts.len
method rowCount(self: ContactList, index: QModelIndex = nil): cint =
return self.contacts.len
method rowCount(self: ContactList, index: QModelIndex = nil): cint =
return self.contacts.len
method data(self: ContactList, index: QModelIndex, role: cint): QVariant =
if not index.isValid:
return
if not self.isRowValid(index.row):
return
if role == FirstNameRole:
return self.contacts[index.row].firstName
elif role == SurnameRole:
return self.contacts[index.row].surname
else:
return
method data(self: ContactList, index: QModelIndex, role: cint): QVariant =
if not index.isValid:
return
if index.row < 0 or index.row >= self.contacts.len:
return
if role == FirstNameRole:
return self.contacts[index.row].firstName
elif role == SurnameRole:
return self.contacts[index.row].surname
else:
return
method roleNames(self: ContactList): Table[cint, cstring] =
result = initTable[cint, cstring]()
result[FirstNameRole] = "firstName"
result[SurnameRole] = "surname"
method roleNames(self: ContactList): Table[cint, cstring] =
result = initTable[cint, cstring]()
result[FirstNameRole] = "firstName"
result[SurnameRole] = "surname"
method add*(self: ContactList, name: string, surname: string) =
let contact = newContact()
contact.firstName = name
contact.surname = surname
self.beginInsertRows(newQModelIndex(), self.contacts.len, self.contacts.len)
self.contacts.add(contact)
self.endInsertRows()
method add*(self: ContactList, name: string, surname: string) {.slot.} =
let contact = newContact()
contact.firstName = name
contact.surname = surname
self.beginInsertRows(newQModelIndex(), self.contacts.len, self.contacts.len)
self.contacts.add(contact)
self.endInsertRows()
method get*(self: ContactList, pos: int): QObject =
if not self.isRowValid(pos):
return nil
result = self.contacts[pos].QObject
method del*(self: ContactList, pos: int) =
if not self.isRowValid(pos):
return
self.beginRemoveRows(newQModelIndex(), pos, pos)
self.contacts.del(pos)
self.endRemoveRows
method del*(self: ContactList, pos: int) {.slot.} =
if pos < 0 or pos >= self.contacts.len:
return
self.beginRemoveRows(newQModelIndex(), pos, pos)
self.contacts.del(pos)
self.endRemoveRows

View File

@ -3,16 +3,15 @@ import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1
import QtQuick.Window 2.1
ApplicationWindow
{
ApplicationWindow {
width: 400
height: 300
title: "ContactApp"
visible: true
menuBar: MenuBar {
Menu
{
Menu {
title: "&File"
MenuItem { text: "&Load"; onTriggered: logic.onLoadTriggered() }
MenuItem { text: "&Save"; onTriggered: logic.onSaveTriggered() }
@ -20,35 +19,31 @@ ApplicationWindow
}
}
ColumnLayout
{
ColumnLayout {
anchors.fill: parent
ScrollView
{
ScrollView {
Layout.fillWidth: true
Layout.fillHeight: true
ListView
{
ListView {
model: logic.contactList
spacing: 5
delegate: RowLayout {
width: ListView.view.width
TextField { Layout.fillWidth: true; text: firstName }
TextField { Layout.fillWidth: true; text: surname }
Button { text: "Delete"; onClicked: logic.delContact(index) }
Button { text: "Delete"; onClicked: logic.contactList.del(index) }
}
}
}
RowLayout
{
RowLayout {
Label { text: "Name" }
TextField { id: nameTextField; Layout.fillWidth: true; text: "" }
Label { text: "Surname" }
TextField { id: surnameTextField; Layout.fillWidth: true; text: "" }
Button { text: "Add"; onClicked: logic.addContact(nameTextField.text, surnameTextField.text) }
Button { text: "Add"; onClicked: logic.contactList.add(nameTextField.text, surnameTextField.text) }
}
}
}

View File

@ -78,7 +78,6 @@ proc dos_qvariant_create_qobject(variant: var RawQVariant, value: RawQObject) {.
proc dos_qvariant_create_qvariant(variant: var RawQVariant, value: RawQVariant) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qvariant_create_float(variant: var RawQVariant, value: cfloat) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qvariant_create_double(variant: var RawQVariant, value: cdouble) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qvariant_create_qabstractlistmodel(variant: var RawQVariant, value: RawQAbstractListModel) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qvariant_delete(variant: RawQVariant) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qvariant_isnull(variant: RawQVariant, isNull: var bool) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qvariant_toInt(variant: RawQVariant, value: var cint) {.cdecl, dynlib:"libDOtherSide.so", importc.}
@ -93,7 +92,6 @@ proc dos_qvariant_setFloat(variant: RawQVariant, value: float) {.cdecl, dynlib:
proc dos_qvariant_toDouble(variant: RawQVariant, value: var cdouble) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qvariant_setDouble(variant: RawQVariant, value: cdouble) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qvariant_setQObject(variant: RawQVariant, value: RawQObject) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qvariant_setQAbstractListModel(variant: RawQVariant, value: RawQAbstractListModel) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_chararray_delete(rawCString: cstring) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc create*(variant: QVariant) =
@ -118,14 +116,9 @@ proc create*(variant: QVariant, value: string) =
proc create*(variant: QVariant, value: QObject) =
## Create a new QVariant given a QObject
dos_qvariant_create_qobject(variant.data, value.data)
dos_qvariant_create_qobject(variant.data, value.data.RawQObject)
variant.deleted = false
proc create*(variant: QVariant, value: QAbstractListModel) =
## Create a new QVariant given a QAbstractListModel
dos_qvariant_create_qabstractlistmodel(variant.data, value.data)
variant.deleted = false
proc create*(variant: QVariant, value: RawQVariant) =
## Create a new QVariant given another QVariant.
## The inner value of the QVariant is copied
@ -175,11 +168,6 @@ proc newQVariant*(value: QObject): QVariant =
newWithCondFinalizer(result, delete)
result.create(value)
proc newQVariant*(value: QAbstractListModel): QVariant =
## Return a new QVariant given a QAbstractListModel
newWithCondFinalizer(result, delete)
result.create(value)
proc newQVariant*(value: RawQVariant): QVariant =
## Return a new QVariant given a raw QVariant pointer
newWithCondFinalizer(result, delete)
@ -252,11 +240,7 @@ proc `stringVal=`*(variant: QVariant, value: string) =
proc `qobjectVal=`*(variant: QVariant, value: QObject) =
## Sets the QVariant qobject value
dos_qvariant_setQObject(variant.data, value.data)
proc `qabstractListModelVal=`*(variant: QVariant, value: QAbstractListModel) =
## Sets the QVariant qabstractlistmodel value
dos_qvariant_setQAbstractListModel(variant.data, value.data)
dos_qvariant_setQObject(variant.data, value.data.RawQObject)
proc assign*(leftValue: QVariant, rightValue: QVariant) =
## Assign a QVariant with another. The inner value of the QVariant is copied
@ -636,6 +620,7 @@ type RoleNamesCallback = proc(modelObject: ptr QAbstractListModelObj, result: Ra
proc dos_qabstractlistmodel_create(model: var RawQAbstractListModel,
modelPtr: ptr QAbstractListModelObj,
qobjectCallback: QObjectCallBack,
rowCountCallback: RowCountCallback,
dataCallback: DataCallback,
roleNamesCallback: RoleNamesCallback) {.cdecl, dynlib:"libDOtherSide.so", importc.}
@ -691,18 +676,24 @@ proc roleNamesCallback(modelObject: ptr QAbstractListModelObj, hash: RawQHashInt
proc create*(model: var QAbstractListModel) =
## Create a new QAbstractListModel
debugMsg("QAbstractListModel", "create")
let modelPtr = addr(model[])
dos_qabstractlistmodel_create(model.data, modelPtr, rowCountCallback, dataCallback, roleNamesCallback)
model.slots = initTable[string,cint]()
model.signals = initTable[string, cint]()
model.properties = initTable[string, cint]()
model.deleted = false
let modelPtr = addr(model[])
dos_qabstractlistmodel_create(model.data.RawQAbstractListModel, modelPtr, qobjectCallback, rowCountCallback, dataCallback, roleNamesCallback)
qobjectRegistry[modelPtr] = true
proc delete*(model: QAbstractListModel) =
## Delete the given QAbstractListModel
if not model.deleted:
debugMsg("QAbstractListModel", "delete")
dos_qabstractlistmodel_delete(model.data)
model.data = nil.RawQAbstractListModel
let modelPtr = addr(model[])
qobjectRegistry.del modelPtr
dos_qabstractlistmodel_delete(model.data.RawQAbstractListModel)
model.data = nil.RawQObject
model.deleted = true
proc newQAbstractListModel*(): QAbstractListModel =
## Return a new QAbstractListModel
newWithCondFinalizer(result, delete)
@ -710,32 +701,32 @@ proc newQAbstractListModel*(): QAbstractListModel =
proc beginInsertRows*(model: QAbstractListModel, parentIndex: QModelIndex, first: int, last: int) =
## Notify the view that the model is about to inserting the given number of rows
dos_qabstractlistmodel_beginInsertRows(model.data, parentIndex.data, first.cint, last.cint)
dos_qabstractlistmodel_beginInsertRows(model.data.RawQAbstractListModel, parentIndex.data, first.cint, last.cint)
proc endInsertRows*(model: QAbstractListModel) =
## Notify the view that the rows have been inserted
dos_qabstractlistmodel_endInsertRows(model.data)
dos_qabstractlistmodel_endInsertRows(model.data.RawQAbstractListModel)
proc beginRemoveRows*(model: QAbstractListModel, parentIndex: QModelIndex, first: int, last: int) =
## Notify the view that the model is about to remove the given number of rows
dos_qabstractlistmodel_beginRemoveRows(model.data, parentIndex.data, first.cint, last.cint)
dos_qabstractlistmodel_beginRemoveRows(model.data.RawQAbstractListModel, parentIndex.data, first.cint, last.cint)
proc endRemoveRows*(model: QAbstractListModel) =
## Notify the view that the rows have been removed
dos_qabstractlistmodel_endRemoveRows(model.data)
dos_qabstractlistmodel_endRemoveRows(model.data.RawQAbstractListModel)
proc beginResetModel*(model: QAbstractListModel) =
## Notify the view that the model is about to resetting
dos_qabstractlistmodel_beginResetModel(model.data)
dos_qabstractlistmodel_beginResetModel(model.data.RawQAbstractListModel)
proc endResetModel*(model: QAbstractListModel) =
## Notify the view that model has finished resetting
dos_qabstractlistmodel_endResetModel(model.data)
dos_qabstractlistmodel_endResetModel(model.data.RawQAbstractListModel)
proc dataChanged*(model: QAbstractListModel,
topLeft: QModelIndex,
bottomRight: QModelIndex,
roles: seq[cint]) =
roles: var seq[cint]) =
## Notify the view that the model data changed
var temp = roles
dos_qabstractlistmodel_dataChanged(model.data, topLeft.data, bottomRight.data, temp[0].addr, temp.len.cint)
dos_qabstractlistmodel_dataChanged(model.data.RawQAbstractListModel, topLeft.data, bottomRight.data, roles[0].addr, roles.len.cint)

View File

@ -24,8 +24,16 @@ type
signals: Table[string, cint]
properties: Table[string, cint]
deleted: bool
QObject* = ref QObjectObj ## A QObject
QObject* = ref QObjectObj
RawBaseQObjectObj = distinct pointer
BaseQObjectObj = object of QObjectObj
BaseQObject* = ref BaseQObjectObj ## A QObject
RawQAbstractListModel = distinct pointer
QAbstractListModelObj = object of QObjectObj
QAbstractListModel* = ref QAbstractListModelObj ## A QAbstractListModel
RawQQuickView = distinct pointer
QQuickView = ref object of RootObj ## A QQuickView
data: RawQQuickView
@ -38,12 +46,6 @@ type
data: RawQModelIndex
deleted: bool
RawQAbstractListModel = distinct pointer
QAbstractListModelObj = object of RootObj
data: RawQAbstractListModel
deleted: bool
QAbstractListModel* = ref QAbstractListModelObj ## A QAbstractListModel
RawQHashIntByteArray = distinct pointer
QHashIntByteArrayObj = object of RootObj
data: RawQHashIntByteArray