import jalview.datamodel.AlignmentI;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
+import jalview.datamodel.features.FeatureMatcherSetI;
import jalview.datamodel.features.SequenceFeatures;
import jalview.renderer.seqfeatures.FeatureRenderer;
import jalview.schemes.FeatureColour;
import jalview.util.ColorUtils;
-import jalview.util.matcher.KeyedMatcherSetI;
import java.awt.Color;
import java.beans.PropertyChangeListener;
public final FeatureColourI featureColour;
- public final KeyedMatcherSetI filter;
+ public final FeatureMatcherSetI filter;
public final Boolean show;
public FeatureSettingsBean(String type, FeatureColourI colour,
- KeyedMatcherSetI theFilter, Boolean isShown)
+ FeatureMatcherSetI theFilter, Boolean isShown)
{
featureType = type;
featureColour = colour;
/*
* filters for each feature type
*/
- protected Map<String, KeyedMatcherSetI> featureFilters = new HashMap<>();
+ protected Map<String, FeatureMatcherSetI> featureFilters = new HashMap<>();
protected String[] renderOrder;
visibleTypes);
/*
- * include features unless their feature group is not displayed, or
- * they are hidden (have no colour) based on a filter or colour threshold
+ * include features unless they are hidden (have no colour), based on
+ * feature group visibility, or a filter or colour threshold
*/
for (SequenceFeature sf : features)
{
- if (!featureGroupNotShown(sf) && getColour(sf) != null)
+ if (getColour(sf) != null)
{
result.add(sf);
}
* 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.
+ * not check visibility settings for feature type or feature group. 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;
}
@Override
- public Map<String, KeyedMatcherSetI> getFeatureFilters()
+ public Map<String, FeatureMatcherSetI> getFeatureFilters()
{
- return new HashMap<>(featureFilters);
+ return featureFilters;
}
@Override
- public void setFeatureFilters(Map<String, KeyedMatcherSetI> filters)
+ public void setFeatureFilters(Map<String, FeatureMatcherSetI> filters)
{
featureFilters = filters;
}
@Override
- public KeyedMatcherSetI getFeatureFilter(String featureType)
+ public FeatureMatcherSetI getFeatureFilter(String featureType)
{
return featureFilters.get(featureType);
}
@Override
- public void setFeatureFilter(String featureType, KeyedMatcherSetI filter)
+ public void setFeatureFilter(String featureType, FeatureMatcherSetI filter)
{
if (filter == null || filter.isEmpty())
{
/**
* 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
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))
*/
protected boolean featureMatchesFilters(SequenceFeature sf)
{
- KeyedMatcherSetI filter = featureFilters.get(sf.getType());
- // TODO temporary fudge for Score and Label
- return filter == null ? true
- : filter.matches(
- key -> "Label".equals(key[0]) ? sf.getDescription()
- : ("Score".equals(key[0])
- ? String.valueOf(sf.getScore())
- : sf.getValueAsString(key)));
+ FeatureMatcherSetI filter = featureFilters.get(sf.getType());
+ return filter == null ? true : filter.matches(sf);
}
}