7cdc9f476f19a65d36e015aadf41be9634e15920
angie
  Wed Apr 4 11:45:43 2018 -0700
For genePred tracks, limit baseColorDrawOpt to genomicCodons if it's set to a fancy PSL option because the setting comes from a view that includes a PSL track.  refs #21194

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index cb2c6d8..ae8b3ae 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -1183,44 +1183,54 @@
     cgiMakeDropListFull(var, baseColorDrawItemOptionLabels,
 			baseColorDrawItemOptionValues,
 			ArraySize(baseColorDrawItemOptionLabels),
 			curValue, NULL, NULL);
     printf("<A HREF=\"%s\">Help on base coloring</A><BR>",
 	   CDS_BASE_HELP_PAGE);
     }
 }
 
 void baseColorDrawOptDropDown(struct cart *cart, struct trackDb *tdb)
 /* Make appropriately labeled drop down of options if any are applicable.*/
 {
 baseColorDropLists(cart, tdb, tdb->track);
 }
 
+static enum baseColorDrawOpt limitDrawOptForType(struct trackDb *tdb, enum baseColorDrawOpt drawOpt)
+/* If tdb->type is genePred, but something fancier like mRNA codons is enabled because the setting
+ * is coming from a view that also includes a PSL track, downgrade it to genomic codons to avoid
+ * drawing problems caused by the inappropriate setting. #21194 */
+{
+if (startsWith("genePred", tdb->type) && drawOpt > baseColorDrawGenomicCodons)
+    drawOpt = baseColorDrawGenomicCodons;
+return drawOpt;
+}
+
 enum baseColorDrawOpt baseColorDrawOptEnabled(struct cart *cart,
 					  struct trackDb *tdb)
 /* Query cart & trackDb to determine what drawing mode (if any) is enabled. */
 {
 char *stringVal = NULL;
 assert(cart);
 assert(tdb);
 
 /* trackDb can override default of OFF; cart can override trackDb. */
 stringVal = trackDbSettingClosestToHomeOrDefault(tdb, BASE_COLOR_DEFAULT,
 						  BASE_COLOR_DRAW_OFF);
 stringVal = cartUsualStringClosestToHome(cart, tdb, FALSE, BASE_COLOR_VAR_SUFFIX,stringVal);
 
-return baseColorDrawOptStringToEnum(stringVal);
+return limitDrawOptForType(tdb, baseColorDrawOptStringToEnum(stringVal));
 }
 
 
 /*** Control of fancy indel display code: ***/
 
 static boolean tdbOrCartBoolean(struct cart *cart, struct trackDb *tdb,
 			    char *settingName, char *defaultOnOff)
 /* Query cart & trackDb to determine if a boolean variable is set. */
 {
 boolean alreadySet;
 alreadySet = !sameString("off",trackDbSettingOrDefault(tdb, settingName, defaultOnOff));
 alreadySet = cartUsualBooleanClosestToHome(cart, tdb, FALSE, settingName, alreadySet);
 	 // NOTE: parentLevel=FALSE because tdb param already is at appropriate level
 return alreadySet;
 }