From d231ae099fcccd04f3f80e7d6d8f1491bb852d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8A=B2=E9=B9=8F?= Date: Wed, 14 Apr 2021 12:42:03 +0800 Subject: [PATCH] fix doric layout bug --- doric-Qt/doric/resources/text.qml | 4 +- doric-Qt/doric/shader/DoricViewNode.cpp | 2 +- doric-Qt/doric/utils/DoricLayouts.cpp | 123 ++++++++++++++++-------- doric-Qt/doric/utils/DoricLayouts.h | 8 +- 4 files changed, 91 insertions(+), 46 deletions(-) diff --git a/doric-Qt/doric/resources/text.qml b/doric-Qt/doric/resources/text.qml index 2620ca6f..f423762e 100644 --- a/doric-Qt/doric/resources/text.qml +++ b/doric-Qt/doric/resources/text.qml @@ -39,12 +39,12 @@ TextArea { } onWidthChanged: { -// bg.implicitWidth = width + bg.implicitWidth = width console.log(tag, uuid + " onWidthChanged: " + this.width) } onHeightChanged: { -// bg.implicitHeight = height + bg.implicitHeight = height console.log(tag, uuid + " onHeightChanged: " + this.height) } diff --git a/doric-Qt/doric/shader/DoricViewNode.cpp b/doric-Qt/doric/shader/DoricViewNode.cpp index 1ffe83d6..b95e3da2 100644 --- a/doric-Qt/doric/shader/DoricViewNode.cpp +++ b/doric-Qt/doric/shader/DoricViewNode.cpp @@ -110,7 +110,7 @@ void DoricViewNode::blend(QQuickItem *view, QString name, QJsonValue prop) { } else if (name == "x") { getLayouts()->setMarginLeft(prop.toInt()); } else if (name == "y") { - getLayouts()->setMarginRight(prop.toInt()); + getLayouts()->setMarginTop(prop.toInt()); } else if (name == "corners") { view->setProperty("radius", prop.toInt()); } else if (name == "onClick") { diff --git a/doric-Qt/doric/utils/DoricLayouts.cpp b/doric-Qt/doric/utils/DoricLayouts.cpp index a25815f1..232549cf 100644 --- a/doric-Qt/doric/utils/DoricLayouts.cpp +++ b/doric-Qt/doric/utils/DoricLayouts.cpp @@ -1,12 +1,48 @@ #include "DoricLayouts.h" -DoricLayouts::DoricLayouts() { +DoricLayouts::DoricLayouts(QObject *parent) : QObject(parent) { this->widthSpec = DoricLayoutSpec::DoricLayoutJust; this->heightSpec = DoricLayoutSpec::DoricLayoutJust; - this->maxWidth = 32767; - this->maxHeight = 32767; + + this->alignment = 0; + this->gravity = 0; + + this->width = 0; + this->height = 0; + + this->spacing = 0; + + this->marginBottom = 0; + this->marginTop = 0; + this->marginLeft = 0; + this->marginRight = 0; + + this->paddingLeft = 0; + this->paddingRight = 0; + this->paddingBottom = 0; + this->paddingTop = 0; + + this->weight = 0; + + this->layoutType = DoricLayoutType::DoricUndefined; + + this->disabled = false; + + this->maxWidth = INT_MAX; + this->maxHeight = INT_MAX; this->minWidth = 0; this->minHeight = 0; + + this->measuredWidth = 0; + this->measuredHeight = 0; + + this->measuredX = 0; + this->measuredY = 0; + + this->undefined = false; + + this->contentWidth = 0; + this->contentHeight = 0; } void DoricLayouts::setWidthSpec(int widthSpec) { this->widthSpec = widthSpec; } @@ -51,6 +87,7 @@ void DoricLayouts::setWeight(int weight) { this->weight = weight; } void DoricLayouts::setView(QQuickItem *view) { this->view = view; + this->setParent(view); this->tag = view->property("tag").toString(); } @@ -92,15 +129,15 @@ void DoricLayouts::measureSelf(int targetWidth, int targetHeight) { (DoricLayouts *)(parent->property("doricLayout").toULongLong()); if (parentDoricLayout->layoutType == DoricLayoutType::DoricHLayout && this->weight > 0) { - width = this->measuredWidth = 0; - setMeasuredWidth(); + width = 0; + setMeasuredWidth(0); } else { - width = this->measuredWidth = targetWidth; - setMeasuredWidth(); + width = targetWidth; + setMeasuredWidth(targetWidth); } } else if (this->widthSpec == DoricLayoutSpec::DoricLayoutJust) { - width = this->measuredWidth = this->width; - setMeasuredWidth(); + width = this->width; + setMeasuredWidth(this->width); } else { width = targetWidth; } @@ -113,12 +150,15 @@ void DoricLayouts::measureSelf(int targetWidth, int targetHeight) { (DoricLayouts *)(parent->property("doricLayout").toULongLong()); if (parentDoricLayout->layoutType == DoricLayoutType::DoricVLayout && this->weight > 0) { - height = this->measuredHeight = 0; + height = 0; + setMeasuredHeight(0); } else { - height = this->measuredHeight = targetHeight; + height = targetHeight; + setMeasuredHeight(targetHeight); } } else if (this->heightSpec == DoricLayoutSpec::DoricLayoutJust) { - height = this->measuredHeight = this->height; + height = this->height; + setMeasuredHeight(this->height); } else { height = targetHeight; } @@ -137,6 +177,7 @@ void DoricLayouts::measureSelf(int targetWidth, int targetHeight) { } void DoricLayouts::measureContent(int targetWidth, int targetHeight) { + qCritical() << "measureContent: " << tag << this->view->property("uuid"); switch (this->layoutType) { case DoricLayoutType::DoricStack: { this->measureStackContent(targetWidth, targetHeight); @@ -163,13 +204,12 @@ void DoricLayouts::measureContent(int targetWidth, int targetHeight) { if (parentDoricLayout->layoutType != DoricLayoutType::DoricUndefined && parentDoricLayout->widthSpec == DoricLayoutSpec::DoricLayoutFit && this->widthSpec == DoricLayoutSpec::DoricLayoutMost) { - this->measuredWidth = 0; - setMeasuredWidth(); + setMeasuredWidth(0); } if (parentDoricLayout->layoutType != DoricLayoutType::DoricUndefined && parentDoricLayout->heightSpec == DoricLayoutSpec::DoricLayoutFit && this->heightSpec == DoricLayoutSpec::DoricLayoutMost) { - this->measuredHeight = 0; + setMeasuredHeight(0); } } } @@ -185,11 +225,10 @@ void DoricLayouts::measureUndefinedContent(int targetWidth, int targetHeight) { height = targetHeight; } if (this->widthSpec == DoricLayoutSpec::DoricLayoutFit) { - this->measuredWidth = width + this->paddingLeft + this->paddingRight; - setMeasuredWidth(); + setMeasuredWidth(width + this->paddingLeft + this->paddingRight); } if (this->heightSpec == DoricLayoutSpec::DoricLayoutFit) { - this->measuredHeight = height + this->paddingTop + this->paddingBottom; + setMeasuredHeight(height + this->paddingTop + this->paddingBottom); } } void DoricLayouts::measureStackContent(int targetWidth, int targetHeight) { @@ -211,13 +250,11 @@ void DoricLayouts::measureStackContent(int targetWidth, int targetHeight) { contentHeight = qMax(contentHeight, layout->takenHeight()); } if (this->widthSpec == DoricLayoutSpec::DoricLayoutFit) { - this->measuredWidth = contentWidth + this->paddingLeft + this->paddingRight; - setMeasuredWidth(); + setMeasuredWidth(contentWidth + this->paddingLeft + this->paddingRight); } if (this->heightSpec == DoricLayoutSpec::DoricLayoutFit) { - this->measuredHeight = - contentHeight + this->paddingTop + this->paddingBottom; + setMeasuredHeight(contentHeight + this->paddingTop + this->paddingBottom); } this->contentWidth = contentWidth; @@ -277,13 +314,11 @@ void DoricLayouts::measureVLayoutContent(int targetWidth, int targetHeight) { } if (this->widthSpec == DoricLayoutSpec::DoricLayoutFit) { - this->measuredWidth = contentWidth + this->paddingLeft + this->paddingRight; - setMeasuredWidth(); + setMeasuredWidth(contentWidth + this->paddingLeft + this->paddingRight); } if (this->heightSpec == DoricLayoutSpec::DoricLayoutFit) { - this->measuredHeight = - contentHeight + this->paddingTop + this->paddingBottom; + setMeasuredHeight(contentHeight + this->paddingTop + this->paddingBottom); } this->contentWidth = contentWidth; @@ -342,13 +377,11 @@ void DoricLayouts::measureHLayoutContent(int targetWidth, int targetHeight) { } if (this->widthSpec == DoricLayoutSpec::DoricLayoutFit) { - this->measuredWidth = contentWidth + this->paddingLeft + this->paddingRight; - setMeasuredWidth(); + setMeasuredWidth(contentWidth + this->paddingLeft + this->paddingRight); } if (this->heightSpec == DoricLayoutSpec::DoricLayoutFit) { - this->measuredHeight = - contentHeight + this->paddingTop + this->paddingBottom; + setMeasuredHeight(contentHeight + this->paddingTop + this->paddingBottom); } this->contentWidth = contentWidth; @@ -370,21 +403,19 @@ QPair DoricLayouts::removeMargin(int targetWidth, int targetHeight) { bool DoricLayouts::restrainSize() { bool needRemeasure = false; if (this->measuredWidth > this->maxWidth) { - this->measuredWidth = this->maxWidth; - setMeasuredWidth(); + setMeasuredWidth(this->maxWidth); needRemeasure = true; } if (this->measuredHeight > this->maxHeight) { - this->measuredHeight = this->maxHeight; + setMeasuredHeight(this->maxHeight); needRemeasure = true; } if (this->measuredWidth < this->minWidth) { - this->measuredWidth = this->minWidth; - setMeasuredWidth(); + setMeasuredWidth(this->minWidth); needRemeasure = true; } if (this->measuredHeight < this->minHeight) { - this->measuredHeight = this->minHeight; + setMeasuredHeight(this->minHeight); needRemeasure = true; } return needRemeasure; @@ -423,6 +454,12 @@ void DoricLayouts::setFrame() { } } + qCritical() << "DoricLayouts: " << tag << this->view->property("uuid") + << " measuredHeight: " << this->measuredHeight + << " measuredHeight: " << this->measuredHeight + << " measuredX: " << this->measuredX + << " measuredY: " << this->measuredY; + this->view->setProperty("width", this->measuredWidth); this->view->setProperty("height", this->measuredHeight); this->view->setProperty("x", this->measuredX); @@ -649,12 +686,20 @@ void DoricLayouts::layoutHLayout() { } // Private Section -void DoricLayouts::setMeasuredWidth() { +void DoricLayouts::setMeasuredWidth(int measuredWidth) { + this->measuredWidth = measuredWidth; qCritical() << "DoricLayouts: " << tag << this->view->property("uuid") << " measuredWidth: " << this->measuredWidth; + if (this->measuredWidth > 1000 || this->measuredWidth < 0) { + qDebug() << ""; + } } -void DoricLayouts::setMeasuredHeight() { - qCritical() << "DoricLayouts: " << tag +void DoricLayouts::setMeasuredHeight(int measuredHeight) { + this->measuredHeight = measuredHeight; + qCritical() << "DoricLayouts: " << tag << this->view->property("uuid") << " measuredHeight: " << this->measuredHeight; + if (this->measuredHeight > 2000 || this->measuredHeight < 0) { + qDebug() << ""; + } } diff --git a/doric-Qt/doric/utils/DoricLayouts.h b/doric-Qt/doric/utils/DoricLayouts.h index da91d56f..1de1fb3e 100644 --- a/doric-Qt/doric/utils/DoricLayouts.h +++ b/doric-Qt/doric/utils/DoricLayouts.h @@ -41,9 +41,9 @@ public: DoricGravityCenterX | DoricGravityCenterY; }; -class DoricLayouts { +class DoricLayouts : public QObject { public: - DoricLayouts(); + explicit DoricLayouts(QObject *parent = nullptr); void setWidthSpec(int widthSpec); void setHeightSpec(int heightSpec); @@ -150,9 +150,9 @@ private: bool resolved; int measuredWidth; - void setMeasuredWidth(); + void setMeasuredWidth(int measuredWidth); int measuredHeight; - void setMeasuredHeight(); + void setMeasuredHeight(int measuredHeight); int measuredX; int measuredY;