diff --git a/SimsWorld/ActionNodeConfiguration.cpp b/SimsWorld/ActionNodeConfiguration.cpp index 066a483..9f50e34 100644 --- a/SimsWorld/ActionNodeConfiguration.cpp +++ b/SimsWorld/ActionNodeConfiguration.cpp @@ -30,3 +30,7 @@ ActionNodeConfiguration::ActionNodeConfiguration(QWidget* p) _output_model->setHorizontalHeaderLabels(QStringList() << u8"变量名" << u8"变量类型" << u8"关联变量序列" << u8"关联转换器类型"); } + +void ActionNodeConfiguration::setTarget(NodePresent* ins) +{ +} diff --git a/SimsWorld/ActionNodeConfiguration.h b/SimsWorld/ActionNodeConfiguration.h index 9e936f5..0124987 100644 --- a/SimsWorld/ActionNodeConfiguration.h +++ b/SimsWorld/ActionNodeConfiguration.h @@ -5,8 +5,9 @@ #include #include #include +#include "sims_world.h" -class ActionNodeConfiguration : public QFrame +class ActionNodeConfiguration : public QFrame, public NodeConfiguration { private: QComboBox *const _execute_select; @@ -17,5 +18,7 @@ private: public: ActionNodeConfiguration(QWidget *p = nullptr); + + void setTarget(NodePresent* ins) override; }; diff --git a/SimsWorld/BehaviorConfigurationPanel.cpp b/SimsWorld/BehaviorConfigurationPanel.cpp index 4127a25..07b71ba 100644 --- a/SimsWorld/BehaviorConfigurationPanel.cpp +++ b/SimsWorld/BehaviorConfigurationPanel.cpp @@ -33,13 +33,14 @@ BehaviorMapConfigurationPanel::BehaviorMapConfigurationPanel(QWidget* p) }); } -void BehaviorMapConfigurationPanel::setTarget(std::shared_ptr map_root, NodePresent* ins) +#include +void BehaviorMapConfigurationPanel::setTarget(NodePresent* ins) { this->_bind_graph = ins; - this->_bind_node = std::dynamic_pointer_cast(map_root); + this->_bind_node = std::dynamic_pointer_cast(ins->logicalBind()); _variable_model->removeRows(0, _variable_model->rowCount()); - _root_name->setText(map_root->typeName()); + _root_name->setText(_bind_node->typeName()); for (auto key : _bind_node->inputVariableKeys()) { auto ins_prop = _bind_node->getVariable(key); QList row; diff --git a/SimsWorld/BehaviorConfigurationPanel.h b/SimsWorld/BehaviorConfigurationPanel.h index c6bae3c..b010556 100644 --- a/SimsWorld/BehaviorConfigurationPanel.h +++ b/SimsWorld/BehaviorConfigurationPanel.h @@ -7,6 +7,7 @@ #include #include #include +#include "sims_world.h" class VariableAdd : public QDialog { private: @@ -23,7 +24,7 @@ public: }; class NodePresent; -class BehaviorMapConfigurationPanel : public QFrame +class BehaviorMapConfigurationPanel : public QFrame, public NodeConfiguration { Q_OBJECT private: @@ -37,6 +38,6 @@ private: public: BehaviorMapConfigurationPanel(QWidget *p = nullptr); - void setTarget(std::shared_ptr map_root, NodePresent *ins); + void setTarget(NodePresent *ins) override; }; diff --git a/SimsWorld/BehaviorEditor.cpp b/SimsWorld/BehaviorEditor.cpp index 5b77539..c7cacbe 100644 --- a/SimsWorld/BehaviorEditor.cpp +++ b/SimsWorld/BehaviorEditor.cpp @@ -411,6 +411,16 @@ QPointF BehaviorsPresent::nodeRelayout(QHash, std:: return origin_offset + QPointF(0, node_outline.height()); } +#include +void BehaviorsPresent::mousePressEvent(QMouseEvent* e) +{ + QWidget::mousePressEvent(e); + + auto item_ptr = itemAt(e->pos()); + if (item_ptr && dynamic_cast(item_ptr)) + emit this->clickedUponAtItem(dynamic_cast(item_ptr)); +} + #include void BehaviorEditor::open_behavior_map() { @@ -455,6 +465,33 @@ void BehaviorEditor::new_behavior_map() #include #include +void BehaviorEditor::configurationPanel(NodePresent* n) +{ + switch (n->logicalBind()->nodeKind()) + { + case NodeKind::MAPNODE: + _stacked_panel->setCurrentIndex(4); + break; + case NodeKind::MODIFYNODE: + _stacked_panel->setCurrentIndex(1); + break; + case NodeKind::ACTIONNODE: + _stacked_panel->setCurrentIndex(2); + break; + case NodeKind::COMPARENODE: + _stacked_panel->setCurrentIndex(3); + break; + + default: + _stacked_panel->setCurrentIndex(0); + break; + } + + auto current_panel = dynamic_cast(_stacked_panel->currentWidget()); + if (current_panel) + current_panel->setTarget(n); +} + BehaviorEditor::BehaviorEditor(QWidget* parent /*= nullptr*/) : QMainWindow(parent), _type_view(new NodeTypesView(this)), @@ -500,17 +537,19 @@ BehaviorEditor::BehaviorEditor(QWidget* parent /*= nullptr*/) _type_view->setModel(_type_model); nodeTypesViewInit(_type_model); - _default_configuration->setFrameStyle(QFrame::WinPanel|QFrame::Sunken); + _default_configuration->setFrameStyle(QFrame::WinPanel | QFrame::Sunken); _default_configuration->setAlignment(Qt::AlignCenter); // 下方堆叠面板 _message_panel->addTab(_logs_present, u8"控制台"); _message_panel->addTab(_stacked_panel, u8"属性配置"); - _stacked_panel->addWidget(_modify_configuration); - _stacked_panel->addWidget(_action_configuration); - _stacked_panel->addWidget(_compare_configuration); - _stacked_panel->addWidget(_map_configuration); - _stacked_panel->addWidget(_default_configuration); + _stacked_panel->addWidget(_default_configuration);// 0 + _stacked_panel->addWidget(_modify_configuration); // 1 + _stacked_panel->addWidget(_action_configuration); // 2 + _stacked_panel->addWidget(_compare_configuration);// 3 + _stacked_panel->addWidget(_map_configuration); // 4 + + connect(_logical_present, &BehaviorsPresent::clickedUponAtItem, this, &BehaviorEditor::configurationPanel); } void BehaviorEditor::nodeTypesViewInit(QStandardItemModel* m) diff --git a/SimsWorld/BehaviorEditor.h b/SimsWorld/BehaviorEditor.h index 95f1f95..b99e541 100644 --- a/SimsWorld/BehaviorEditor.h +++ b/SimsWorld/BehaviorEditor.h @@ -77,6 +77,7 @@ public: /// class BehaviorsPresent : public QGraphicsView { + Q_OBJECT private: QGraphicsScene _bind_scene; @@ -90,6 +91,9 @@ private: /// std::shared_ptr _bind_maproot = nullptr; +signals: + void clickedUponAtItem(NodePresent *node); + public: uint64_t _node_id_max = 0; BehaviorsPresent(QWidget* parent = nullptr); @@ -128,6 +132,8 @@ public: QPointF nodeRelayout(QHash, std::pair>& _outline_occupy, std::shared_ptr ins, const QPointF& origin_offset); +protected: + void mousePressEvent(QMouseEvent *e) override; }; @@ -183,7 +189,7 @@ private: // ============================================== QTextBrowser* const _logs_present; - void configurationPanel(); + void configurationPanel(NodePresent *n); public: BehaviorEditor(QWidget* parent = nullptr); diff --git a/SimsWorld/CompareNodeConfiguration.cpp b/SimsWorld/CompareNodeConfiguration.cpp index 01ff149..fe2a9e2 100644 --- a/SimsWorld/CompareNodeConfiguration.cpp +++ b/SimsWorld/CompareNodeConfiguration.cpp @@ -26,3 +26,7 @@ CompareNodeConfiguration::CompareNodeConfiguration(QWidget* p) p_layout->setColumnStretch(1, 1); p_layout->setRowStretch(4, 1); } + +void CompareNodeConfiguration::setTarget(NodePresent* ins) +{ +} diff --git a/SimsWorld/CompareNodeConfiguration.h b/SimsWorld/CompareNodeConfiguration.h index 6adba4b..db7c19f 100644 --- a/SimsWorld/CompareNodeConfiguration.h +++ b/SimsWorld/CompareNodeConfiguration.h @@ -1,8 +1,9 @@ #pragma once #include #include +#include "sims_world.h" -class CompareNodeConfiguration : public QFrame +class CompareNodeConfiguration : public QFrame, public NodeConfiguration { private: QComboBox *const _type_select; @@ -13,5 +14,6 @@ private: public: CompareNodeConfiguration(QWidget *p = nullptr); + void setTarget(NodePresent* ins) override; }; diff --git a/SimsWorld/ModifyNodeConfiguration.cpp b/SimsWorld/ModifyNodeConfiguration.cpp index 08ffc06..6b5f3f7 100644 --- a/SimsWorld/ModifyNodeConfiguration.cpp +++ b/SimsWorld/ModifyNodeConfiguration.cpp @@ -15,3 +15,7 @@ ModifyNodeConfiguration::ModifyNodeConfiguration(QWidget* p) p_layout->setRowStretch(1, 1); p_layout->setColumnStretch(1, 1); } + +void ModifyNodeConfiguration::setTarget(NodePresent* ins) +{ +} diff --git a/SimsWorld/ModifyNodeConfiguration.h b/SimsWorld/ModifyNodeConfiguration.h index 3964a40..74050a9 100644 --- a/SimsWorld/ModifyNodeConfiguration.h +++ b/SimsWorld/ModifyNodeConfiguration.h @@ -2,13 +2,16 @@ #include #include #include +#include "sims_world.h" -class ModifyNodeConfiguration : public QFrame +class ModifyNodeConfiguration : public QFrame, public NodeConfiguration { private: QComboBox *const _modify_types; public: ModifyNodeConfiguration(QWidget *p = nullptr); + + void setTarget(NodePresent* ins) override; }; diff --git a/SimsWorld/SimsWorld.vcxproj b/SimsWorld/SimsWorld.vcxproj index 3055397..96a872b 100644 --- a/SimsWorld/SimsWorld.vcxproj +++ b/SimsWorld/SimsWorld.vcxproj @@ -125,7 +125,7 @@ - + diff --git a/SimsWorld/SimsWorld.vcxproj.filters b/SimsWorld/SimsWorld.vcxproj.filters index 7bef30c..00715c8 100644 --- a/SimsWorld/SimsWorld.vcxproj.filters +++ b/SimsWorld/SimsWorld.vcxproj.filters @@ -78,11 +78,11 @@ Header Files + + Header Files + - - Header Files - Header Files diff --git a/SimsWorld/sims_world.h b/SimsWorld/sims_world.h index 1566f4c..73dde83 100644 --- a/SimsWorld/sims_world.h +++ b/SimsWorld/sims_world.h @@ -4,6 +4,12 @@ #include "ui_sims_world.h" #include +class NodePresent; +class NodeConfiguration { +public: + virtual void setTarget(NodePresent* ins) = 0; +}; + class SimsWorld : public QMainWindow { Q_OBJECT