From f43a03f75bf3156233c2af582c91450e28baeca8 Mon Sep 17 00:00:00 2001
From: Stephane Dallongeville <stephane@outlook.com>
Date: Thu, 13 Aug 2020 15:38:13 +0200
Subject: [PATCH] Fixed exposed variables restoration when embedding or copy /
 pasting workflow

---
 .../gui/block/WorkFlowContainer.java          | 27 ++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowContainer.java b/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowContainer.java
index f07994a..3a64436 100644
--- a/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowContainer.java
+++ b/src/main/java/plugins/adufour/protocols/gui/block/WorkFlowContainer.java
@@ -335,7 +335,7 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
                     }
                     else
                         dstBlockPanel.refreshNow();
-                    
+
                     repaint();
                 }
             }
@@ -368,8 +368,29 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
                 }
 
                 panel.drawPanel();
+
                 blockPanels.put(blockDesc, panel);
                 add(panel);
+
+                // FIX: get exposed links correctly restored on copy/paste as setVisibility isn't called in that case (Stephane)
+                // this is really an ugly fix but the whole stuff is a complete mess honestly :-/
+                if (blockDesc.isWorkFlow())
+                {
+                    synchronized (blockDesc.inputVars)
+                    {
+                        // update exposed links
+                        for (Var<?> var : blockDesc.inputVars)
+                            ((WorkFlowPanel) panel).updateExposedLink(var, blockDesc.inputVars.isVisible(var));
+                    }
+
+                    synchronized (blockDesc.outputVars)
+                    {
+                        // update exposed links
+                        for (Var<?> var : blockDesc.outputVars)
+                            ((WorkFlowPanel) panel).updateExposedLink(var, blockDesc.outputVars.isVisible(var));
+                    }
+                }
+
                 // Layer 0 for blocks
                 // Layer 1 for work flows
                 setLayer(panel, blockDesc.isWorkFlow() ? 1 : 0, 0);
@@ -531,9 +552,9 @@ public class WorkFlowContainer extends JLayeredPane implements WorkFlowListener,
                 workFlow.removeBlock(workFlow.getBlock(i), true);
         }
 
-        workFlow.addBlock(embed.getBlockDescriptor());
-
         MainFrame.pasteSelection(embed, true);
+        
+        workFlow.addBlock(embed.getBlockDescriptor());
     }
 
     /**
-- 
GitLab