mirror of
https://github.com/status-im/dotherside.git
synced 2025-02-12 04:26:43 +00:00
Updated the ContactApp for testing the QAbstractListModel generation of slots and properties
This commit is contained in:
parent
67e7efbcd0
commit
55341ab3e2
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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.contacts = @[]
|
||||
result.create
|
||||
|
||||
proc newContactList*(): ContactList =
|
||||
new(result, delete)
|
||||
result.create()
|
||||
method rowCount(self: ContactList, index: QModelIndex = nil): cint =
|
||||
return self.contacts.len
|
||||
|
||||
proc isRowValid(self: ContactList, row: cint): bool =
|
||||
return row >= 0 and row < self.contacts.len
|
||||
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 rowCount(self: ContactList, index: QModelIndex = nil): cint =
|
||||
return self.contacts.len
|
||||
method roleNames(self: ContactList): Table[cint, cstring] =
|
||||
result = initTable[cint, cstring]()
|
||||
result[FirstNameRole] = "firstName"
|
||||
result[SurnameRole] = "surname"
|
||||
|
||||
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 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 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 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
|
||||
|
@ -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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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,12 +116,7 @@ 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)
|
||||
variant.deleted = false
|
||||
|
||||
proc create*(variant: QVariant, value: QAbstractListModel) =
|
||||
## Create a new QVariant given a QAbstractListModel
|
||||
dos_qvariant_create_qabstractlistmodel(variant.data, value.data)
|
||||
dos_qvariant_create_qobject(variant.data, value.data.RawQObject)
|
||||
variant.deleted = false
|
||||
|
||||
proc create*(variant: QVariant, value: RawQVariant) =
|
||||
@ -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,16 +676,22 @@ 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 =
|
||||
@ -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)
|
||||
|
||||
|
@ -24,7 +24,15 @@ 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
|
||||
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user