Added support for setData and flags methods
This commit is contained in:
parent
6e6e0c1a57
commit
84c58761ad
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue