JAL-3187 return a colour for linked features with transparency
[jalview.git] / src / jalview / renderer / seqfeatures / FeatureRenderer.java
index fc8731d..4e81e69 100644 (file)
@@ -28,6 +28,7 @@ import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
 import jalview.util.Comparison;
+import jalview.util.ReverseListIterator;
 import jalview.viewmodel.seqfeatures.FeatureRendererModel;
 
 import java.awt.AlphaComposite;
@@ -275,7 +276,8 @@ public class FeatureRenderer extends FeatureRendererModel
      * if columns are all gapped, or sequence has no features, nothing to do
      */
     Range visiblePositions = seq.findPositions(start+1, end+1);
-    if (visiblePositions == null || !seq.getFeatures().hasFeatures())
+    if (visiblePositions == null || (!seq.getFeatures().hasFeatures()
+            && !av.isShowComplementFeatures()))
     {
       return null;
     }
@@ -317,7 +319,7 @@ public class FeatureRenderer extends FeatureRendererModel
         if (featureColour == null)
         {
           /*
-           * feature excluded by visibility settings, filters, or colour threshold
+           * feature excluded by filters, or colour threshold
            */
           continue;
         }
@@ -396,6 +398,30 @@ public class FeatureRenderer extends FeatureRendererModel
       }
     }
 
+    /*
+     * if configured to do so, find and show complement's features
+     */
+    if (av.isShowComplementFeatures())
+    {
+      AlignViewportI comp = av.getCodingComplement();
+      FeatureRenderer fr2 = Desktop.getAlignFrameFor(comp)
+              .getFeatureRenderer();
+      for (int pos = visiblePositions.start; pos <= visiblePositions.end; pos++)
+      {
+        int column = seq.findIndex(pos);
+        List<SequenceFeature> features = fr2
+                .findComplementFeaturesAtResidue(seq, pos);
+        for (SequenceFeature sf : features)
+        {
+          FeatureColourI fc = fr2.getFeatureStyle(sf.getType());
+          Color featureColour = fr2.getColor(sf, fc);
+          renderFeature(g, seq, column - 1, column - 1, featureColour,
+                  start, end, y1, colourOnly);
+          drawnColour = featureColour;
+        }
+      }
+    }
+
     if (transparency != 1.0f && g != null)
     {
       /*
@@ -451,10 +477,13 @@ public class FeatureRenderer extends FeatureRendererModel
       AlignFrame af = Desktop.getAlignFrameFor(complement);
       FeatureRendererModel fr2 = af.getFeatureRenderer();
       List<SequenceFeature> features = fr2.findComplementFeaturesAtResidue(
-              seq, seq.findPosition(column));
-      // todo: ensure ordered by feature render order
-      for (SequenceFeature sf : features)
+              seq, seq.findPosition(column - 1));
+
+      ReverseListIterator<SequenceFeature> it = new ReverseListIterator<>(
+              features);
+      while (it.hasNext())
       {
+        SequenceFeature sf = it.next();
         if (!fr2.featureGroupNotShown(sf))
         {
           Color col = fr2.getColour(sf);