From c47d8e5c7762dd6ffda9b78932366c5cc7f14b2c Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sat, 12 Jul 2025 03:15:53 +0800 Subject: [PATCH] =?UTF-8?q?ActionNode=E7=9A=84Delegate=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ComponentBasic/BehaviorPerform.cpp | 3 + ComponentBasic/ComponentBasic.vcxproj | 4 +- ComponentBasic/ComponentBasic.vcxproj.filters | 6 ++ ComponentBasic/exec_delegate.cpp | 57 +++++++++++++++++++ ComponentBasic/exec_delegate.h | 30 ++++++++++ SimsWorld/ActionNodeConfiguration.cpp | 23 +++++++- SimsWorld/ActionNodeConfiguration.h | 9 ++- SimsWorld/BehaviorEditor.cpp | 5 ++ SimsWorld/BehaviorEditor.h | 1 + SimsWorld/SimsWorld.vcxproj.filters | 6 +- 10 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 ComponentBasic/exec_delegate.cpp create mode 100644 ComponentBasic/exec_delegate.h 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