b818160961573cd7b8902303ca4dc532d1366513 max Mon Apr 29 11:14:47 2024 -0700 adding name filter and color track options to hgTrackUi, refs #20460 diff --git src/hg/hgTracks/bedTrack.c src/hg/hgTracks/bedTrack.c index 4debf33..e9e7c16 100644 --- src/hg/hgTracks/bedTrack.c +++ src/hg/hgTracks/bedTrack.c @@ -544,33 +544,51 @@ { lf->useItemRgb = TRUE; lf->filterColor=bed->itemRgb; } slAddHead(&lfList, lf); bedFree(&bed); } sqlFreeResult(&sr); hFreeConn(&conn); } slReverse(&lfList); if(tg->extraUiData) filterBed(tg, &lfList); slSort(&lfList, linkedFeaturesCmp); tg->items = lfList; +filterItemsOnNames(tg); maybeLoadSnake(tg); // if we're in snake mode, change the methods } +Color colorFromCart(struct track *tg, Color color) +/* Return the RGB color from the cart setting 'colorOverride' or just return color */ +{ +char varName[128]; +safef(varName, sizeof(varName), "%s.%s", tg->tdb->track, "colorOverride"); +char *hexColorStr = cartOptionalString(cart, varName); +if (hexColorStr==NULL || isEmpty(hexColorStr)) + return color; +if (hexColorStr[0]=='#') + hexColorStr++; +if (strlen(hexColorStr)!=6) + return color; +long rgb = strtol(hexColorStr,NULL,16); // Big and little Endians +tg->itemColor = NULL; +return MAKECOLOR_32( ((rgb>>16)&0xff), ((rgb>>8)&0xff), (rgb&0xff) ); +} + void bedDrawSimpleAt(struct track *tg, void *item, struct hvGfx *hvg, int xOff, int y, double scale, MgFont *font, Color color, enum trackVisibility vis) /* Draw a single simple bed item at position. */ { struct bed *bed = item; int heightPer = tg->heightPer; int s = max(bed->chromStart, winStart), e = min(bed->chromEnd, winEnd); if (s > e) return; int x1 = round((s-winStart)*scale) + xOff; int x2 = round((e-winStart)*scale) + xOff; int w = x2 - x1; if (w < 1) w = 1; @@ -578,30 +596,33 @@ int scoreMin = atoi(trackDbSettingClosestToHomeOrDefault(tdb, "scoreMin", "0")); int scoreMax = atoi(trackDbSettingClosestToHomeOrDefault(tdb, "scoreMax", "1000")); char *directUrl = trackDbSetting(tdb, "directUrl"); boolean withHgsid = (trackDbSetting(tdb, "hgsid") != NULL); boolean thickDrawItem = (trackDbSetting(tdb, "thickDrawItem") != NULL); if (tg->itemColor != NULL) { color = tg->itemColor(tg, bed, hvg); } else if (tg->colorShades) { adjustBedScoreGrayLevel(tdb, bed, scoreMin, scoreMax); color = tg->colorShades[grayInRange(bed->score, scoreMin, scoreMax)]; } + +color = colorFromCart(tg, color); + /* Keep the item at least 4 pixels wide at all viewpoints */ if (thickDrawItem && (w < 4)) { x1 -= ((5-w) >> 1); w = 4; x2 = x1 + w; } if (color) { hvGfxBox(hvg, x1, y, w, heightPer, color); if (tg->drawLabelInBox) { char *label = tg->itemName(tg, bed); drawScaledBoxLabel(hvg, s, e, scale, xOff, y, heightPer, color, font, label); } @@ -632,30 +653,32 @@ Color textColor = hvGfxContrastingColor(hvg, color); clippedBarbs(hvg, x1, midY, w, tl.barbHeight, tl.barbSpacing, dir, textColor, TRUE); } } } void bedDrawSimple(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis) /* Draw simple Bed items. */ { if (!tg->drawItemAt) errAbort("missing drawItemAt in track %s", tg->track); +color = colorFromCart(tg, color); + if (tg->items == NULL && vis == tvDense && canDrawBigBedDense(tg)) { bigBedDrawDense(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color); } else genericDrawItems(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis); } char *bedName(struct track *tg, void *item) /* Return name of bed track item. */ { struct bed *bed = item; if (bed->name == NULL) return "";