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/example/doric/shader/DoricGroupNode.cpp

166 lines
5.1 KiB
C++
Raw Permalink Normal View History

2021-02-09 15:54:22 +08:00
#include "DoricGroupNode.h"
2021-02-19 19:01:31 +08:00
2021-04-02 20:47:15 +08:00
void DoricGroupNode::blend(QQuickItem *view, QString name, QJsonValue prop) {
2021-02-19 19:01:31 +08:00
if (name == "children") {
mChildViewIds.clear();
if (prop.isArray()) {
2021-04-02 20:47:15 +08:00
QJsonArray array = prop.toArray();
const int length = array.size();
2021-02-20 16:20:18 +08:00
for (int i = 0; i < length; ++i) {
2021-04-02 20:47:15 +08:00
QJsonValue value = array.at(i);
2021-02-20 16:20:18 +08:00
if (value.isString()) {
mChildViewIds.append(value.toString());
}
}
2021-02-19 19:01:31 +08:00
}
} else {
DoricSuperNode::blend(view, name, prop);
}
}
2021-04-02 20:47:15 +08:00
void DoricGroupNode::blend(QJsonValue jsValue) {
2021-02-19 19:01:31 +08:00
DoricViewNode::blend(jsValue);
}
2021-04-13 21:14:17 +08:00
void DoricGroupNode::afterBlended(QJsonValue props) { configChildNode(); }
2021-02-20 16:20:18 +08:00
void DoricGroupNode::configChildNode() {
2021-04-13 21:14:17 +08:00
QQuickItem *parent = mView;
2021-02-20 16:20:18 +08:00
for (int idx = 0; idx < mChildViewIds.size(); idx++) {
QString id = mChildViewIds.at(idx);
2021-04-02 20:47:15 +08:00
QJsonValue model = getSubModel(id);
2021-02-20 16:20:18 +08:00
if (model.isUndefined()) {
2021-02-20 17:02:26 +08:00
DoricRegistry *registry = getContext()->getDriver()->getRegistry();
qCritical() << "model.isUndefined()";
2021-02-20 16:20:18 +08:00
continue;
}
2021-04-02 20:47:15 +08:00
QString type = model["type"].toString();
2021-02-20 16:20:18 +08:00
if (idx < mChildNodes.size()) {
DoricViewNode *oldNode = mChildNodes.at(idx);
if (id == oldNode->getId()) {
// The same, skip
2021-02-23 10:27:28 +08:00
} else {
2021-02-20 16:20:18 +08:00
if (mReusable) {
if (oldNode->getType() == type) {
2021-02-23 10:27:28 +08:00
// Same type,can be reused
oldNode->setId(id);
2021-04-02 20:47:15 +08:00
oldNode->blend(model["props"]);
} else {
2021-02-23 10:27:28 +08:00
// Replace this view
2021-04-26 21:21:59 +08:00
mChildNodes.removeAt(idx);
oldNode->getNodeView()->setParent(nullptr);
oldNode->getNodeView()->setParentItem(nullptr);
oldNode->getNodeView()->deleteLater();
DoricViewNode *newNode = DoricViewNode::create(getContext(), type);
if (newNode != nullptr) {
newNode->setId(id);
newNode->init(this);
2021-02-24 14:10:22 +08:00
if (idx >= mChildNodes.size()) {
mChildNodes.append(newNode);
newNode->getNodeView()->setParentItem(parent);
2021-02-24 14:10:22 +08:00
} else {
mChildNodes.insert(idx, newNode);
newNode->getNodeView()->setParentItem(parent);
2021-02-24 14:10:22 +08:00
newNode->getNodeView()->stackBefore(
parent->childItems().at(idx));
2021-02-24 14:10:22 +08:00
}
2021-04-02 20:47:15 +08:00
newNode->blend(model["props"]);
}
}
2021-02-20 16:20:18 +08:00
} else {
// Find in remain nodes
int position = -1;
for (int start = idx + 1; start < mChildNodes.size(); start++) {
DoricViewNode *node = mChildNodes.at(start);
if (id == node->getId()) {
// Found
position = start;
break;
}
2021-02-23 10:27:28 +08:00
}
if (position >= 0) {
// Found swap idx,position
mChildNodes.swapItemsAt(position, idx);
parent->childItems().swapItemsAt(position, idx);
2021-02-23 10:27:28 +08:00
} else {
// Not found,insert
DoricViewNode *newNode = DoricViewNode::create(getContext(), type);
if (newNode != nullptr) {
newNode->setId(id);
newNode->init(this);
2021-02-24 14:10:22 +08:00
if (idx >= mChildNodes.size()) {
mChildNodes.append(newNode);
newNode->getNodeView()->setParentItem(parent);
2021-02-24 14:10:22 +08:00
} else {
mChildNodes.insert(idx, newNode);
newNode->getNodeView()->setParentItem(parent);
2021-02-24 14:10:22 +08:00
newNode->getNodeView()->stackBefore(
parent->childItems().at(idx));
2021-02-24 14:10:22 +08:00
}
2021-04-02 20:47:15 +08:00
newNode->blend(model["props"]);
}
}
2021-02-20 16:20:18 +08:00
}
}
} else {
// Insert
2021-02-23 10:27:28 +08:00
DoricViewNode *newNode = DoricViewNode::create(getContext(), type);
if (newNode != nullptr) {
newNode->setId(id);
newNode->init(this);
2021-02-24 14:10:22 +08:00
if (idx >= mChildNodes.size()) {
mChildNodes.append(newNode);
newNode->getNodeView()->setParentItem(parent);
2021-02-24 14:10:22 +08:00
} else {
mChildNodes.insert(idx, newNode);
newNode->getNodeView()->setParentItem(parent);
newNode->getNodeView()->stackBefore(parent->childItems().at(idx));
2021-02-24 14:10:22 +08:00
}
2021-04-02 20:47:15 +08:00
newNode->blend(model["props"]);
2021-02-23 10:27:28 +08:00
}
2021-02-20 16:20:18 +08:00
}
}
2021-02-23 10:27:28 +08:00
int size = mChildNodes.size();
for (int idx = mChildViewIds.size(); idx < size; idx++) {
DoricViewNode *viewNode = mChildNodes.at(mChildViewIds.size());
2021-04-26 21:21:59 +08:00
mChildNodes.removeAt(mChildViewIds.size());
2021-02-23 10:27:28 +08:00
viewNode->getNodeView()->setParent(nullptr);
viewNode->getNodeView()->setParentItem(nullptr);
viewNode->getNodeView()->deleteLater();
}
2021-02-20 16:20:18 +08:00
}
2021-04-02 20:47:15 +08:00
void DoricGroupNode::blendSubNode(QJsonValue subProperties) {
QString subNodeId = subProperties["id"].toString();
2021-02-20 16:20:18 +08:00
for (DoricViewNode *node : mChildNodes) {
if (subNodeId == node->getId()) {
2021-04-02 20:47:15 +08:00
node->blend(subProperties["props"]);
2021-02-20 16:20:18 +08:00
break;
}
}
}
2021-04-13 21:14:17 +08:00
void DoricGroupNode::requestLayout() {
DoricSuperNode::requestLayout();
foreach (DoricViewNode *node, this->mChildNodes) { node->requestLayout(); }
}
2021-05-07 18:17:07 +08:00
DoricViewNode *DoricGroupNode::getSubNodeById(QString id) {
DoricSuperNode::requestLayout();
foreach (DoricViewNode *node, this->mChildNodes) {
if (id == node->getId()) {
return node;
}
}
return nullptr;
}