JAL-3139 check group visibility when removing 'redundant' features
[jalview.git] / src / jalview / viewmodel / seqfeatures / FeatureRendererModel.java
index 16cb684..5db8751 100644 (file)
@@ -1029,19 +1029,27 @@ public abstract class FeatureRendererModel
   }
 
   /**
-   * Removes from the list of features any that duplicate the location of a
-   * feature of the same type. Should be used only for features of the same,
-   * simple, feature colour (which normally implies the same feature type). Does
-   * not check visibility settings for feature type or feature group.
+   * Removes from the list of features any whose group is not shown, or that are
+   * visible and duplicate the location of a visible feature of the same type.
+   * Should be used only for features of the same, simple, feature colour (which
+   * normally implies the same feature type). No filtering is done if
+   * transparency, or any feature filters, are in force.
    * 
    * @param features
    */
   public void filterFeaturesForDisplay(List<SequenceFeature> features)
   {
-    if (features.isEmpty())
+    /*
+     * don't remove 'redundant' features if 
+     * - transparency is applied (feature count affects depth of feature colour)
+     * - filters are applied (not all features may be displayable)
+     */
+    if (features.isEmpty() || transparency != 1f
+            || !featureFilters.isEmpty())
     {
       return;
     }
+
     SequenceFeatures.sortFeatures(features, true);
     SequenceFeature lastFeature = null;
 
@@ -1049,6 +1057,11 @@ public abstract class FeatureRendererModel
     while (it.hasNext())
     {
       SequenceFeature sf = it.next();
+      if (featureGroupNotShown(sf))
+      {
+        it.remove();
+        continue;
+      }
 
       /*
        * a feature is redundant for rendering purposes if it has the
@@ -1056,7 +1069,8 @@ public abstract class FeatureRendererModel
        * (checking type and isContactFeature as a fail-safe here, although
        * currently they are guaranteed to match in this context)
        */
-      if (lastFeature != null && sf.getBegin() == lastFeature.getBegin()
+      if (lastFeature != null
+              && sf.getBegin() == lastFeature.getBegin()
               && sf.getEnd() == lastFeature.getEnd()
               && sf.isContactFeature() == lastFeature.isContactFeature()
               && sf.getType().equals(lastFeature.getType()))
@@ -1100,8 +1114,8 @@ public abstract class FeatureRendererModel
 
   /**
    * Answers the colour for the feature, or null if the feature is excluded by
-   * feature type or group visibility, by filters, or by colour threshold
-   * settings
+   * feature group visibility, by filters, or by colour threshold settings. This
+   * method does not take feature visibility into account.
    * 
    * @param sf
    * @param fc
@@ -1110,14 +1124,6 @@ public abstract class FeatureRendererModel
   public Color getColor(SequenceFeature sf, FeatureColourI fc)
   {
     /*
-     * is the feature type displayed?
-     */
-    if (!showFeatureOfType(sf.getType()))
-    {
-      return null;
-    }
-
-    /*
      * is the feature group displayed?
      */
     if (featureGroupNotShown(sf))