f7504e4db88de54c3a438f70a0acc4cddb41f148 kate Sat Jan 12 18:23:15 2019 -0800 Finish regeneron feature to display left labels instead of center labels in pack mode (setting centerLabelsPack off). refs #22739 diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c index fe966f8..4837ec6 100644 --- src/hg/hgTracks/simpleTracks.c +++ src/hg/hgTracks/simpleTracks.c @@ -782,30 +782,42 @@ rows = packCountRowsOverflow(tg, floor(maxHeight/tg->lineHeight), FALSE, allowOverflow, vis); else rows = packCountRowsOverflow(tg, floor(maxHeight/tg->lineHeight)+1, FALSE, FALSE, vis); } else { rows = slCount(tg->items); } break; case tvPack: { if(allowOverflow && itemCount < maxItemsToUseOverflow) rows = packCountRowsOverflow(tg, floor(maxHeight/tg->lineHeight), TRUE, allowOverflow, vis); else rows = packCountRowsOverflow(tg, floor(maxHeight/tg->lineHeight)+1, TRUE, FALSE, vis); + if (tdbIsCompositeChild(tg->tdb)) + { + char *centerLabelsPackOff = trackDbSetting(tg->tdb, "centerLabelsPack"); + char *collapseEmptySubtracks = trackDbSetting(tg->tdb, "collapseEmptySubtracks"); + boolean collapseEmpty = FALSE; + if (collapseEmptySubtracks && sameWord(collapseEmptySubtracks, "on")) + collapseEmpty = TRUE; + if (centerLabelsPackOff) + if (sameWord(centerLabelsPackOff, "off") && !collapseEmpty) + if (rows == 0) + rows = 1; // compact pack mode, shows just side label + } break; } case tvSquish: { tg->heightPer = heightPer/2; if ((tg->heightPer & 1) == 0) tg->heightPer -= 1; tg->lineHeight = tg->heightPer + 1; if(allowOverflow && itemCount < maxItemsToUseOverflow) rows = packCountRowsOverflow(tg, floor(maxHeight/tg->lineHeight), FALSE, allowOverflow, vis); else rows = packCountRowsOverflow(tg, floor(maxHeight/tg->lineHeight)+1, FALSE, FALSE, vis); break; } case tvDense: @@ -918,77 +930,96 @@ freeMem(encodedMapName); } } return dy; } boolean isWithCenterLabels(struct track *track) /* Cases: only TRUE when global withCenterLabels is TRUE * If track has a centerLabelDense setting 'on', then composite child has * center labels in dense mode. * If track has centerLabelsPack setting 'off', then composite child has no * center labels in pack mode (instead, has left short label. * NOTE: if there are labels, then this should be used with labelOnFeature setting. */ { -if (!track) - return FALSE; if (!withCenterLabels) return FALSE; +if (!track) + return withCenterLabels; /* NOTE: this feature may be broken. Only used in affyTxnPhase2 track */ char *centerLabelsDense = trackDbSetting(track->tdb, "centerLabelsDense"); if (centerLabelsDense && sameWord(centerLabelsDense, "on")) return TRUE; +/* char *centerLabelsPack = trackDbSetting(track->tdb, "centerLabelsPack"); if (centerLabelsPack && sameWord(centerLabelsPack, "off")) + { + enum trackVisibility vis = limitVisibility(track); + if (vis == tvPack) return FALSE; + } +*/ return TRUE; } boolean isCenterLabelConditionallySeen(struct track *track) // returns FALSE if track and prevTrack have same parent, and are both dense subtracks { if (isCenterLabelConditional(track)) { if (track->prevTrack && track->parent == track->prevTrack->parent && isCenterLabelConditional(track->prevTrack)) return FALSE; } return isWithCenterLabels(track); } boolean isCenterLabelConditional(struct track *track) -/* Dense subtracks and pack subtracks (when centerLabelsPack off set) have +/* Dense subtracks and pack subtracks (when centerLabelsPack off set) * show center labels depending on vis of previous track */ { if (!tdbIsCompositeChild((track)->tdb)) return FALSE; enum trackVisibility vis = limitVisibility(track); -if (vis == tvFull) +if (vis == tvFull || vis == tvSquish) return FALSE; if (vis == tvDense) return TRUE; -/* pack or squish */ +// pack mode char *centerLabelsPack = trackDbSetting(track->tdb, "centerLabelsPack"); if (centerLabelsPack) - return !sameWord(centerLabelsPack, "off"); + return sameWord(centerLabelsPack, "off"); return FALSE; } +boolean isCenterLabelIncluded(struct track *track) +/* Center labels may be conditionally included */ +{ +if (!isWithCenterLabels(track)) + return FALSE; +if (theImgBox) + return TRUE; +if (isCenterLabelConditionallySeen(track)) + return TRUE; +return FALSE; +//return isWithCenterLabels(track) && (theImgBox || isCenterLabelConditionallySeen(track)); +} + void mapStatusMessage(char *format, ...) /* Write out stuff that will cause a status message to * appear when the mouse is over this box. */ { va_list(args); va_start(args, format); hPrintf(" TITLE=\""); hvPrintf(format, args); hPutc('"'); va_end(args); } void mapBoxReinvoke(struct hvGfx *hvg, int x, int y, int width, int height, struct track *track, boolean toggle, char *chrom, long start, long end, char *message, char *extra) @@ -4137,64 +4168,43 @@ w = x2-textX; } // if not already mapped, pick up the label if (!(lButton && compat)) { tg->mapItem(tg, hvg, item, tg->itemName(tg, item), tg->mapItemName(tg, item), s, e, textX, y, w, heightPer); } } else if (vis == tvFull) { int geneMapBoxX = insideX; int geneMapBoxW = insideWidth; /* Draw the first gene label mapbox, in the left margin. */ -#ifndef IMAGEv2_NO_LEFTLABEL_ON_FULL int trackPastTabX = (withLeftLabels ? trackTabWidth : 0); -#ifdef IMAGEv2_SHORT_MAPITEMS - char *name = tg->itemName(tg, item); - if (*name != '\0') - tg->mapItem(tg, hvg, item, name, tg->mapItemName(tg, item), - s, e, trackPastTabX, y, insideX - trackPastTabX, heightPer); -#else///ndef IMAGEv2_SHORT_MAPITEMS tg->mapItem(tg, hvg, item, tg->itemName(tg, item), tg->mapItemName(tg, item), s, e, trackPastTabX, y, insideX - trackPastTabX, heightPer); -#endif///ndef IMAGEv2_SHORT_MAPITEMS -#endif///ndef IMAGEv2_NO_LEFTLABEL_ON_FULL /* Depending on which button mapboxes we drew, draw the remaining mapbox. */ if (lButton) { geneMapBoxX += buttonW; geneMapBoxW -= buttonW; } if (rButton) { geneMapBoxW -= buttonW; } -#ifdef IMAGEv2_SHORT_MAPITEMS - if (x2 > 0) - { - geneMapBoxX = textX; - geneMapBoxW = x2-geneMapBoxX; - if (geneMapBoxW < 5) // Full with short labels but don't make tiny map items - { - geneMapBoxX -= (5 - geneMapBoxW)/2; - geneMapBoxW = 5; - } - } -#endif//def IMAGEv2_SHORT_MAPITEMS if (compat) { // draw labeled exon/intron maps with exon/intron numbers linkedFeaturesItemExonMaps(tg, hvg, item, scale, y, heightPer, s, e, lButton, rButton, buttonW); if (!lButton) { int w = x1 - geneMapBoxX; if (w > 0) tg->mapItem(tg, hvg, item, tg->itemName(tg, item), tg->mapItemName(tg, item), s, e, geneMapBoxX, y, w, heightPer); } if (!rButton) { int w = geneMapBoxX + geneMapBoxW - x2; if (w > 0) tg->mapItem(tg, hvg, item, tg->itemName(tg, item), tg->mapItemName(tg, item),