808cd430ff66db14e94571bc2425c59fc153a382 galt Thu Mar 31 22:11:15 2016 -0700 I re-worked this so it would be more correct for gtex pack labels. diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c index 24bf5c5..1132dc6 100644 --- src/hg/hgTracks/simpleTracks.c +++ src/hg/hgTracks/simpleTracks.c @@ -545,107 +545,106 @@ errAbort("sin empty (hel->val)!"); if (!sin->done) { // still needs to be done slReverse(&hel->val); sin = (struct sameItemNode *)hel->val; } bool noLabel = FALSE; struct window *firstWin = sin->window; // first window struct window *lastWin = NULL; bool foundWork = FALSE; struct spaceRange *rangeList=NULL, *range; struct spaceNode *nodeList=NULL, *node; int rangeWidth = 0; // width in pixels of all ranges + int leftLabelSize = 0; for(; sin; sin=sin->next) { if (sin->window != firstWin && !foundWork) break; // If we have not found work within the first window, we never will. if (sin->done) // If the node has already been done by a previous pass then skip continue; if (lastWin == sin->window) // If we already did one in this window, skip to the next window continue; sin->done = TRUE; foundWork = TRUE; lastWin = sin->window; int winOffset = sin->window->insideX - fullInsideX; struct slList *item = sin->item; int baseStart = tg->itemStart(tg, item); int baseEnd = tg->itemEnd(tg, item); struct window *w = sin->window; // convert bases to pixels if (baseStart <= w->winStart) start = 0; else start = round((double)(baseStart - w->winStart)*scale); if (!tg->drawLabelInBox && !tg->drawName && withLabels && (!noLabel)) - start -= mgFontStringWidth(font, + { + leftLabelSize = mgFontStringWidth(font, tg->itemName(tg, item)) + extraWidth; + if (start - leftLabelSize + winOffset < 0) + leftLabelSize = -start; + start -= leftLabelSize; + } + if (baseEnd >= w->winEnd) end = w->insideWidth; else end = round((baseEnd - w->winStart)*scale); if (tg->itemRightPixels && withLabels) { end += tg->itemRightPixels(tg, item); if (end > w->insideWidth) end = w->insideWidth; } - if (start + winOffset < 0) - start = -winOffset; - - AllocVar(range); range->start = start + winOffset; range->end = end + winOffset; slAddHead(&rangeList, range); rangeWidth += (range->end - range->start); AllocVar(node); node->val = item; node->parentSs = sin->ss; node->noLabel = noLabel; slAddHead(&nodeList, node); noLabel = TRUE; // turns off labels for all following windows - for now. } if (!foundWork) continue; slReverse(&rangeList); slReverse(&nodeList); // non-proportional fixed-width handling (e.g. GTEX) if (tg->nonPropPixelWidth) { int npWidth = tg->nonPropPixelWidth(tg, item); - // account for label width unless we are already pushed against left side. - if (rangeList->start != 0 && !tg->drawLabelInBox && !tg->drawName && withLabels) - npWidth += mgFontStringWidth(font, - tg->itemName(tg, item)) + extraWidth; - + npWidth += leftLabelSize; if (npWidth > rangeWidth) { // keep the first range but extend it range = rangeList; range->end = range->start + npWidth; range->next = NULL; // do not need the rest of the ranges } } if (spaceSaverAddOverflowMulti(ss, rangeList, nodeList, allowOverflow) == NULL) break; } } spaceSaverFinish(tg->ss); }