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),