From fe6c2970f0dc57bccbacc3a8c09aaaf3e0a79b6b Mon Sep 17 00:00:00 2001 From: Martin Hanzik <martin@hanzik.com> Date: Thu, 10 May 2018 21:14:51 +0200 Subject: [PATCH] Fix connect and disconnect of ModelBoxes --- agui2/src/Graphics/Connection/Connection.cpp | 6 ++---- agui2/src/Models/ModelBox.cpp | 18 ++++++++++++++---- agui2/src/Models/ModelBox.hpp | 12 ++++++++---- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/agui2/src/Graphics/Connection/Connection.cpp b/agui2/src/Graphics/Connection/Connection.cpp index 01d85ef37a..a22dd2cea3 100644 --- a/agui2/src/Graphics/Connection/Connection.cpp +++ b/agui2/src/Graphics/Connection/Connection.cpp @@ -24,8 +24,7 @@ Connection::Connection(OutputConnectionBox* origin, InputConnectionBox* target) auto* originModel = origin->getParent()->getModelBox(); auto* targetModel = target->getParent()->getModelBox(); - originModel->addOutput(targetModel, target->getSlot()); - targetModel->setInput(target->getSlot(), originModel); + ModelBox::connect(originModel, targetModel, target->getSlot()); origin->addConnection(this); target->setConnection(this); @@ -104,8 +103,7 @@ void Connection::destroy() { auto* originModel = originConnectionBox->getParent()->getModelBox(); auto* targetModel = targetConnectionBox->getParent()->getModelBox(); - originModel->removeOutput(targetModel, targetConnectionBox->getSlot()); - targetModel->setInput(targetConnectionBox->getSlot(), nullptr); + ModelBox::disconnect(originModel, targetModel, targetConnectionBox->getSlot()); auto removed = this->originConnectionBox->connections.erase(this); Q_ASSERT(removed > 0); diff --git a/agui2/src/Models/ModelBox.cpp b/agui2/src/Models/ModelBox.cpp index ccd6acfa16..a4d3e23475 100644 --- a/agui2/src/Models/ModelBox.cpp +++ b/agui2/src/Models/ModelBox.cpp @@ -28,14 +28,14 @@ void ModelBox::setInput(size_t slot, ModelBox* model) { this->inputs[slot] = model; } -void ModelBox::addOutput(ModelBox* model, size_t slot) { +void ModelBox::addOutput(ModelBox* target, size_t targetSlot) { Q_ASSERT(this->canHaveOutput()); - this->outputs.emplace(model, slot); + this->outputs.emplace(target, targetSlot); } -void ModelBox::removeOutput(ModelBox* model, size_t slot) { +void ModelBox::removeOutput(ModelBox* target, size_t targetSlot) { Q_ASSERT(this->canHaveOutput()); - this->outputs.erase({model, slot}); + this->outputs.erase({target, targetSlot}); } std::shared_ptr<abstraction::OperationAbstraction> ModelBox::getCachedResultOrEvaluate() { @@ -49,3 +49,13 @@ void ModelBox::clearCachedResults() { box->clearCachedResult(); } } + +void ModelBox::connect(ModelBox* origin, ModelBox* target, size_t targetSlot) { + origin->addOutput(target, targetSlot); + target->setInput(targetSlot, origin); +} + +void ModelBox::disconnect(ModelBox* origin, ModelBox* target, size_t targetSlot) { + origin->removeOutput(target, targetSlot); + target->setInput(targetSlot, nullptr); +} diff --git a/agui2/src/Models/ModelBox.hpp b/agui2/src/Models/ModelBox.hpp index 71560388e8..40fe9b36e1 100644 --- a/agui2/src/Models/ModelBox.hpp +++ b/agui2/src/Models/ModelBox.hpp @@ -26,10 +26,6 @@ public: ModelType getType() const { return this->type; } virtual std::string getName() const = 0; - void setInput(size_t slot, ModelBox* model); - void addOutput(ModelBox* model, size_t slot); - void removeOutput(ModelBox* model, size_t slot); - size_t getMaxInputCount() const { return this->maxInputCount; } virtual bool canHaveOutput() const { return true; } @@ -38,9 +34,17 @@ public: virtual void clearCachedResult() { this->result.reset(); } virtual std::shared_ptr<abstraction::OperationAbstraction> evaluate() = 0; + static void connect(ModelBox* origin, ModelBox* target, size_t targetSlot); + static void disconnect(ModelBox* origin, ModelBox* target, size_t targetSlot); + static const std::vector<ModelBox*>& getAllModelBoxes() { return ModelBox::allModelBoxes; } static void clearCachedResults(); +private: + void setInput(size_t slot, ModelBox* model); + void addOutput(ModelBox* model, size_t slot); + void removeOutput(ModelBox* model, size_t slot); + protected: ModelType type; -- GitLab