cfeb4d454d22011d7f637d060e7a51057d168504
braney
  Mon Mar 30 12:01:16 2026 -0700
Add color picker support for most track types, refs #20460

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

diff --git src/hg/hgTracks/rmskTrack.c src/hg/hgTracks/rmskTrack.c
index 21a75303db3..e87379f30b0 100644
--- src/hg/hgTracks/rmskTrack.c
+++ src/hg/hgTracks/rmskTrack.c
@@ -60,30 +60,31 @@
 {
 slFreeList(&tg->items);
 }
 
 static char *repeatName(struct track *tg, void *item)
 /* Return name of repeat item track. */
 {
 struct repeatItem *ri = item;
 return ri->className;
 }
 
 static void repeatDraw(struct track *tg, int seqStart, int seqEnd,
         struct hvGfx *hvg, int xOff, int yOff, int width,
         MgFont *font, Color color, enum trackVisibility vis)
 {
+Color overrideColor = colorFromCart(tg, 0);
 int baseWidth = seqEnd - seqStart;
 struct repeatItem *ri;
 int y = yOff;
 int heightPer = tg->heightPer;
 int lineHeight = tg->lineHeight;
 int x1,x2,w;
 boolean isFull = (vis == tvFull);
 Color col;
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr = NULL;
 char **row;
 int rowOffset;
 
 if (isFull)
     {
@@ -106,31 +107,31 @@
         {
 	rmskOutStaticLoad(row+rowOffset, &ro);
 	char class[256];
 	// Simplify repClass for lookup: strip trailing '?', simplify *RNA to RNA:
 	safecpy(class, sizeof(class), ro.repClass);
 	char *p = &(class[strlen(class)-1]);
 	if (*p == '?')
 	    *p = '\0';
 	if (endsWith(class, "RNA"))
 	    safecpy(class, sizeof(class), "RNA");
 	ri = hashFindVal(hash, class);
 	if (ri == NULL)
 	   ri = otherRepeatItem;
 	percId = 1000 - ro.milliDiv - ro.milliDel - ro.milliIns;
 	grayLevel = grayInRange(percId, 500, 1000);
-	col = shadesOfGray[grayLevel];
+	col = overrideColor ? overrideColor : shadesOfGray[grayLevel];
 	x1 = roundingScale(ro.genoStart-winStart, width, baseWidth)+xOff;
 	x1 = max(x1, 0);
 	x2 = roundingScale(ro.genoEnd-winStart, width, baseWidth)+xOff;
 	if (x1 < insideX)
 	    x1 = insideX;
 	if (x2 > insideX+width)
 	    x2 = insideX+width;
 	w = x2-x1;
 	if (w <= 0)
 	    w = 1;
 	hvGfxBox(hvg, x1, ri->yOffset, w, heightPer, col);
 	if (baseWidth <= 100000)
 	    {
 	    if (ri == otherRepeatItem)
 		{
@@ -161,31 +162,31 @@
 	    hAddBinToQuery(winStart, winEnd, query);
 	sqlDyStringPrintf(query, "genoStart<%u and genoEnd>%u ", winEnd, winStart);
 	/* if we're using a single rmsk table, add genoName to the where clause */
 	if (startsWith("rmsk", table))
 	    sqlDyStringPrintf(query, " and genoName = '%s' ", chromName);
 	sr = sqlGetResult(conn, query->string);
 	while ((row = sqlNextRow(sr)) != NULL)
 	    {
 	    int start = sqlUnsigned(row[0]);
 	    int end = sqlUnsigned(row[1]);
 	    x1 = roundingScale(start-winStart, width, baseWidth)+xOff;
 	    x2 = roundingScale(end-winStart, width, baseWidth)+xOff;
 	    w = x2-x1;
 	    if (w <= 0)
 		w = 1;
-	    hvGfxBox(hvg, x1, yOff, w, heightPer, MG_BLACK);
+	    hvGfxBox(hvg, x1, yOff, w, heightPer, overrideColor ? overrideColor : MG_BLACK);
 	    }
 	}
     dyStringFree(&query);
     }
 sqlFreeResult(&sr);
 hFreeConn(&conn);
 }
 
 void repeatMethods(struct track *tg)
 /* Make track for repeats. */
 {
 tg->loadItems = repeatLoad;
 tg->freeItems = repeatFree;
 tg->drawItems = repeatDraw;
 tg->colorShades = shadesOfGray;