diff --git a/ComponentBasic/BehaviorPerform.cpp b/ComponentBasic/BehaviorPerform.cpp index f63f64e..6bcac11 100644 --- a/ComponentBasic/BehaviorPerform.cpp +++ b/ComponentBasic/BehaviorPerform.cpp @@ -98,7 +98,7 @@ std::shared_ptr MapKernal::messageLoader() const void MapKernal::registData(std::shared_ptr init) { if (_variable_types.contains(init->topicString())) - throw new UniException(QString("重复注册类型数据{%1}").arg(init->topicString())); + throw new UniException(QString(u8"重复注册类型数据{%1}").arg(init->topicString())); _variable_types[init->topicString()] = init; } @@ -132,6 +132,14 @@ NodeKind LogicalNode::nodeKind() const return _node_type; } +int LogicalNode::depth() const +{ + auto node_temp = this->parent().lock(); + if (!node_temp) return 0; + + return this->parent().lock()->depth() + 1; +} + std::shared_ptr LogicalNode::bindMap() const { auto node_temp = this->parent().lock(); @@ -155,7 +163,7 @@ int LogicalNode::getID() const QString LogicalNode::rtName() const { - return QString("%1(%2)").arg(this->typeName()).arg(getID()); + return QString(u8"%1(%2)").arg(this->typeName()).arg(getID()); } std::weak_ptr LogicalNode::parent() const @@ -171,7 +179,7 @@ void BehaviorMapNode::setVariable(const QString& key, IO_TYPE t, std::shared_ptr { if (_variables.contains(key)) if (_variables[key].second->topicString() != ins->topicString()) - throw new UniException("不同数据类型数据绑定同一个名称!"); + throw new UniException(u8"不同数据类型数据绑定同一个名称!"); _variables[key] = std::make_pair(t, ins); } @@ -233,7 +241,7 @@ QHash> BehaviorMapNode::inputList() const { QHash> list; for (auto key : this->_variables.keys()) { - if (this->_variables[key].first == IO_TYPE::INPUT && key.contains("::")) + if (this->_variables[key].first == IO_TYPE::INPUT && key.contains(u8"::")) list[key] = _variables[key].second; } @@ -244,7 +252,7 @@ QHash> BehaviorMapNode::outputList() const { QHash> list; for (auto key : this->_variables.keys()) { - if (this->_variables[key].first == IO_TYPE::OUTPUT && key.contains("::")) + if (this->_variables[key].first == IO_TYPE::OUTPUT && key.contains(u8"::")) list[key] = _variables[key].second; } @@ -275,7 +283,7 @@ QList> SequenceNode::getForwards() const QString SequenceNode::typeName() const { - return "顺序节点"; + return u8"顺序节点"; } LogicalResult SequenceNode::execute() { @@ -309,7 +317,7 @@ void SequenceNode::recoveryFrom(const QJsonObject& obj) QStringList state_items; STRLIST_PEAK(state_items); for (auto kv : state_items) { - auto kv_pair = kv.split(":"); + auto kv_pair = kv.split(u8":"); _state_map[kv_pair[0].toInt()] = (LogicalResult)kv_pair[1].toInt(); } } @@ -318,7 +326,7 @@ void SequenceNode::saveTo(QJsonObject& obj) const { QStringList state_items; for (auto inv : _state_map.keys()) { - state_items << QString("%1:%2").arg(inv).arg((int)_state_map[inv]); + state_items << QString(u8"%1:%2").arg(inv).arg((int)_state_map[inv]); } STRLIST_SAVE(state_items); @@ -398,7 +406,7 @@ void SelectorNode::recoveryFrom(const QJsonObject& obj) QStringList state_items; STRLIST_PEAK(state_items); for (auto kv : state_items) { - auto kv_pair = kv.split(":"); + auto kv_pair = kv.split(u8":"); _state_map[kv_pair[0].toInt()] = (LogicalResult)kv_pair[1].toInt(); } } @@ -407,7 +415,7 @@ void SelectorNode::saveTo(QJsonObject& obj) const { QStringList state_items; for (auto inv : _state_map.keys()) { - state_items << QString("%1:%2").arg(inv).arg((int)_state_map[inv]); + state_items << QString(u8"%1:%2").arg(inv).arg((int)_state_map[inv]); } STRLIST_SAVE(state_items); @@ -420,7 +428,7 @@ void SelectorNode::reset() QString SelectorNode::typeName() const { - return "选择节点"; + return u8"选择节点"; } LogicalResult SelectorNode::execute() @@ -462,7 +470,7 @@ void ParallelNode::reset() QString ParallelNode::typeName() const { - return "并行节点"; + return u8"并行节点"; } LogicalResult ParallelNode::execute() @@ -498,7 +506,7 @@ void ParallelNode::recoveryFrom(const QJsonObject& obj) QStringList state_items; STRLIST_PEAK(state_items); for (auto kv : state_items) { - auto kv_pair = kv.split(":"); + auto kv_pair = kv.split(u8":"); _state_map[kv_pair[0].toInt()] = (LogicalResult)kv_pair[1].toInt(); } } @@ -507,7 +515,7 @@ void ParallelNode::saveTo(QJsonObject& obj) const { QStringList state_items; for (auto inv : _state_map.keys()) { - state_items << QString("%1:%2").arg(inv).arg((int)_state_map[inv]); + state_items << QString(u8"%1:%2").arg(inv).arg((int)_state_map[inv]); } STRLIST_SAVE(state_items); @@ -518,14 +526,14 @@ void CompareNode::reset() { QString CompareNode::typeName() const { - return QString("%1<%2>").arg("比较节点", delegateName()); + return QString(u8"%1<%2>").arg(u8"比较节点", delegateName()); } LogicalResult CompareNode::execute() { if (this->_bind_delegate) { - auto vl = _data_map["左值"]; - auto vb = _data_map["右值"]; + auto vl = _data_map[u8"左值"]; + auto vb = _data_map[u8"右值"]; if (this->_bind_delegate->compare(vl, vb)) return LogicalResult::SUCCESS; } @@ -556,15 +564,15 @@ std::shared_ptr CompareNode::newDefault() const CompareNode::CompareNode() : LogicalNode(NodeKind::COMPARENODE) { - _data_map["左值"] = std::make_shared(); - _data_map["右值"] = std::make_shared(); + _data_map[u8"左值"] = std::make_shared(); + _data_map[u8"右值"] = std::make_shared(); } QString CompareNode::delegateName() const { if (_bind_delegate) return _bind_delegate->name(); - return ""; + return u8""; } void CompareNode::bindDelegate(std::shared_ptr ins) @@ -584,27 +592,27 @@ QHash> CompareNode::outputList() const void CompareNode::recoveryFrom(const QJsonObject& obj) { - auto vala = obj["ValL"]; - auto valb = obj["ValR"]; + auto vala = obj[u8"ValL"]; + auto valb = obj[u8"ValR"]; - _data_map["左值"]->recoveryFrom(vala.toObject()); - _data_map["右值"]->recoveryFrom(valb.toObject()); + _data_map[u8"左值"]->recoveryFrom(vala.toObject()); + _data_map[u8"右值"]->recoveryFrom(valb.toObject()); } void CompareNode::saveTo(QJsonObject& obj) const { QJsonObject vala, valb; - _data_map["左值"]->saveTo(vala); - _data_map["右值"]->saveTo(valb); + _data_map[u8"左值"]->saveTo(vala); + _data_map[u8"右值"]->saveTo(valb); - obj["ValL"] = vala; - obj["ValR"] = valb; + obj[u8"ValL"] = vala; + obj[u8"ValR"] = valb; } #include QString GeneralData::topicString() const { - return "GeneralData"; + return u8"GeneralData"; } std::shared_ptr GeneralData::newDefault() const diff --git a/ComponentBasic/BehaviorPerform.h b/ComponentBasic/BehaviorPerform.h index 55da8f7..5234124 100644 --- a/ComponentBasic/BehaviorPerform.h +++ b/ComponentBasic/BehaviorPerform.h @@ -249,6 +249,11 @@ public: /// /// NodeKind nodeKind() const; + /// + /// 节点深度 + /// + /// + int depth() const; /// /// 获取包含树图节点 diff --git a/SimsWorld/BehaviorEditor.cpp b/SimsWorld/BehaviorEditor.cpp index ce9d42c..625cdba 100644 --- a/SimsWorld/BehaviorEditor.cpp +++ b/SimsWorld/BehaviorEditor.cpp @@ -1,31 +1,42 @@ #include "BehaviorEditor.h" -NodePresent::NodePresent(std::shared_ptr bind) - :_node_bind(bind) { +NodePresent::NodePresent(QWidget* pwidget, double& width_bind, std::shared_ptr bind) + : _widget_p(pwidget), _node_bind(bind), _column_width(width_bind) { } QRectF NodePresent::contentMeasure() const { - return QRectF(0, 0, 200, 40); + auto metrics = this->_widget_p->fontMetrics(); + return metrics.boundingRect(this->_node_bind->rtName()); } QRectF NodePresent::boundingRect() const { - return contentMeasure() + QMargins(0, 0, 20, 20); + auto rect = contentMeasure(); + rect.setWidth(std::max(_column_width, rect.width())); + _column_width = rect.width(); + + return rect + QMargins(0, 0, 30, 30); } +#include void NodePresent::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { - //painter->drawRect(boundingRect()); - painter->translate(QPointF(10, 10)); + painter->drawRect(boundingRect()); + painter->fillRect(option->rect - QMargins(8,8,8,8), Qt::gray); + painter->translate(QPointF(15, 15)); auto rect = contentMeasure(); - painter->fillRect(rect, Qt::red); + painter->drawText(rect, 0, this->_node_bind->rtName()); } BehaviorsPresent::BehaviorsPresent(QWidget* parent /*= nullptr*/) : QGraphicsView(parent) { this->setScene(&_bind_scene); + + auto font = this->font(); + font.setPixelSize(20); + this->setFont(font); } void BehaviorsPresent::setRoot(std::shared_ptr root) @@ -54,8 +65,12 @@ void BehaviorsPresent::presentAllocate(std::shared_ptr ins) default: if (_present_peers.contains(ins)) return; - - _present_peers[ins] = new NodePresent(ins); + + for(auto idx=_column_aligns.size(); idx < ins->depth() + 1; ++idx) + _column_aligns.append(0); + + auto ¤t_width = _column_aligns[ins->depth()]; + _present_peers[ins] = new NodePresent(this, current_width, ins); this->_bind_scene.addItem(_present_peers[ins]); break; } @@ -76,6 +91,7 @@ void BehaviorsPresent::presentRelease(std::shared_ptr ins) default: if (this->_present_peers.contains(ins)) delete this->_present_peers[ins]; + this->_present_peers.remove(ins); break; } } diff --git a/SimsWorld/BehaviorEditor.h b/SimsWorld/BehaviorEditor.h index 1dbf546..d5cc54c 100644 --- a/SimsWorld/BehaviorEditor.h +++ b/SimsWorld/BehaviorEditor.h @@ -4,12 +4,19 @@ #include #include +uint qHash(const std::shared_ptr data, uint seed) noexcept; + +/// +/// 节点显示代理 +/// class NodePresent : public QGraphicsItem { private: + QWidget *const _widget_p; std::shared_ptr _node_bind; + double &_column_width; public: - NodePresent(std::shared_ptr bind); + NodePresent(QWidget *pwidget, double &width_bind, std::shared_ptr bind); QRectF contentMeasure() const; @@ -19,7 +26,6 @@ public: }; -uint qHash(const std::shared_ptr data, uint seed) noexcept; /// /// 行为树编辑展示 /// @@ -29,6 +35,7 @@ private: QGraphicsScene _bind_scene; const double _space_h = 120; + QVector _column_aligns; QHash, NodePresent*> _present_peers; /// diff --git a/SimsWorld/main.cpp b/SimsWorld/main.cpp index bded88a..116b450 100644 --- a/SimsWorld/main.cpp +++ b/SimsWorld/main.cpp @@ -39,7 +39,7 @@ int main(int argc, char *argv[]) item->setID(10000); parallel->insert(item); item = std::make_shared(); - item->setID(10001); + item->setID(100010000); parallel->insert(item); w.setRoot(root);