From fac912f2944014f13197b3194c20da0bf2a81ba0 Mon Sep 17 00:00:00 2001
From: Philip Abbet <philip.abbet@idiap.ch>
Date: Mon, 6 Mar 2017 14:28:44 +0100
Subject: [PATCH] [toolchains] Fix #441 - Bug in automatic block selection

---
 .../static/experiments/js/panels.js           | 27 +++++++++++++---
 .../toolchains/static/toolchains/js/models.js | 31 ++++++++++++++++++-
 2 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/beat/web/experiments/static/experiments/js/panels.js b/beat/web/experiments/static/experiments/js/panels.js
index 1a6751c12..aa0912f34 100644
--- a/beat/web/experiments/static/experiments/js/panels.js
+++ b/beat/web/experiments/static/experiments/js/panels.js
@@ -1319,13 +1319,32 @@ beat.experiments.panels.Settings.prototype._setBlock = function(block_entry, alg
       if (beat.experiments.utils.analyzeCompatibility(block_inputs_signature, block_outputs_signature,
             algorithm_inputs_signature, algorithm_outputs_signature,
             panel.dataformats)) {
-        panel.current_block = block.name;
-        panel.configuration.setComponentAlgorithm(block, algorithm_name);
-        panel._onAlgorithmSelected(false);
-
         automatically_configured_blocks.push(block);
       }
     }
+
+    // Don't auto-assign a block that is connected after an auto-assigned one
+    var automatically_configured_blocks_original = [block_entry.block].concat(automatically_configured_blocks);
+
+    automatically_configured_blocks = [];
+    for (var i = 1; i < automatically_configured_blocks_original.length; ++i) {
+        var block = automatically_configured_blocks_original[i];
+
+        var predecessors = block.allPredecessors();
+
+        var auto_assigned_predecessors = predecessors.filter(function(block) {
+            return automatically_configured_blocks_original.indexOf(block) >= 0;
+        });
+
+        if (auto_assigned_predecessors.length == 0)
+        {
+            panel.current_block = block.name;
+            panel.configuration.setComponentAlgorithm(block, algorithm_name);
+            panel._onAlgorithmSelected(false);
+
+            automatically_configured_blocks.push(block);
+        }
+    }
   }
 
   // Mapping
diff --git a/beat/web/toolchains/static/toolchains/js/models.js b/beat/web/toolchains/static/toolchains/js/models.js
index 67f9f0556..ee21ca690 100644
--- a/beat/web/toolchains/static/toolchains/js/models.js
+++ b/beat/web/toolchains/static/toolchains/js/models.js
@@ -312,7 +312,36 @@ beat.toolchains.models.Block.prototype.predecessors = function()
     for (var i = 0; i < this.connections.length; i++)
     {
         if (this.connections[i].input.block == this)
-            predecessors.push(this.connections[i].output.block);
+        {
+            if (predecessors.indexOf(this) == -1)
+                predecessors.push(this.connections[i].output.block);
+        }
+    }
+
+    return predecessors;
+}
+
+
+//----------------------------------------------------------------------------------------
+// Returns a list of all the blocks that precedes this one in the toolchain
+//----------------------------------------------------------------------------------------
+beat.toolchains.models.Block.prototype.allPredecessors = function()
+{
+    var predecessors = new Array();
+
+    var direct_predecessors = this.predecessors();
+
+    var predecessors = [].concat(direct_predecessors);
+
+    for (var i = 0; i < direct_predecessors.length; i++)
+    {
+        var upstream_predecessors = direct_predecessors[i].allPredecessors();
+
+        upstream_predecessors = upstream_predecessors.filter(function(block) {
+            return predecessors.indexOf(block) == -1;
+        });
+
+        predecessors = predecessors.concat(upstream_predecessors);
     }
 
     return predecessors;
-- 
GitLab