512679230186222fff846896d49d97d13b8d7e0e kate Tue Mar 27 14:39:58 2018 -0700 Fix score display on mouseover, and cleanup item color code. refs #21109 diff --git src/hg/hgTracks/interactTrack.c src/hg/hgTracks/interactTrack.c index 1c2a482..3a8f1b6 100644 --- src/hg/hgTracks/interactTrack.c +++ src/hg/hgTracks/interactTrack.c @@ -10,82 +10,84 @@ #include "interact.h" #include "interactUi.h" static int interactTotalHeight(struct track *tg, enum trackVisibility vis) /* calculate height of all the interactions being displayed */ { if ( tg->visibility == tvDense) return tl.fontHeight; int min, max, deflt, current; cartTdbFetchMinMaxPixels(cart, tg->tdb, INTERACT_MINHEIGHT, INTERACT_MAXHEIGHT, atoi(INTERACT_DEFHEIGHT), &min, &max, &deflt, ¤t); return tg->height = current; } -static Color interactItemColor(struct track *tg, void *item, struct hvGfx *hvg) +static Color interactItemColor(struct track *tg, void *item, struct hvGfx *hvg, int scoreMin, int scoreMax) /* Return color to draw an interaction */ { struct interact *inter = item; if (tg->colorShades) + { + struct bed *bed = (struct bed *)inter; + adjustBedScoreGrayLevel(tg->tdb, bed, scoreMin, scoreMax); return tg->colorShades[grayInRange(inter->score, 0, 1000)]; + } +/* + There must be a better way..., e.g.: -struct rgbColor itemRgb; -// There must be a better way... -itemRgb.r = (inter->color & 0xff0000) >> 16; -itemRgb.g = (inter->color & 0xff00) >> 8; -itemRgb.b = inter->color & 0xff; -return hvGfxFindColorIx(hvg, itemRgb.r, itemRgb.g, itemRgb.b); +unsigned red = COLOR_32_RED(inter->color); +unsigned green = COLOR_32_GREEN(inter->color); +unsigned blue = COLOR_32_BLUE(inter->color); +*/ +unsigned red = (inter->color & 0xff0000) >> 16; +unsigned green = (inter->color & 0xff00) >> 8; +unsigned blue = inter->color & 0xff; +return hvGfxFindColorIx(hvg, red, green, blue); } void interactLoadItems(struct track *tg) /* Load all interact items in region */ { loadSimpleBedWithLoader(tg, (bedItemLoader)interactLoad); if (tg->limitedVisSet) { // too many items to display // borrowed behaviors in bamTrack and vcfTrack // TODO BRANEY: make this behavior generic for bigBeds // (bigBedSelectRange) tg->drawItems = bigDrawWarning; tg->networkErrMsg = "Too many items in display (zoom in)"; tg->totalHeight = bigWarnTotalHeight; return; } -// filter and grayscale adjustment on score +// filter on score char buf[1024]; safef(buf, sizeof buf, "%s.%s", tg->tdb->track, INTERACT_MINSCORE); -int minScore = cartUsualInt(cart, buf, INTERACT_DEFMINSCORE); -int scoreMin = atoi(trackDbSettingClosestToHomeOrDefault(tg->tdb, "scoreMin", "0")); -int scoreMax = atoi(trackDbSettingClosestToHomeOrDefault(tg->tdb, "scoreMax", "1000")); +int minScore = cartUsualInt(cart, buf, 0); struct interact *inter, *next, *filteredItems = NULL; int count = slCount(tg->items); for (inter = tg->items; inter; inter = next) { next = inter->next; if (inter->score < minScore) continue; - if (tg->colorShades) - { - struct bed *bed = (struct bed *)inter; - adjustBedScoreGrayLevel(tg->tdb, bed, scoreMin, scoreMax); - } slAddHead(&filteredItems, inter); } + slReverse(&filteredItems); // consider sorting by score/value so highest scored items draw last (on top) if (slCount(filteredItems) != count) labelTrackAsFiltered(tg); tg->items = filteredItems; } char *interactMouseover(struct interact *inter, char *otherChrom) /* Make mouseover text for an interaction */ { struct dyString *ds = dyStringNew(0); if (isEmptyTextField(inter->name)) { if (!isEmptyTextField(inter->exp)) dyStringPrintf(ds, "%s ", inter->exp); @@ -219,40 +221,44 @@ INTERACT_DRAW, INTERACT_DRAW_DEFAULT); if (sameString(drawMode, INTERACT_DRAW_CURVE)) draw = DRAW_CURVE; else if (sameString(drawMode, INTERACT_DRAW_ELLIPSE)) draw = DRAW_ELLIPSE; } double scale = scaleForWindow(width, seqStart, seqEnd); struct interact *inter = NULL; char buffer[1024]; char itemBuf[2048]; // Gather info for layout struct interactTrackInfo *tInfo = interactGetTrackInfo(tg, seqStart, hvg, xOff, font, scale); +// Get spectrum range +int scoreMin = atoi(trackDbSettingClosestToHomeOrDefault(tg->tdb, "scoreMin", "0")); +int scoreMax = atoi(trackDbSettingClosestToHomeOrDefault(tg->tdb, "scoreMax", "1000")); // Draw items for (inter = (struct interact *)tg->items; inter; inter = inter->next) { char *otherChrom = interactOtherChrom(inter); safef(itemBuf, sizeof itemBuf, "%s", inter->name); char *statusBuf = interactMouseover(inter, otherChrom); // Pick colors - color = interactItemColor(tg, inter, hvg); + + color = interactItemColor(tg, inter, hvg, scoreMin, scoreMax); if (vis == tvDense && otherChrom && color == MG_BLACK) // use highlight color for other chrom items in dense mode color = MG_MAGENTA; int peakColor = (color == MG_BLACK || tg->colorShades) ? MG_MAGENTA : MG_GRAY; if (otherChrom) { // different chromosomes // draw below same chrom items, if any int height = 0; int yOffOther = yOff; if (vis == tvDense) { height = tg->height; }