Add 2nd model view tutorial app

This commit is contained in:
Simon Edwards 2021-08-14 18:18:13 +02:00
parent 467231d4b7
commit 25026a55f7
3 changed files with 99 additions and 1 deletions

View File

@ -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"

View File

@ -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<Napi::Boolean>().Value());
} else if (value.IsNumber()) {
if (isNapiValueInt(env, value)) {
return new QVariant(value.As<Napi::Number>().Int32Value());
} else {
return new QVariant(value.As<Napi::Number>().DoubleValue());
}
} else if (value.IsString()) {
std::string stringValue = value.As<Napi::String>().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<Napi::Array>();
@ -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<Napi::Object>();
std::string className = getNapiObjectClassName(object);
@ -67,20 +74,27 @@ QVariant* extrautils::convertToQVariant(Napi::Env& env, Napi::Value& value) {
ComponentWrap* componentWrap =
Napi::ObjectWrap<ComponentWrap>::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<Napi::External<QVariant>>().Data();
return variant;
} else {
return new QVariant();
}

View File

@ -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();