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