Added support for setData and flags methods

This commit is contained in:
Filippo Cucchetto 2015-02-14 15:45:04 +01:00
parent 6e6e0c1a57
commit 84c58761ad
7 changed files with 132 additions and 29 deletions

View File

@ -13,14 +13,22 @@ public:
BaseQAbstractListModel(void* modelObject,
RowCountCallback rowCountCallback,
DataCallback dataCallback,
RoleNamesCallback roleNamesCallback);
SetDataCallback setDataCallback,
RoleNamesCallback roleNamesCallback,
FlagsCallback flagsCallback);
/// Return the model's row count
virtual int rowCount(const QModelIndex& index = QModelIndex()) const override;
/// Return the QVariant at the given index
virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
/// Sets the QVariant value at the given index and role
virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override;
/// Return the item flags for the given index
virtual Qt::ItemFlags flags(const QModelIndex& index) const override;
/// Return the dModelPointer
void* modelObject();
@ -54,17 +62,23 @@ private:
void* m_modelObject;
RowCountCallback m_rowCountCallback;
DataCallback m_dataCallback;
SetDataCallback m_setDataCallback;
RoleNamesCallback m_roleNamesCallback;
FlagsCallback m_flagsCallback;
};
BaseQAbstractListModel::BaseQAbstractListModel(void* modelObject,
RowCountCallback rowCountCallback,
DataCallback dataCallback,
RoleNamesCallback roleNamesCallback)
SetDataCallback setDataCallback,
RoleNamesCallback roleNamesCallback,
FlagsCallback flagsCallback)
: m_modelObject(modelObject)
, m_rowCountCallback(rowCountCallback)
, m_dataCallback(dataCallback)
, m_setDataCallback(setDataCallback)
, m_roleNamesCallback(roleNamesCallback)
, m_flagsCallback(flagsCallback)
{
}
@ -86,6 +100,26 @@ QVariant BaseQAbstractListModel::data(const QModelIndex& index, int role) const
return result;
}
bool BaseQAbstractListModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
auto newIndex = new QModelIndex(index);
*newIndex = index;
auto newValue = new QVariant();
*newValue = value;
bool result = false;
m_setDataCallback(m_modelObject, newIndex, newValue, role, &result);
return result;
}
Qt::ItemFlags BaseQAbstractListModel::flags(const QModelIndex& index) const
{
auto newIndex = new QModelIndex(index);
*newIndex = index;
int result;
m_flagsCallback(m_modelObject, newIndex, &result);
return Qt::ItemFlags(result);
}
void* BaseQAbstractListModel::modelObject()
{
return m_modelObject;

View File

@ -445,12 +445,16 @@ void dos_qabstractlistmodel_create(void** vptr,
DObjectCallback dObjectCallback,
RowCountCallback rowCountCallback,
DataCallback dataCallback,
RoleNamesCallback roleNamesCallaback)
SetDataCallback setDataCallback,
RoleNamesCallback roleNamesCallaback,
FlagsCallback flagsCallback)
{
auto model = new BaseQAbstractListModel(modelObject,
rowCountCallback,
dataCallback,
roleNamesCallaback);
setDataCallback,
roleNamesCallaback,
flagsCallback);
model->setDObjectPointer(modelObject);
model->setDObjectCallback(dObjectCallback);
*vptr = model;

View File

@ -125,16 +125,19 @@ void dos_qabstractlistmodel_create(void** vptr,
DObjectCallback dObjectCallback,
RowCountCallback rowCountCallback,
DataCallback dataCallback,
RoleNamesCallback roleNamesCallback);
SetDataCallback setDataCallback,
RoleNamesCallback roleNamesCallback,
FlagsCallback FlagsCallback
);
void dos_qabstractlistmodel_beginInsertRows(void* vptr,
QModelIndexVoidPtr parentIndex,
int first,
int last);
QModelIndexVoidPtr parentIndex,
int first,
int last);
void dos_qabstractlistmodel_endInsertRows(void* vptr);
void dos_qabstractlistmodel_beginRemoveRows(void* vptr,
QModelIndexVoidPtr parentIndex,
int first,
int last);
QModelIndexVoidPtr parentIndex,
int first,
int last);
void dos_qabstractlistmodel_endRemoveRows(void* vptr);
void dos_qabstractlistmodel_beginResetModel(void* vptr);
void dos_qabstractlistmodel_endResetModel(void* vptr);

View File

@ -2,6 +2,7 @@
#define DOTHERSIDETYPES_H
// Raw data types
typedef bool* BoolPtr;
typedef int* IntPtr;
typedef char* CharPtr;
typedef const char* ConstCharPtr;
@ -18,6 +19,7 @@ typedef void (*Function)(void*);
typedef void (*DObjectCallback)(void*, void*, int, void**);
typedef void (*RowCountCallback)(void* model, QModelIndexVoidPtr index, IntPtr result);
typedef void (*DataCallback)(void* model, QModelIndexVoidPtr index, int role, QVariantVoidPtr result);
typedef void (*SetDataCallback) (void* model, QModelIndexVoidPtr index, QVariantVoidPtr value, int role, BoolPtr result);
typedef void (*RoleNamesCallback)(void* model, QHashIntQByteArrayVoidPtr result);
typedef void (*FlagsCallback) (void* model, QModelIndexVoidPtr index, IntPtr result);
#endif

View File

@ -4,9 +4,9 @@ QtObject:
type
ContactList* = ref object of QAbstractListModel
contacts*: seq[Contact]
ContactRoles = enum
FirstNameRole = 0
SurnameRole = 1
ContactRoles {.pure.} = enum
FirstName = 0
Surname = 1
converter toCInt(value: ContactRoles): cint = return value.cint
converter toCInt(value: int): cint = return value.cint
@ -34,17 +34,41 @@ QtObject:
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
let contact = self.contacts[index.row]
let contactRole = role.ContactRoles
case contactRole:
of ContactRoles.FirstName: return contact.firstName
of ContactRoles.Surname: return contact.surname
else: return
method setData(self: ContactList, index: QModelIndex, value: QVariant, role: cint): bool =
result = false
if not index.isValid:
return
if index.row < 0 or index.row >= self.contacts.len:
return
if value.isNull:
return
var contact = self.contacts[index.row]
let contactRole = role.ContactRoles
case contactRole:
of ContactRoles.FirstName:
contact.firstName = value.stringVal
self.dataChanged(index, index, @[role])
result = true
of ContactRoles.Surname:
contact.surname = value.stringVal
self.dataChanged(index, index, @[role])
result = true
else: discard()
method flags(self: ContactList): QItemFlag =
return QItemFlag.IsEditable
method roleNames(self: ContactList): Table[cint, cstring] =
result = initTable[cint, cstring]()
result[FirstNameRole] = "firstName"
result[SurnameRole] = "surname"
result[ContactRoles.FirstName] = "firstName"
result[ContactRoles.Surname] = "surname"
method add*(self: ContactList, name: string, surname: string) {.slot.} =
let contact = newContact()

View File

@ -616,14 +616,18 @@ proc newQHashIntQByteArray*(): QHashIntByteArray =
# QAbstractListModel
type RowCountCallback = proc(modelObject: ptr QAbstractListModelObj, rawIndex: RawQModelIndex, result: var cint) {.cdecl.}
type DataCallback = proc(modelObject: ptr QAbstractListModelObj, rawIndex: RawQModelIndex, role: cint, result: RawQVariant) {.cdecl.}
type SetDataCallback = proc(modelObject: ptr QAbstractListModelObj, rawIndex: RawQModelIndex, value: RawQVariant, role: cint, result: var bool) {.cdecl.}
type RoleNamesCallback = proc(modelObject: ptr QAbstractListModelObj, result: RawQHashIntByteArray) {.cdecl.}
type FlagsCallback = proc(modelObject: ptr QAbstractListModelObj, index: RawQModelIndex, result: var cint) {.cdecl.}
proc dos_qabstractlistmodel_create(model: var RawQAbstractListModel,
modelPtr: ptr QAbstractListModelObj,
qobjectCallback: QObjectCallBack,
rowCountCallback: RowCountCallback,
dataCallback: DataCallback,
roleNamesCallback: RoleNamesCallback) {.cdecl, dynlib:"libDOtherSide.so", importc.}
setDataCallback: SetDataCallBack,
roleNamesCallback: RoleNamesCallback,
flagsCallback: FlagsCallback) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qabstractlistmodel_delete(model: RawQAbstractListModel) {.cdecl, dynlib:"libDOtherSide.so", importc.}
proc dos_qabstractlistmodel_beginInsertRows(model: RawQAbstractListModel,
parentIndex: RawQModelIndex,
@ -664,6 +668,16 @@ proc dataCallback(modelObject: ptr QAbstractListModelObj, rawIndex: RawQModelInd
dos_qvariant_assign(result, variant.data)
variant.delete
method setData*(model: QAbstractListModel, index: QModelIndex, value: QVariant, role: cint): bool =
## Sets the data at the given index and role. Return true on success, false otherwise
return false
proc setDataCallback(modelObject: ptr QAbstractListModelObj, rawIndex: RawQModelIndex, rawQVariant: RawQVariant, role: cint, result: var bool) {.cdecl, exportc.} =
let model = cast[QAbstractListModel](modelObject)
let index = newQModelIndex(rawIndex)
let variant = newQVariant(rawQVariant)
result = model.setData(index, variant, role)
method roleNames*(model: QAbstractListModel): Table[cint, cstring] =
result = initTable[cint, cstring]()
@ -672,7 +686,15 @@ proc roleNamesCallback(modelObject: ptr QAbstractListModelObj, hash: RawQHashInt
let table = model.roleNames()
for pair in table.pairs:
dos_qhash_int_qbytearray_insert(hash, pair.key, pair.val)
method flags*(model: QAbstractListModel, index: QModelIndex): QItemFlag =
return QItemFlag.None
proc flagsCallback(modelObject: ptr QAbstractListModelObj, rawIndex: RawQModelIndex, result: var cint) {.cdecl, exportc.} =
let model = cast[QAbstractListModel](modelObject)
let index = newQModelIndex(rawIndex)
result = model.flags(index).cint
proc create*(model: var QAbstractListModel) =
## Create a new QAbstractListModel
debugMsg("QAbstractListModel", "create")
@ -681,7 +703,7 @@ proc create*(model: var QAbstractListModel) =
model.properties = initTable[string, cint]()
model.deleted = false
let modelPtr = addr(model[])
dos_qabstractlistmodel_create(model.data.RawQAbstractListModel, modelPtr, qobjectCallback, rowCountCallback, dataCallback, roleNamesCallback)
dos_qabstractlistmodel_create(model.data.RawQAbstractListModel, modelPtr, qobjectCallback, rowCountCallback, dataCallback, setDataCallback, roleNamesCallback, flagsCallback)
qobjectRegistry[modelPtr] = true
proc delete*(model: QAbstractListModel) =
@ -726,7 +748,8 @@ proc endResetModel*(model: QAbstractListModel) =
proc dataChanged*(model: QAbstractListModel,
topLeft: QModelIndex,
bottomRight: QModelIndex,
roles: var seq[cint]) =
roles: seq[cint]) =
## Notify the view that the model data changed
dos_qabstractlistmodel_dataChanged(model.data.RawQAbstractListModel, topLeft.data, bottomRight.data, roles[0].addr, roles.len.cint)
var copy = roles
dos_qabstractlistmodel_dataChanged(model.data.RawQAbstractListModel, topLeft.data, bottomRight.data, copy[0].addr, copy.len.cint)

View File

@ -51,3 +51,16 @@ type
data: RawQHashIntByteArray
deleted: bool
QHashIntByteArray* = ref QHashIntByteArrayObj ## A QHash<int,QByteArray>
QItemFlag* {.pure.} = enum
None = 0.cint,
IsSelectable = 1.cint,
IsEditable = 2.cint,
IsDragEnabled = 4.cint,
IsDropEnabled = 8.cint,
IsUserCheckable = 16.cint,
IsEnabled = 32.cint,
IsTristate = 64.cint,
NeverHasChildren = 128.cint