This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Doric/doric-Qt/doric/shader/DoricViewNode.cpp

157 lines
3.9 KiB
C++
Raw Normal View History

2021-02-19 19:01:31 +08:00
#include <QJSValueIterator>
2021-03-19 18:02:17 +08:00
#include "../utils/DoricConstant.h"
#include "../utils/DoricUtils.h"
#include "DoricSuperNode.h"
2021-02-19 19:01:31 +08:00
#include "DoricViewNode.h"
2021-02-09 15:54:22 +08:00
2021-03-02 17:18:23 +08:00
void DoricViewNode::blendLayoutConfig(QJSValue jsObject) {
this->mLayoutConfig = jsObject;
2021-03-02 17:18:23 +08:00
QJSValue margin = jsObject.property("margin");
QJSValue widthSpec = jsObject.property("widthSpec");
QJSValue heightSpec = jsObject.property("heightSpec");
2021-02-09 15:54:22 +08:00
2021-03-02 17:18:23 +08:00
if (widthSpec.isNumber()) {
switch (widthSpec.toInt()) {
case 0:
mView->setProperty("widthSpec", 0);
break;
2021-03-02 17:18:23 +08:00
case 1:
mView->setProperty("widthSpec", 1);
2021-03-02 17:18:23 +08:00
break;
case 2:
mView->setProperty("widthSpec", 2);
break;
}
}
if (heightSpec.isNumber()) {
switch (heightSpec.toInt()) {
case 0:
mView->setProperty("heightSpec", 0);
break;
case 1:
mView->setProperty("heightSpec", 1);
2021-03-02 17:18:23 +08:00
break;
case 2:
mView->setProperty("heightSpec", 2);
2021-03-02 17:18:23 +08:00
break;
}
}
}
void DoricViewNode::setLayoutConfig(QJSValue layoutConfig) {
if (mSuperNode != nullptr) {
mSuperNode->blendSubLayoutConfig(this, layoutConfig);
} else {
blendLayoutConfig(layoutConfig);
}
}
void DoricViewNode::init(DoricSuperNode *superNode) {
if (DoricUtils:: instanceof <DoricSuperNode *>(this)) {
DoricSuperNode *thiz = dynamic_cast<DoricSuperNode *>(this);
thiz->mReusable = superNode->mReusable;
}
this->mSuperNode = superNode;
this->mView = build();
2021-02-09 15:54:22 +08:00
}
QString DoricViewNode::getId() { return mId; }
void DoricViewNode::setId(QString id) { mId = id; }
QString DoricViewNode::getType() { return mType; }
QQuickItem *DoricViewNode::getNodeView() { return mView; }
2021-02-19 19:01:31 +08:00
void DoricViewNode::blend(QJSValue jsValue) {
2021-03-02 17:18:23 +08:00
QJSValue value = jsValue.property("layoutConfig");
if (value.isObject()) {
setLayoutConfig(value);
}
2021-02-19 19:01:31 +08:00
QJSValueIterator it(jsValue);
while (it.hasNext()) {
it.next();
blend(mView, it.name(), it.value());
2021-02-19 19:01:31 +08:00
}
}
void DoricViewNode::blend(QQuickItem *view, QString name, QJSValue prop) {
if (name == "width") {
if (!prop.isNumber()) {
return;
}
if (this->mLayoutConfig.isUndefined()) {
view->setWidth(prop.toInt());
} else {
QJSValue widthSpec = this->mLayoutConfig.property("widthSpec");
if (widthSpec.isNumber()) {
if (widthSpec.toInt() == 0) {
view->setWidth(prop.toInt());
}
}
}
2021-02-19 19:01:31 +08:00
} else if (name == "height") {
if (!prop.isNumber()) {
return;
}
if (this->mLayoutConfig.isUndefined()) {
view->setHeight(prop.toInt());
} else {
QJSValue heightSpec = this->mLayoutConfig.property("heightSpec");
if (heightSpec.isNumber()) {
if (heightSpec.toInt() == 0) {
view->setHeight(prop.toInt());
}
}
}
} else if (name == "backgroundColor") {
2021-02-24 10:50:41 +08:00
QString color = DoricUtils::doricColor(prop.toNumber()).name();
view->setProperty("color", color);
} else if (name == "x") {
view->setProperty("x", prop.toInt());
} else if (name == "y") {
view->setProperty("y", prop.toInt());
} else if (name == "corners") {
view->setProperty("radius", prop.toInt());
2021-03-19 18:02:17 +08:00
} else if (name == "onClick") {
if (prop.isString())
clickFunction = prop.toString();
} else {
qCritical() << name << ": " << prop.toString();
2021-02-19 19:01:31 +08:00
}
}
2021-03-19 18:02:17 +08:00
QList<QString> DoricViewNode::getIdList() {
QList<QString> ids;
DoricViewNode *viewNode = this;
do {
ids.append(viewNode->mId);
viewNode = viewNode->mSuperNode;
} while (viewNode != nullptr);
return ids;
}
void DoricViewNode::callJSResponse(QString funcId, QVariantList args) {
QVariantList nArgs;
QList<QString> idList = getIdList();
nArgs.append(idList);
nArgs.append(funcId);
foreach (const QVariant &arg, args)
nArgs.append(arg);
return getContext()->callEntity(DoricConstant::DORIC_ENTITY_RESPONSE, nArgs);
}
void DoricViewNode::onClick() {
if (clickFunction.isEmpty()) {
return;
}
QVariantList args;
callJSResponse(clickFunction, args);
}