From b9c7c93d47cca44067f0e1e9c63b957321552208 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marcus=20P=C3=B6ckelmann?=
 <marcus.poeckelmann@informatik.uni-halle.de>
Date: Wed, 31 May 2023 11:09:25 +0200
Subject: [PATCH] v2.6.1: Bugfixes for add_name and remove_name

---
 README     |   2 +-
 catview.js | 148 +++++++++++++++++++++++++++++++----------------------
 2 files changed, 87 insertions(+), 63 deletions(-)

diff --git a/README b/README
index 3ca7298..28c2105 100644
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
 Thank you for using CATview - the Colored & Aligned Texts view.
 
-This is version 2.6
+This is version 2.6.1
 
 For information about the features and usage of CATview, please visit:
 https://catview.uzi.uni-halle.de
diff --git a/catview.js b/catview.js
index e7cf2e9..a6cf69f 100644
--- a/catview.js
+++ b/catview.js
@@ -22,7 +22,7 @@
  SOFTWARE.
 */
 
-// CATview - the Colored & Aligned Texts view - version 2.6
+// CATview - the Colored & Aligned Texts view - version 2.6.1
 const CATview = new function() {
   this.debug = false;
 
@@ -31,7 +31,7 @@ const CATview = new function() {
     if(CATview.debug)
       console.log('CATview.initialize');
 
-    CATview.version = '2.6';
+    CATview.version = '2.6.1';
 
     // id of the parent container that will include CATview
     CATview.parent_id = 'CATview';
@@ -72,8 +72,6 @@ const CATview = new function() {
     CATview.rect_border = "stroke: #2f2f86;";
     CATview.enable_scroll_spy = true;
     CATview.scroll_spy_pos = 1;   // default position of the scroll spy
-    CATview.display_remaining_edges = false;    // setting: should remaining alignment edges be displayed
-    CATview.threshold = 50;                     // setting: for which degree of difference remaining alignment edges should be displayed
     CATview.display_extra_segments = true;      // setting: should extra_segments be displayed
     CATview.search_mode = 'seg';       // setting: highlight search results for full columns ('col' )or individual segments ('seg')
     CATview.tools = [];                         // pairs of font-awesome-unicodes and callbacks
@@ -107,7 +105,6 @@ const CATview = new function() {
                             //  -1: no segment for the witness
                             //  value within [0.0, 1.0]: segment, which will be colored according to CATview.scale_color
     CATview.search_results = [];  // array with column ids to be highlighted as search results
-    CATview.remaining_edges = []; // TODO deprecated: array with supposed edges that could not be aligned - entries: [distance, [ [[row, col], [row, col]]+ ]]
     CATview.extra_segments = [];  // additional segments that will be displayed in a faded out fashion (gray dotted without filling)
                                   //  entries are triples with [index of edge, index of witness, color value (within [0.0, 1.0])]
     CATview.edge_names = [];      // array of the edges' names, displayed on mouse over
@@ -173,7 +170,7 @@ const CATview = new function() {
     CATview.width_content   = CATview.width_svg - CATview.margin.left - CATview.margin.right;
     CATview.height_content  = CATview.height_svg - CATview.margin.top - CATview.margin.bottom;
   };
-  // method to set scales according to the current orientation of CATview and its axis
+  // methods to set scales according to the current orientation of CATview and its axis
   this.set_scale_edges = function(_from, _to){
     if(CATview.debug)
       console.log('CATview.set_scale_edges');
@@ -241,7 +238,6 @@ const CATview = new function() {
 
       CATview.edges = data.edges;
       CATview.edge_names = data.edge_names;
-      // CATview.remaining_edges = data.remaining_edges;
       CATview.extra_segments = data.extra_segments;
       CATview.rect_linking_data = data.rect_linking_data;
       CATview.rect_scaling = data.rect_scaling;
@@ -399,7 +395,6 @@ const CATview = new function() {
     // add containers for different groups of content
     CATview.content.append("g").attr("class", "search_results_background");
     CATview.content.append("g").attr("class", "alignment");
-    CATview.content.append("g").attr("class", "remaining_edges");
     //CATview.content.append("g").attr("class", "brush");
 
     // set default interval of data to be shown and draw the content
@@ -437,7 +432,6 @@ const CATview = new function() {
       CATview.draw_search_results();
       if(CATview.enable_scroll_spy)
         CATview.draw_scroll_spy();
-      //CATview.draw_remaining_edges();
     }
     else
       return false;
@@ -1098,48 +1092,6 @@ const CATview = new function() {
       return false;
   };
 
-  // todo deprecated: draws remaining edges as orange lines between the rectangles
-  this.set_remaining_edges = function(remaining_edges){
-    if(remaining_edges == null)
-      return false;
-
-    CATview.remaining_edges = remaining_edges;
-    return true;
-  };
-  this.draw_remaining_edges = function(){
-    if(CATview.debug)
-      console.log('CATview.draw_remaining_edges');
-
-    if(CATview.content) {
-      CATview.content.select(".remaining_edges").selectAll("line.remaining").remove();
-      if (CATview.remaining_edges == null)
-        return false;
-      if (CATview.display_remaining_edges) {
-        CATview.remaining_edges.every(function (edges) {
-          // stop drawing when the distance of the remaining edges exceed the threshold
-          if (edges[0] > CATview.threshold) {
-            return false;
-          }
-
-          edges[1].forEach(function (edge) {
-            if (CATview.from <= edge[0][1] + 1 && edge[0][1] + 1 <= CATview.to && CATview.from <= edge[1][1] + 1 && edge[1][1] + 1 <= CATview.to) {
-              CATview.content.select(".remaining_edges").append('line')
-                .attr("class", "remaining")
-                .attr('x1', CATview.scale_edges(edge[0][1] + 1))
-                .attr('y1', CATview.scale_names(edge[0][0]))
-                .attr('x2', CATview.scale_edges(edge[1][1] + 1))
-                .attr('y2', CATview.scale_names(edge[1][0]));
-            }
-          });
-
-          return true;
-        });
-      }
-    }
-    else
-      return false;
-  };
-
   // draws extra segments
   this.set_extra_segments = function(_segments){
     if(_segments == null)
@@ -1865,15 +1817,6 @@ const CATview = new function() {
       index,
       CATview.vertical ? 90 : 0);
   };
-  // add the display-remaining-edges tool
-  this.add_tool_display_remaining_edges = function(index){
-    return CATview.add_tool('f074',
-      function(){
-        CATview.display_remaining_edges = !CATview.display_remaining_edges;
-        CATview.draw_remaining_edges();},
-      index,
-      0);
-  };
   // add the switch-highlight-mode-of-search-results tool
   this.add_tool_toggle_search_mode = function(index){
     return CATview.add_tool('f002',
@@ -1930,9 +1873,47 @@ const CATview = new function() {
     if (isNaN(index) || index < 0 || index > CATview.names.length )
       index = CATview.names.length;
 
+    // add the name
     CATview.names.splice(index, 0, name);
 
-    // todo set dummies at edges
+    // add dummies to edges
+    CATview.edges.forEach(function (edge) {
+      edge.splice(index, 0, -1)
+    });
+
+    // refresh the search results
+    CATview.search_results.forEach(function (edge) {
+      for(let i = 0; i < edge[1].length; i++){
+        if(edge[1][i] >= index)
+          edge[1][i] += 1
+      }
+    });
+
+    // refresh the extra segments
+    CATview.extra_segments.forEach(function (segment) {
+      if(segment[1] >= index)
+        segment[1] += 1;
+    });
+
+    // refresh the data for rectangle scaling (add dummies as for edges)
+    if(CATview.rect_scaling !== null){
+      CATview.rect_scaling.forEach(function (edge) {
+        edge.splice(index, 0, -1)
+      });
+    }
+
+    // refresh the data for rectangle linking
+    if(CATview.rect_linking_data !== null){
+      CATview.rect_linking_data.forEach(function (group) {
+        for(let i = 0; i < group.length; i++){
+          let wit = parseInt(group[i].split('_')[1])
+          if(wit >= index)
+            group[i] = ( group[i].split('_')[0] + '_' + (wit + 1) )
+        }
+      });
+    }
+
+    // TODO may refresh drag_names_order ...
 
     return true;
   };
@@ -1944,7 +1925,50 @@ const CATview = new function() {
 
     CATview.names.splice(index, 1);
 
-    // todo update edges
+    // remove edges
+    CATview.edges.forEach(function (edge) {
+      edge.splice(index, 1)
+    });
+
+    // refresh the search results
+    CATview.search_results.forEach(function (edge) {
+      for(let i = edge[1].length - 1; i >= 0; i--){
+        if(edge[1][i] > index)
+          edge[1][i] -= 1
+        else if (edge[1][i] == index)
+          edge[1].splice(i, 1)
+      }
+    });
+
+    // refresh the extra segments
+    for(let i = CATview.extra_segments.length - 1; i >= 0; i--) {
+      if(CATview.extra_segments[i][1] > index)
+        CATview.extra_segments[i][1] -= 1
+      else if (CATview.extra_segments[i][1] == index)
+        CATview.extra_segments.splice(i, 1)
+    }
+
+    // refresh the data for rectangle scaling (remove within edges)
+    if(CATview.rect_scaling !== null){
+      CATview.rect_scaling.forEach(function (edge) {
+        edge.splice(index, 1)
+      });
+    }
+
+    // refresh the data for rectangle linking
+    if(CATview.rect_linking_data !== null){
+      CATview.rect_linking_data.forEach(function (group) {
+        for(let i = 0; i < group.length; i++){
+          let wit = parseInt(group[i].split('_')[1])
+          if(wit > index)
+            group[i] = ( group[i].split('_')[0] + '_' + (wit - 1 ) )
+          else if(wit == index)
+            group.splice(i, 1)
+        }
+      });
+    }
+
+    // TODO may refresh drag_names_order ...
 
     return true;
   };
-- 
GitLab