From fc64e7af9912037df4ff44988200a972f2eff8a7 Mon Sep 17 00:00:00 2001 From: Doug Barbieri Date: Wed, 12 Aug 2020 09:03:29 -0500 Subject: [PATCH] Add QIcon support to QTreeWidgetItem. (#657) * Add QIcon support to QTreeWidgetItem. Signed-off-by: R. Douglas Barbieri * Move to QTreeWidgetItem from QTableWidgetItem... I made a mistake and added the icon support to `QTableWidgetItem` instead of the tree widget. * Ran prettier. * Add small test for the widget and item. * Added tree widget test to demo. --- .../QTreeWidgetItem/qtreewidgetitem_wrap.h | 2 + .../qtablewidgetitem_wrap.cpp | 1 + .../QTreeWidgetItem/qtreewidgetitem_wrap.cpp | 24 ++++++++- src/demo.ts | 53 +++++++++++++++++++ src/lib/QtWidgets/QTreeWidgetItem.ts | 16 ++++++ .../QtWidgets/__tests__/QTreeWidget.test.ts | 34 ++++++++++++ 6 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 src/lib/QtWidgets/__tests__/QTreeWidget.test.ts diff --git a/src/cpp/include/nodegui/QtWidgets/QTreeWidgetItem/qtreewidgetitem_wrap.h b/src/cpp/include/nodegui/QtWidgets/QTreeWidgetItem/qtreewidgetitem_wrap.h index 549f8a83f..3d07efd96 100644 --- a/src/cpp/include/nodegui/QtWidgets/QTreeWidgetItem/qtreewidgetitem_wrap.h +++ b/src/cpp/include/nodegui/QtWidgets/QTreeWidgetItem/qtreewidgetitem_wrap.h @@ -28,6 +28,8 @@ class DLL_EXPORT QTreeWidgetItemWrap static Napi::FunctionReference constructor; // wrapped methods + Napi::Value setIcon(const Napi::CallbackInfo &info); + Napi::Value icon(const Napi::CallbackInfo &info); Napi::Value setText(const Napi::CallbackInfo &info); Napi::Value parent(const Napi::CallbackInfo &info); Napi::Value childCount(const Napi::CallbackInfo &info); diff --git a/src/cpp/lib/QtWidgets/QTableWidgetItem/qtablewidgetitem_wrap.cpp b/src/cpp/lib/QtWidgets/QTableWidgetItem/qtablewidgetitem_wrap.cpp index bb5d875fd..8563a7943 100644 --- a/src/cpp/lib/QtWidgets/QTableWidgetItem/qtablewidgetitem_wrap.cpp +++ b/src/cpp/lib/QtWidgets/QTableWidgetItem/qtablewidgetitem_wrap.cpp @@ -1,6 +1,7 @@ #include "QtWidgets/QTableWidgetItem/qtablewidgetitem_wrap.h" #include "Extras/Utils/nutils.h" +#include "QtGui/QIcon/qicon_wrap.h" #include "core/Component/component_wrap.h" Napi::FunctionReference QTableWidgetItemWrap::constructor; diff --git a/src/cpp/lib/QtWidgets/QTreeWidgetItem/qtreewidgetitem_wrap.cpp b/src/cpp/lib/QtWidgets/QTreeWidgetItem/qtreewidgetitem_wrap.cpp index 9179d447a..c33971317 100644 --- a/src/cpp/lib/QtWidgets/QTreeWidgetItem/qtreewidgetitem_wrap.cpp +++ b/src/cpp/lib/QtWidgets/QTreeWidgetItem/qtreewidgetitem_wrap.cpp @@ -14,7 +14,9 @@ Napi::Object QTreeWidgetItemWrap::init(Napi::Env env, Napi::Object exports) { char CLASSNAME[] = "QTreeWidgetItem"; Napi::Function func = DefineClass( env, CLASSNAME, - {InstanceMethod("setText", &QTreeWidgetItemWrap::setText), + {InstanceMethod("setIcon", &QTreeWidgetItemWrap::setIcon), + InstanceMethod("icon", &QTreeWidgetItemWrap::text), + InstanceMethod("setText", &QTreeWidgetItemWrap::setText), InstanceMethod("parent", &QTreeWidgetItemWrap::parent), InstanceMethod("child", &QTreeWidgetItemWrap::child), InstanceMethod("text", &QTreeWidgetItemWrap::text), @@ -133,6 +135,26 @@ QTreeWidgetItemWrap::QTreeWidgetItemWrap(const Napi::CallbackInfo &info) this->rawData = extrautils::configureComponent(this->getInternalInstance()); } +Napi::Value QTreeWidgetItemWrap::setIcon(const Napi::CallbackInfo &info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + int const column = info[0].As().Int32Value(); + Napi::Object const iconObject = info[1].As(); + QIconWrap *iconWrap = Napi::ObjectWrap::Unwrap(iconObject); + this->instance->setIcon(column, *iconWrap->getInternalInstance()); + return env.Null(); +} +Napi::Value QTreeWidgetItemWrap::icon(const Napi::CallbackInfo &info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + Napi::Number const column = info[0].As(); + QIcon icon = this->instance->icon(column); + auto instance = QIconWrap::constructor.New( + {Napi::External::New(env, new QIcon(icon))}); + return instance; +} Napi::Value QTreeWidgetItemWrap::setText(const Napi::CallbackInfo &info) { Napi::Env env = info.Env(); Napi::HandleScope scope(env); diff --git a/src/demo.ts b/src/demo.ts index a536723ed..f5446ca97 100644 --- a/src/demo.ts +++ b/src/demo.ts @@ -1,6 +1,9 @@ import { QMainWindow, QWidget } from '.'; import { QGridLayout } from './lib/QtWidgets/QGridLayout'; import { QLabel } from './lib/QtWidgets/QLabel'; +import { QTreeWidget } from './lib/QtWidgets/QTreeWidget'; +import { QTreeWidgetItem } from './lib/QtWidgets/QTreeWidgetItem'; +import { QIcon } from './lib/QtGui/QIcon'; const win = new QMainWindow(); win.resize(500, 500); @@ -41,8 +44,58 @@ columnFour.setText('Four'); columnFour.setInlineStyle('background-color: orange'); outerLayout.addWidget(columnFour, 1, 1); +const tree = new QTreeWidget(); +tree.setColumnCount(2); +tree.setHeaderLabels(['First Column', 'Second Column']); +tree.setSortingEnabled(true); +tree.setInlineStyle('font-size: 24px'); +outerLayout.addWidget(tree, 2, 0, 2, 0); + console.log(outerLayout.rowCount(), outerLayout.columnCount()); +const myImage = './website/static/img/logo.png'; +const icon = new QIcon(myImage); + +const item1 = new QTreeWidgetItem(); +item1.setText(0, `item-1`); +item1.setText(1, `1-item-1`); +item1.setIcon(1, icon); +const item2 = new QTreeWidgetItem(); +item2.setText(0, `item-2`); +item2.setText(1, `1-item-2`); +item2.setIcon(1, icon); +const item3 = new QTreeWidgetItem(); +item3.setText(0, `item-3`); +item3.setText(1, `1-item-3`); +item3.setIcon(1, icon); +const item4 = new QTreeWidgetItem(); +item4.setText(0, `item-4`); +item4.setText(1, `1-item-4`); +item4.setIcon(1, icon); +const item5 = new QTreeWidgetItem(); +item5.setText(0, `item-5`); +item5.setText(1, `1-item-5`); +item5.setIcon(1, icon); +const item6 = new QTreeWidgetItem(); +item6.setText(0, `item-6`); +item6.setText(1, `1-item-6`); +item6.setIcon(1, icon); + +console.info('item6.icon()=', item6.icon(1)); + +tree.addTopLevelItem(item1); +tree.insertTopLevelItems(0, [item2, item3]); +tree.addTopLevelItems([item4, item5]); +tree.insertTopLevelItem(2, item6); + +// Add children to item1 +const c1item1 = new QTreeWidgetItem(item1); +c1item1.setText(0, `c1item1`); +c1item1.setText(1, `c1item2`); +const c1item2 = new QTreeWidgetItem(item1); +c1item2.setText(0, `c1item1`); +c1item2.setText(1, `c1item2`); + win.setCentralWidget(outer); win.show(); (global as any).win = win; diff --git a/src/lib/QtWidgets/QTreeWidgetItem.ts b/src/lib/QtWidgets/QTreeWidgetItem.ts index 304eb4f66..a654951bd 100644 --- a/src/lib/QtWidgets/QTreeWidgetItem.ts +++ b/src/lib/QtWidgets/QTreeWidgetItem.ts @@ -1,6 +1,7 @@ import addon from '../utils/addon'; import { Component, NativeElement } from '../core/Component'; import { checkIfNativeElement } from '../utils/helpers'; +import { QIcon } from '../QtGui/QIcon'; import { QTreeWidget } from './QTreeWidget'; import { ItemFlag } from '../QtEnums/ItemFlag'; import { CheckState, ItemDataRole } from '../QtEnums'; @@ -163,4 +164,19 @@ export class QTreeWidgetItem extends Component { isHidden(): boolean { return this.native.isHidden(); } + + /** + * Sets the icon for the item. + * @param icon The icon object + */ + setIcon(column: number, icon: QIcon): void { + this.native.setIcon(column, icon.native); + } + + /** + * Returns the icon object for the item. + */ + icon(column: number): QIcon { + return new QIcon(this.native.icon(column)); + } } diff --git a/src/lib/QtWidgets/__tests__/QTreeWidget.test.ts b/src/lib/QtWidgets/__tests__/QTreeWidget.test.ts new file mode 100644 index 000000000..698b54024 --- /dev/null +++ b/src/lib/QtWidgets/__tests__/QTreeWidget.test.ts @@ -0,0 +1,34 @@ +import { QTreeWidget } from '../QTreeWidget'; +import { QTreeWidgetItem } from '../QTreeWidgetItem'; +import { QIcon } from '../../QtGui/QIcon'; +import path from 'path'; + +function createTreeWidget(): QTreeWidget { + const tree = new QTreeWidget(); + tree.setColumnCount(2); + tree.setHeaderLabels(['First Column', 'Second Column']); + return tree; +} + +describe('QTreeWidget', () => { + it('instantiate a tree widget', () => { + const tree = createTreeWidget(); + expect(tree.inherits('QTreeWidget')).toBe(true); + }); + it('setText', () => { + const tree = createTreeWidget(); + const item = new QTreeWidgetItem(); + item.setText(0, 'row0, column0'); + expect(item.text(0)).toEqual('row0, column0'); + tree.addTopLevelItem(item); + }); + it('setIcon', () => { + const item = new QTreeWidgetItem(); + const testImagePath = path.resolve(__dirname, 'assets', 'nodegui.png'); + const icon = new QIcon(testImagePath); + item.setText(0, 'row0, column0'); + item.setIcon(0, icon); + // TODO: figure out a way to check this. They are not equivalent. + // expect(item.icon(0).cacheKey()).toEqual(icon.cacheKey()); + }); +});