From 25026a55f7b019ee3d3a79d1d48a6218b29270f2 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Sat, 14 Aug 2021 18:18:13 +0200 Subject: [PATCH] Add 2nd model view tutorial app --- package.json | 3 +- src/cpp/lib/Extras/Utils/nutils.cpp | 14 +++++ src/examples/modelview_2_formatting.ts | 83 ++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/examples/modelview_2_formatting.ts diff --git a/package.json b/package.json index 1eafa7a0c..91bf442cb 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "docs": "cross-env typedoc && node ./website/docs/scripts/fixdocs.js", "qode": "cross-env node ./scripts/qode.js", "prepublishOnly": "cross-env npm run build", - "example-modelview_1_readonly": "node ./scripts/qode.js dist/examples/modelview_1_readonly.js" + "example-modelview_1_readonly": "node ./scripts/qode.js dist/examples/modelview_1_readonly.js", + "example-modelview_2_formatting": "node ./scripts/qode.js dist/examples/modelview_2_formatting.js" }, "engines": { "node": ">=14.x.x" diff --git a/src/cpp/lib/Extras/Utils/nutils.cpp b/src/cpp/lib/Extras/Utils/nutils.cpp index 91b11952f..bd1f87a49 100644 --- a/src/cpp/lib/Extras/Utils/nutils.cpp +++ b/src/cpp/lib/Extras/Utils/nutils.cpp @@ -31,17 +31,21 @@ QVariant* extrautils::convertToQVariant(Napi::Env& env, Napi::Value& value) { // Warning: Make sure you delete the QVariant fron this function upon use. if (value.IsBoolean()) { return new QVariant(value.As().Value()); + } else if (value.IsNumber()) { if (isNapiValueInt(env, value)) { return new QVariant(value.As().Int32Value()); } else { return new QVariant(value.As().DoubleValue()); } + } else if (value.IsString()) { std::string stringValue = value.As().Utf8Value(); return new QVariant(stringValue.c_str()); + } else if (value.IsSymbol()) { return new QVariant(); + } else if (value.IsArray()) { // Note: This assumes an array of strings. Napi::Array array = value.As(); @@ -54,12 +58,15 @@ QVariant* extrautils::convertToQVariant(Napi::Env& env, Napi::Value& value) { } } return new QVariant(value); + } else if (value.IsArrayBuffer()) { // TODO: fix this return new QVariant(); + } else if (value.IsTypedArray()) { // TODO: fix this return new QVariant(); + } else if (value.IsObject()) { Napi::Object object = value.As(); std::string className = getNapiObjectClassName(object); @@ -67,20 +74,27 @@ QVariant* extrautils::convertToQVariant(Napi::Env& env, Napi::Value& value) { ComponentWrap* componentWrap = Napi::ObjectWrap::Unwrap(object); return new QVariant(typeId, componentWrap->rawData); + } else if (value.IsFunction()) { return new QVariant(); + } else if (value.IsPromise()) { return new QVariant(); + } else if (value.IsUndefined()) { return new QVariant(); + } else if (value.IsNull()) { return new QVariant(); + } else if (value.IsBuffer()) { // TODO: fix this return new QVariant(); + } else if (value.IsExternal()) { QVariant* variant = value.As>().Data(); return variant; + } else { return new QVariant(); } diff --git a/src/examples/modelview_2_formatting.ts b/src/examples/modelview_2_formatting.ts new file mode 100644 index 000000000..9be303bb8 --- /dev/null +++ b/src/examples/modelview_2_formatting.ts @@ -0,0 +1,83 @@ +import { + AlignmentFlag, + CheckState, + GlobalColor, + ItemDataRole, + QAbstractTableModel, + QBrush, + QFont, + 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; +} + +class MyModel extends QAbstractTableModel { + rowCount(parent = new QModelIndex()): number { + return 2; + } + + columnCount(parent = new QModelIndex()): number { + return 3; + } + + data(index: QModelIndex, role = ItemDataRole.DisplayRole): QVariant { + const row = index.row(); + const col = index.column(); + // generate a log message when this method gets called + console.log(`row ${row}, col ${col}, role ${role}`); + + switch (role) { + case ItemDataRole.DisplayRole: + if (row == 0 && col == 1) { + return new QVariant('<--left'); + } + if (row == 1 && col == 1) { + return new QVariant('right-->'); + } + return new QVariant(`Row${row + 1}, Column${col + 1}`); + + case ItemDataRole.FontRole: + if (row == 0 && col == 0) { + // change font only for cell(0,0) + const boldFont = new QFont(); + boldFont.setBold(true); + return new QVariant(boldFont.native); + } + break; + + case ItemDataRole.BackgroundRole: + if (row == 1 && col == 2) { + //change background only for cell(1,2) + return new QVariant(new QBrush(GlobalColor.red).native); + } + break; + + case ItemDataRole.TextAlignmentRole: + if (row == 1 && col == 1) { + // change text alignment only for cell(1,1) + return new QVariant(AlignmentFlag.AlignRight | AlignmentFlag.AlignVCenter); + } + break; + + case ItemDataRole.CheckStateRole: + if (row == 1 && col == 0) { + // add a checkbox to cell(1,0) + return new QVariant(CheckState.Checked); + } + break; + } + return new QVariant(); + } +} + +main();