75ffe3b6a127bec72fdb44290af9b98a14eb79dc
kate
  Fri Jan 11 15:27:03 2019 -0800
Partial implementation of 'centerLabelsPack' setting, to suppress center labels in pack mode (when setting is 'off').  This checkin suppresses center labels but doesn't show left labels. refs #22739

diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index 5b44bb9..fe966f8 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -911,61 +911,84 @@
                 vis = tvFull;
             else
                 vis = tvPack;
             }
         else if (vis == tvFull || vis == tvPack || vis == tvSquish)
             vis = tvDense;
         dyStringPrintf(dy, "&%s=%s", encodedMapName, hStringFromTv(vis));
         freeMem(encodedMapName);
         }
     }
 return dy;
 }
 
 boolean isWithCenterLabels(struct track *track)
 /* Cases: only TRUE when global withCenterLabels is TRUE
- * If track->tdb has a centerLabelDense setting, go with it.
-// * If composite child then no center labels in dense mode. */
+ * 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 != NULL)
-    {
+
+/* NOTE: this feature may be broken.  Only used in affyTxnPhase2 track */
 char *centerLabelsDense = trackDbSetting(track->tdb, "centerLabelsDense");
-    if (centerLabelsDense)
-        {
-        return sameWord(centerLabelsDense, "on");
-        }
-    }
-return withCenterLabels;
+if (centerLabelsDense && sameWord(centerLabelsDense, "on"))
+    return TRUE;
+
+char *centerLabelsPack = trackDbSetting(track->tdb, "centerLabelsPack");
+if (centerLabelsPack && sameWord(centerLabelsPack, "off"))
+    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
+ *      show center labels depending on vis of previous track */
+{
+if (!tdbIsCompositeChild((track)->tdb))
+    return FALSE;
+enum trackVisibility vis = limitVisibility(track);
+if (vis == tvFull)
+    return FALSE;
+if (vis == tvDense)
+    return TRUE;
+/* pack or squish */
+char *centerLabelsPack = trackDbSetting(track->tdb, "centerLabelsPack");
+if (centerLabelsPack)
+    return !sameWord(centerLabelsPack, "off");
+return FALSE;
+}
+
 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)