diff --git a/ComponentBasic/BehaviorPerform.cpp b/ComponentBasic/BehaviorPerform.cpp index 7a59bf0..8aea995 100644 --- a/ComponentBasic/BehaviorPerform.cpp +++ b/ComponentBasic/BehaviorPerform.cpp @@ -50,8 +50,11 @@ QString BehaviorPerformPlugin::name() const } #include +#include "exec_delegate.h" MapKernel::MapKernel(std::shared_ptr ins) :_bind_loader(ins) { + auto output = std::make_shared(); + this->_execute_types[output->typeName()] = output; } QList MapKernel::compareTypes() const diff --git a/ComponentBasic/ComponentBasic.vcxproj b/ComponentBasic/ComponentBasic.vcxproj index 79e73fa..1adef82 100644 --- a/ComponentBasic/ComponentBasic.vcxproj +++ b/ComponentBasic/ComponentBasic.vcxproj @@ -37,7 +37,7 @@ 5.12.11_msvc2017_64 - core;xml;gui;qml;concurrent + core;xml;network;gui;qml;concurrent debug @@ -105,6 +105,7 @@ + @@ -113,6 +114,7 @@ + diff --git a/ComponentBasic/ComponentBasic.vcxproj.filters b/ComponentBasic/ComponentBasic.vcxproj.filters index 026a9ba..ff0208b 100644 --- a/ComponentBasic/ComponentBasic.vcxproj.filters +++ b/ComponentBasic/ComponentBasic.vcxproj.filters @@ -41,6 +41,9 @@ Header Files + + Header Files + @@ -64,6 +67,9 @@ Source Files + + Source Files + diff --git a/ComponentBasic/exec_delegate.cpp b/ComponentBasic/exec_delegate.cpp new file mode 100644 index 0000000..d083d08 --- /dev/null +++ b/ComponentBasic/exec_delegate.cpp @@ -0,0 +1,57 @@ +#include "exec_delegate.h" + +ConsolePresent::ConsolePresent() +: _write_port(new QUdpSocket()){ + _input_list[u8"输出变量"] = std::shared_ptr(); +} + +ConsolePresent::~ConsolePresent() +{ + delete _write_port; +} + +QString ConsolePresent::typeName() const +{ + return NAME(ConsolePresent); +} + +QHash> ConsolePresent::inputList() const +{ + return _input_list; +} + +QHash> ConsolePresent::outputList() const +{ + return QHash>(); +} + +void ConsolePresent::reset() +{ +} + +#include +#include +ExecuteResult ConsolePresent::execute() +{ + QJsonObject obj; + _input_list[u8"输出变量"]->saveTo(obj); + QJsonDocument doc(obj); + + auto cnt = _write_port->writeDatagram(doc.toJson(), QHostAddress::LocalHost, 6000); + if(cnt < 0) + return ExecuteResult::FAILURE; + return ExecuteResult::SUCCESS; +} + +std::shared_ptr ConsolePresent::newDefault() const +{ + return std::make_shared(); +} + +void ConsolePresent::recoveryFrom(const QJsonObject& obj) +{ +} + +void ConsolePresent::saveTo(QJsonObject& obj) const +{ +} diff --git a/ComponentBasic/exec_delegate.h b/ComponentBasic/exec_delegate.h new file mode 100644 index 0000000..10766ad --- /dev/null +++ b/ComponentBasic/exec_delegate.h @@ -0,0 +1,30 @@ +#pragma once +#include "BehaviorPerform.h" +#include + +class ConsolePresent : public ExecuteDelegate +{ +private: + QHash> _input_list; + QUdpSocket *const _write_port; + +public: + ConsolePresent(); + virtual ~ConsolePresent(); + + QString typeName() const override; + QHash> inputList() const override; + QHash> outputList() const override; + + + void reset() override; + ExecuteResult execute() override; + + + std::shared_ptr newDefault() const override; + + + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; + +}; \ No newline at end of file diff --git a/SimsWorld/ActionNodeConfiguration.cpp b/SimsWorld/ActionNodeConfiguration.cpp index 5f57b73..5337e35 100644 --- a/SimsWorld/ActionNodeConfiguration.cpp +++ b/SimsWorld/ActionNodeConfiguration.cpp @@ -1,8 +1,10 @@ #include "ActionNodeConfiguration.h" #include +#include "BehaviorEditor.h" ActionNodeConfiguration::ActionNodeConfiguration(QWidget* p) :QFrame(p), + _current_present(nullptr), _execute_select(new QComboBox(this)), _vars_configuration(new VariablesConfigurationPanel(this)) { @@ -14,10 +16,29 @@ ActionNodeConfiguration::ActionNodeConfiguration(QWidget* p) p_layout->addWidget(_vars_configuration, 1, 0, 3, 5); p_layout->setColumnStretch(1, 1); + connect(this->_execute_select, QOverload::of(&QComboBox::currentIndexChanged), [=](int v){ + if(v < 1 || !_current_node) return; + + auto inst = this->_current_node->getKernal()->getExecute(this->_execute_select->currentText()); + auto new_inst = std::dynamic_pointer_cast(inst->newDefault()); + _current_node->bindDelegate(new_inst); + + _current_present->itemUpdate(); + }); } -#include "BehaviorEditor.h" void ActionNodeConfiguration::setTarget(NodePresent* ins) { + this->_current_present = ins; + auto logic_node = ins->logicalBind(); + this->_current_node = std::dynamic_pointer_cast(logic_node); + + auto kernel = logic_node->getKernal(); + this->_execute_select->clear(); + auto types = kernel->executeTypes(); + types.prepend(u8"未选定"); + this->_execute_select->addItems(types); + + this->_execute_select->setCurrentText(_current_node->delegateName()); this->_vars_configuration->bindNode(ins->logicalBind()); } diff --git a/SimsWorld/ActionNodeConfiguration.h b/SimsWorld/ActionNodeConfiguration.h index f9cd766..f893f27 100644 --- a/SimsWorld/ActionNodeConfiguration.h +++ b/SimsWorld/ActionNodeConfiguration.h @@ -14,11 +14,14 @@ class ActionNodeConfiguration : public QFrame, public NodeConfiguration { private: - QComboBox *const _execute_select; - VariablesConfigurationPanel *const _vars_configuration; + QComboBox* const _execute_select; + NodePresent * _current_present; + std::shared_ptr _current_node; + VariablesConfigurationPanel* const _vars_configuration; + public: - ActionNodeConfiguration(QWidget *p = nullptr); + ActionNodeConfiguration(QWidget* p = nullptr); void setTarget(NodePresent* ins) override; }; diff --git a/SimsWorld/BehaviorEditor.cpp b/SimsWorld/BehaviorEditor.cpp index c7cacbe..badb85b 100644 --- a/SimsWorld/BehaviorEditor.cpp +++ b/SimsWorld/BehaviorEditor.cpp @@ -29,6 +29,11 @@ std::shared_ptr NodePresent::logicalBind() const return _node_bind; } +void NodePresent::itemUpdate() +{ + this->prepareGeometryChange(); +} + QRectF NodePresent::contentMeasure() const { auto metrics = this->_widget_p->fontMetrics(); diff --git a/SimsWorld/BehaviorEditor.h b/SimsWorld/BehaviorEditor.h index b99e541..af76300 100644 --- a/SimsWorld/BehaviorEditor.h +++ b/SimsWorld/BehaviorEditor.h @@ -30,6 +30,7 @@ public: /// /// std::shared_ptr logicalBind() const; + void itemUpdate(); QRectF contentMeasure() const; AcceptType testAccept(const QPointF& local_pos, const QString& kind_str) const; diff --git a/SimsWorld/SimsWorld.vcxproj.filters b/SimsWorld/SimsWorld.vcxproj.filters index 528bfb8..f2135c4 100644 --- a/SimsWorld/SimsWorld.vcxproj.filters +++ b/SimsWorld/SimsWorld.vcxproj.filters @@ -89,14 +89,14 @@ Header Files - - Header Files - Header Files Header Files + + Header Files + \ No newline at end of file