From cce917681f81dfd8d2ce8a9cb52aa4edd1a0a9bd Mon Sep 17 00:00:00 2001 From: Atul R Date: Fri, 22 Nov 2019 00:02:49 +0100 Subject: [PATCH] Bug fixes: Flexlayout. Fixes layout issues (#211) * bump version * Fixes size control for the flex layout * Bumps version --- package-lock.json | 2 +- package.json | 4 +-- .../nodegui/core/FlexLayout/flexutils.h | 1 + .../core/YogaWidget/yogawidget_macro.h | 13 +++++++- .../QMainWindow/qmainwindow_wrap.cpp | 4 --- .../QScrollArea/qscrollarea_wrap.cpp | 4 +-- src/cpp/lib/core/FlexLayout/flexlayout.cpp | 6 ++-- src/cpp/lib/core/FlexLayout/flexutils.cpp | 1 + src/demo.ts | 33 +++++++++++++++++++ src/lib/QtWidgets/QMainWindow.ts | 3 +- src/lib/QtWidgets/QScrollArea.ts | 2 +- src/lib/core/YogaWidget.ts | 3 ++ 12 files changed, 61 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 604d31296..5228cd174 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@nodegui/nodegui", - "version": "0.6.0", + "version": "0.6.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ed7060351..9eaedc1e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nodegui/nodegui", - "version": "0.6.0", + "version": "0.6.2", "description": "A cross platform library to build native desktop apps.", "main": "dist/index.js", "typings": "dist/index.d.ts", @@ -16,7 +16,7 @@ "license": "MIT", "private": false, "scripts": { - "dev": "npm run build && qode --inspect dist/demo.js", + "dev": "npm run build && qode dist/demo.js", "postinstall": "npm run build:addon", "build": "tsc && npm run build:addon", "build:addon": "cross-env CMAKE_BUILD_PARALLEL_LEVEL=8 cmake-js compile", diff --git a/src/cpp/include/nodegui/core/FlexLayout/flexutils.h b/src/cpp/include/nodegui/core/FlexLayout/flexutils.h index 01b6458e9..7e687aa62 100644 --- a/src/cpp/include/nodegui/core/FlexLayout/flexutils.h +++ b/src/cpp/include/nodegui/core/FlexLayout/flexutils.h @@ -10,6 +10,7 @@ class FlexNodeContext { QLayoutItem* _layoutItem; public: + bool isSizeControlled; FlexNodeContext(void* widget); QWidget* widget(); QLayoutItem* layoutItem(); diff --git a/src/cpp/include/nodegui/core/YogaWidget/yogawidget_macro.h b/src/cpp/include/nodegui/core/YogaWidget/yogawidget_macro.h index 69647c96a..a94066f0c 100644 --- a/src/cpp/include/nodegui/core/YogaWidget/yogawidget_macro.h +++ b/src/cpp/include/nodegui/core/YogaWidget/yogawidget_macro.h @@ -14,6 +14,15 @@ YGNodeRef node = this->instance->getFlexNode(); \ Napi::Value yogaNodeRef = Napi::External::New(info.Env(), node); \ return yogaNodeRef; \ + } \ + Napi::Value setFlexNodeSizeControlled(const Napi::CallbackInfo& info) { \ + Napi::Env env = info.Env(); \ + Napi::HandleScope scope(env); \ + Napi::Boolean isSizeControlled = info[0].As(); \ + YGNodeRef node = this->instance->getFlexNode(); \ + FlexNodeContext* ctx = flexutils::getFlexNodeContext(node); \ + ctx->isSizeControlled = isSizeControlled.Value(); \ + return env.Null(); \ } #endif // YOGAWIDGET_WRAPPED_METHODS_DECLARATION @@ -21,6 +30,8 @@ #ifndef YOGAWIDGET_WRAPPED_METHODS_EXPORT_DEFINE #define YOGAWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \ \ - InstanceMethod("getFlexNode", &WidgetWrapName::getFlexNode), + InstanceMethod("getFlexNode", &WidgetWrapName::getFlexNode), \ + InstanceMethod("setFlexNodeSizeControlled", \ + &WidgetWrapName::setFlexNodeSizeControlled), #endif // YOGAWIDGET_WRAPPED_METHODS_EXPORT_DEFINE diff --git a/src/cpp/lib/QtWidgets/QMainWindow/qmainwindow_wrap.cpp b/src/cpp/lib/QtWidgets/QMainWindow/qmainwindow_wrap.cpp index bd4bf5a89..ea63c7a31 100644 --- a/src/cpp/lib/QtWidgets/QMainWindow/qmainwindow_wrap.cpp +++ b/src/cpp/lib/QtWidgets/QMainWindow/qmainwindow_wrap.cpp @@ -55,12 +55,8 @@ Napi::Value QMainWindowWrap::setCentralWidget(const Napi::CallbackInfo& info) { Napi::HandleScope scope(env); Napi::Object widgetObject = info[0].As(); - Napi::External centralWidgetFlexNode = - info[1].As>(); QWidgetWrap* centralWidget = Napi::ObjectWrap::Unwrap(widgetObject); - YGNodeInsertChild(this->instance->getFlexNode(), centralWidgetFlexNode.Data(), - 0); this->instance->setCentralWidget(centralWidget->getInternalInstance()); return env.Null(); } diff --git a/src/cpp/lib/QtWidgets/QScrollArea/qscrollarea_wrap.cpp b/src/cpp/lib/QtWidgets/QScrollArea/qscrollarea_wrap.cpp index f26f6ff4a..ea22391d0 100644 --- a/src/cpp/lib/QtWidgets/QScrollArea/qscrollarea_wrap.cpp +++ b/src/cpp/lib/QtWidgets/QScrollArea/qscrollarea_wrap.cpp @@ -56,11 +56,9 @@ Napi::Value QScrollAreaWrap::setWidget(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); Napi::HandleScope scope(env); Napi::Object contentWidget = info[0].As(); - Napi::External centralWidgetFlexNode = - info[1].As>(); QWidgetWrap* contentWidgetWrap = Napi::ObjectWrap::Unwrap(contentWidget); - YGNodeInsertChild(this->scrollNode, centralWidgetFlexNode.Data(), 0); + this->instance->setWidget(contentWidgetWrap->getInternalInstance()); return env.Null(); } diff --git a/src/cpp/lib/core/FlexLayout/flexlayout.cpp b/src/cpp/lib/core/FlexLayout/flexlayout.cpp index f029968ba..229b7b82b 100644 --- a/src/cpp/lib/core/FlexLayout/flexlayout.cpp +++ b/src/cpp/lib/core/FlexLayout/flexlayout.cpp @@ -147,9 +147,11 @@ void FlexLayout::setGeometry(const QRect& rect) { if (!this->node) { return; } - if (this->sizeConstraint() != QLayout::SetFixedSize) { - YGNodeStyleSetHeight(this->node, rect.height()); + + FlexNodeContext* layoutNodeCtx = flexutils::getFlexNodeContext(this->node); + if (parentWidget()->isWindow() || layoutNodeCtx->isSizeControlled) { YGNodeStyleSetWidth(this->node, rect.width()); + YGNodeStyleSetHeight(this->node, rect.height()); } calculateLayout(); diff --git a/src/cpp/lib/core/FlexLayout/flexutils.cpp b/src/cpp/lib/core/FlexLayout/flexutils.cpp index a02971b6d..d30ca4db0 100644 --- a/src/cpp/lib/core/FlexLayout/flexutils.cpp +++ b/src/cpp/lib/core/FlexLayout/flexutils.cpp @@ -3,6 +3,7 @@ FlexNodeContext::FlexNodeContext(void* widget) { this->_widget = widget; this->_layoutItem = nullptr; + this->isSizeControlled = false; } QWidget* FlexNodeContext::widget() { diff --git a/src/demo.ts b/src/demo.ts index 379c1e3f2..e8f8ac37c 100644 --- a/src/demo.ts +++ b/src/demo.ts @@ -47,3 +47,36 @@ win.setCentralWidget(scrollArea); win.show(); (global as any).win = win; + +// const win = new QMainWindow(); +const view = new QWidget(); +view.setLayout(new FlexLayout()); +view.setObjectName('view'); +const left = new QWidget(); +left.setObjectName('left'); +const right = new QWidget(); +right.setObjectName('right'); +view.layout?.addWidget(left); +view.layout?.addWidget(right); +view.show(); + +view.setStyleSheet(` + #view { + border: 1px solid yellow; + } + + #left { + flex: 1; + background-color: 'red'; + } + + #right { + flex: 1; + background-color: 'green'; + } +`); +center.layout?.addWidget(view); +// win.setCentralWidget(view); +// win.show(); +// win.resize(300, 300); +// (global as any).win = win; diff --git a/src/lib/QtWidgets/QMainWindow.ts b/src/lib/QtWidgets/QMainWindow.ts index e2b97c0b5..67463f883 100644 --- a/src/lib/QtWidgets/QMainWindow.ts +++ b/src/lib/QtWidgets/QMainWindow.ts @@ -34,8 +34,9 @@ export class QMainWindow extends NodeWidget { } setCentralWidget(widget: NodeWidget): void { // react:✓ - this.native.setCentralWidget(widget.native, widget.getFlexNode()); + this.native.setCentralWidget(widget.native); this.centralWidget = widget; + this.centralWidget.setFlexNodeSizeControlled(true); } setMenuBar(menuBar: QMenuBar): void { this.native.setMenuBar(menuBar.native); diff --git a/src/lib/QtWidgets/QScrollArea.ts b/src/lib/QtWidgets/QScrollArea.ts index bcea04322..35d3f6679 100644 --- a/src/lib/QtWidgets/QScrollArea.ts +++ b/src/lib/QtWidgets/QScrollArea.ts @@ -24,7 +24,7 @@ export class QScrollArea extends QAbstractScrollArea { setWidget(widget: NodeWidget): void { // react:✓, //TODO:getter this.contentWidget = widget; - this.native.setWidget(widget.native, widget.getFlexNode()); + this.native.setWidget(widget.native); } takeWidget(): NodeWidget | null { // react:✓ diff --git a/src/lib/core/YogaWidget.ts b/src/lib/core/YogaWidget.ts index a9baa077b..2fd6829ef 100644 --- a/src/lib/core/YogaWidget.ts +++ b/src/lib/core/YogaWidget.ts @@ -5,4 +5,7 @@ export abstract class YogaWidget extends NodeObject { getFlexNode(): FlexNode { return this.native.getFlexNode(); } + setFlexNodeSizeControlled(isSizeControlled: boolean): void { + this.native.setFlexNodeSizeControlled(isSizeControlled); + } }