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