6d78a8e2d7230272d15508db74169ad20cd76f3f
braney
  Thu Apr 16 12:06:50 2026 -0700
Restrict color override to supported track types; add palette icon; deduplicate type check, refs #20460

Note: palette.png must be installed to htdocs/images/ (new file).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index de614c44f8f..c3554c93cc6 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -6031,35 +6031,53 @@
 
 void filterNameOption(struct cart *cart, char *name, struct trackDb *tdb)
 /* filter by feature names text input box */
 {
 printf("<DIV><B>Show only transcripts with these accessions:</B> ");
 char varName[1024];
 safef(varName, sizeof(varName), "%s.nameFilter", name);
 
 char *onlyTransStr = cartUsualString(cart, varName, "");
 
 cgiMakeTextVar(varName, onlyTransStr, 60);
 printInfoIcon("Enter the primary accession of the track, so RefSeq IDs for the RefSeq track, Gencode IDs for the Gencode track, etc. Separate multiple accessions with commas.");
 puts("</DIV>\n\n");
 }
 
+boolean tdbSupportsColorOverride(struct trackDb *tdb)
+/* Return TRUE if this track type supports the color override feature. */
+{
+if (!cfgOptionBooleanDefault("showColorPicker", FALSE))
+    return FALSE;
+char *type = tdb->type;
+char *track = tdb->track;
+// Blacklist tracks that use custom rendering incompatible with color override
+if (startsWith("gtexGene", track) || startsWith("gtexEqtlCluster", track)
+    || startsWith("gtexEqtlTissue", track))
+    return FALSE;
+return !tdbIsComposite(tdb)
+    && (startsWithWord("bed", type) || startsWithWord("bigBed", type)
+    || startsWithWord("genePred", type) || startsWithWord("bigGenePred", type)
+    || startsWithWord("wig", type) || startsWithWord("bigWig", type)
+    || startsWithWord("rmsk", type) || startsWithWord("interact", type)
+    || startsWithWord("bigInteract", type) || startsWithWord("bigLolly", type)
+    || startsWithWord("vcfTabix", type) || startsWithWord("vcf", type));
+}
+
 void colorTrackOption(struct cart *cart, char *name, struct trackDb *tdb)
 /* color picker for overriding track color */
 {
-if (!cfgOptionBooleanDefault("showColorPicker", FALSE))
-    return;
 
 char varName[1024];
 safef(varName, sizeof(varName), "%s.colorOverride", name);
 
 char defaultColor[16];
 safef(defaultColor, sizeof(defaultColor), "#%02x%02x%02x", tdb->colorR, tdb->colorG, tdb->colorB);
 
 char *rawCartValue = cartOptionalString(cart, varName);
 boolean hasOverride = (rawCartValue != NULL && rawCartValue[0] != '\0');
 char *colorValue = hasOverride ? rawCartValue : defaultColor;
 
 char checkVar[1024];
 safef(checkVar, sizeof(checkVar), "%s.colorOverrideOn", name);
 boolean isOn = cartUsualBoolean(cart, checkVar, hasOverride);