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) 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;