From f7a4a4d3d1ed7d393399b2e20dc962af2be54950 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Sun, 15 Aug 2021 10:45:22 +0200 Subject: [PATCH] Add `QAbstractItemModel.buddy()` support --- package.json | 3 +- .../QAbstractItemModel/nabstractitemmodel.hpp | 12 +++ .../qabstractitemmodel_wrap.h | 1 + .../qabstractitemmodel_wrap.cpp | 14 ++++ src/examples/modelview_buddy.ts | 80 +++++++++++++++++++ src/lib/QtCore/QAbstractItemModel.ts | 13 +++ 6 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 src/examples/modelview_buddy.ts diff --git a/package.json b/package.json index af47e5830..b3ac323fe 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "example-modelview_2_formatting": "node ./scripts/qode.js dist/examples/modelview_2_formatting.js", "example-modelview_3_changingmodel": "node ./scripts/qode.js dist/examples/modelview_3_changingmodel.js", "example-modelview_4_headers": "node ./scripts/qode.js dist/examples/modelview_4_headers.js", - "example-modelview_5_edit": "node ./scripts/qode.js dist/examples/modelview_5_edit.js" + "example-modelview_5_edit": "node ./scripts/qode.js dist/examples/modelview_5_edit.js", + "example-modelview_buddy": "node ./scripts/qode.js dist/examples/modelview_buddy.js" }, "engines": { "node": ">=14.x.x" diff --git a/src/cpp/include/nodegui/QtCore/QAbstractItemModel/nabstractitemmodel.hpp b/src/cpp/include/nodegui/QtCore/QAbstractItemModel/nabstractitemmodel.hpp index dc1bd4496..b85750829 100644 --- a/src/cpp/include/nodegui/QtCore/QAbstractItemModel/nabstractitemmodel.hpp +++ b/src/cpp/include/nodegui/QtCore/QAbstractItemModel/nabstractitemmodel.hpp @@ -118,4 +118,16 @@ class DLL_EXPORT NAbstractItemModel : public QAbstractItemModel, public EventWid QModelIndex _protected_createIndex(int row, int column) const { return createIndex(row, column); } + + QModelIndex buddy(const QModelIndex &index) const override { + Napi::Env env = this->dispatchOnNode.Env(); + Napi::HandleScope scope(env); + + auto indexWrap = QModelIndexWrap::constructor.New({Napi::External::New(env, new QModelIndex(index))}); + Napi::Value buddyIndexNapiWrap = this->dispatchOnNode.Call({Napi::String::New(env, "buddy"), indexWrap}); + + QModelIndexWrap* buddyIndexWrap = Napi::ObjectWrap::Unwrap(buddyIndexNapiWrap.As()); + QModelIndex* buddyIndex = buddyIndexWrap->getInternalInstance(); + return *buddyIndex; + } }; diff --git a/src/cpp/include/nodegui/QtCore/QAbstractItemModel/qabstractitemmodel_wrap.h b/src/cpp/include/nodegui/QtCore/QAbstractItemModel/qabstractitemmodel_wrap.h index b062469e6..cbaeb61ec 100644 --- a/src/cpp/include/nodegui/QtCore/QAbstractItemModel/qabstractitemmodel_wrap.h +++ b/src/cpp/include/nodegui/QtCore/QAbstractItemModel/qabstractitemmodel_wrap.h @@ -29,4 +29,5 @@ class DLL_EXPORT QAbstractItemModelWrap : public Napi::ObjectWrap(this->instance->checkIndex(*index))); return result; } + +Napi::Value QAbstractItemModelWrap::_super_buddy(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + QModelIndexWrap* modelIndexWrap = Napi::ObjectWrap::Unwrap(info[0].As()); + QModelIndex* index = modelIndexWrap->getInternalInstance(); + + auto resultIndex = this->instance->QAbstractItemModel::buddy(*index); + + auto resultModelIndexWrap = QModelIndexWrap::constructor.New({Napi::External::New(env, new QModelIndex(resultIndex))}); + return resultModelIndexWrap; +} diff --git a/src/examples/modelview_buddy.ts b/src/examples/modelview_buddy.ts new file mode 100644 index 000000000..b6c403a40 --- /dev/null +++ b/src/examples/modelview_buddy.ts @@ -0,0 +1,80 @@ +import { ItemDataRole, ItemFlag, QAbstractTableModel, QModelIndex, QTableView, QVariant } from '..'; + +function main(): void { + const tableView = new QTableView(); + const model = new MyModel(); + tableView.setModel(model); + + tableView.show(); + + (global as any).win = tableView; +} + +const ROWS = 2; +const COLS = 3; + +class MyModel extends QAbstractTableModel { + private _data: string[][] = []; + + constructor() { + super(); + + for (let row = 0; row < ROWS; row++) { + this._data[row] = []; + for (let col = 0; col < COLS; col++) { + this._data[row][col] = ''; + } + } + this._data[1][1] = '<- Buddy'; + } + + rowCount(parent = new QModelIndex()): number { + return ROWS; + } + + columnCount(parent = new QModelIndex()): number { + return COLS; + } + + buddy(index: QModelIndex): QModelIndex { + if (index.row() == 1 && index.column() == 1) { + return this.createIndex(1, 0); + } + return index; + } + + data(index: QModelIndex, role = ItemDataRole.DisplayRole): QVariant { + if (role == ItemDataRole.DisplayRole && this.checkIndex(index)) { + return new QVariant(this._data[index.row()][index.column()]); + } + return new QVariant(); + } + + flags(index: QModelIndex): ItemFlag { + return ItemFlag.ItemIsEditable | super.flags(index); + } + + setData(index: QModelIndex, value: QVariant, role: number): boolean { + if (role == ItemDataRole.EditRole) { + if (!this.checkIndex(index)) { + return false; + } + //save value from editor to member m_gridData + this._data[index.row()][index.column()] = value.toString(); + + //for presentation purposes only: build and emit a joined string + let result = ''; + for (let row = 0; row < ROWS; row++) { + for (let col = 0; col < COLS; col++) { + result += this._data[row][col] + ' '; + } + } + console.log(result); + + return true; + } + return false; + } +} + +main(); diff --git a/src/lib/QtCore/QAbstractItemModel.ts b/src/lib/QtCore/QAbstractItemModel.ts index aa660b9ec..920c6b846 100644 --- a/src/lib/QtCore/QAbstractItemModel.ts +++ b/src/lib/QtCore/QAbstractItemModel.ts @@ -89,6 +89,15 @@ export class QAbstractItemModel extends NodeObject { } return false; + case 'buddy': + try { + return this.buddy(new QModelIndex(args[0])).native; + } catch (e) { + console.log(`An exception was thrown while dispatching to method 'buddy':`); + console.log(e); + } + return new QModelIndex().native; + default: return null; } @@ -96,6 +105,10 @@ export class QAbstractItemModel extends NodeObject { this.native.initNodeDispatcher(dispatcher); } + buddy(child: QModelIndex): QModelIndex { + return new QModelIndex(this.native._super_buddy(child.native)); + } + index(row: number, column: number, parent = new QModelIndex()): QModelIndex { return new QModelIndex(); }