17848d410ab4196fed212aba4d8f036769501205
kate
  Mon Feb 24 17:54:33 2020 -0800
Change syntax of hideEmptySubtracks: add settings for multiBed and sources URLs. refs #23365

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index f6856da..fd26e51 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -5210,71 +5210,73 @@
     settings->bgColorIx = COLOR_BG_DEFAULT_IX; // Start with non-default allows alternation
 puts("'>");
 dyStringFree(&dyHtml)
 
 // save count of subtracks for use by footer code
 int subCount = slCount(subtrackRefList);
 
 printSubtrackTableHeader(parentTdb, subtrackRefList, settings);
 printSubtrackTableBody(parentTdb, subtrackRefList, settings, cart);
 printSubtrackTableFooter(subCount, settings);
 puts("</TABLE>");
 }
 
 boolean compositeHideEmptySubtracksSetting(struct trackDb *tdb, boolean *retDefault,
                                         char **retMultiBedFile, char **retSubtrackIdFile)
-/* Parse hideEmptySubtracks setting
+/* Parse hideEmptySubtracks settings
  * Format:  hideEmptySubtracks on|off
- *              or
- *          hideEmptySubtracks on|off multiBed.bed subtrackIds.tab
- * where multiBed.bed is a bed3Sources bigBed, generated with bedtools multiinter
- *              post-processed by UCSC multiBed.pl tool
+ *      Optional index files for performance:
+ *          hideEmptySubtracksMultiBedUrl multiBed.bigBed 
+ *          hideEmptySubtracksSourceUrl subtrackIds.tab
+ * MultiBed.bed is a bed3Sources bigBed, generated with UCSC tool trackDbIndexBb
+ *              (for single view subtracks, can use bedtools multiinter
+ *              post-processed by UCSC multiBed.pl tool)
  *      subtrackIds.tab is a tab-sep file: id subtrackName
  *
  * Return TRUE if setting is present.  retDefault is TRUE if set to 'on', o/w FALSE
  */
 {
 if (!tdbIsComposite(tdb))
     return FALSE;
 char *hideEmpties = cloneString(trackDbSetting(tdb, SUBTRACK_HIDE_EMPTY));
 if (!hideEmpties)
     return FALSE;
-char *orig = cloneString(hideEmpties);
-char *words[3];
-int wordCount = chopByWhite(hideEmpties, words, ArraySize(words));
-char *mode = words[0];
-if (differentString(mode, "on") && differentString(mode, "off"))
+if (sameString(hideEmpties, "on"))
+    *retDefault = TRUE;
+else if (sameString(hideEmpties, "off"))
+    *retDefault = FALSE;
+else
     {
-    warn("Track %s %s setting invalid: %s", tdb->track, SUBTRACK_HIDE_EMPTY, orig);
+    warn("Track %s %s setting invalid: %s", tdb->track, SUBTRACK_HIDE_EMPTY, hideEmpties);
     return FALSE;
     }
-boolean deflt = sameString(mode, "on") ? TRUE : FALSE;
-if (retDefault)
-    *retDefault = deflt;
-
-if (wordCount == 1)
-    return TRUE;
-if (wordCount != 3)
+if (retMultiBedFile != NULL && retSubtrackIdFile != NULL)
+    {
+    char *file = cloneString(trackDbSetting(tdb, SUBTRACK_HIDE_EMPTY_MULTIBED_URL));
+    if (file != NULL)
+        {
+        // multi-bed specified to speed display
+        *retMultiBedFile = cloneString(hReplaceGbdb(file));
+        file = cloneString(trackDbSetting(tdb, SUBTRACK_HIDE_EMPTY_SOURCES_URL));
+        if (file == NULL)
             {
-    warn("Track %s %s setting invalid: %s", tdb->track, SUBTRACK_HIDE_EMPTY, orig);
+            warn("Track %s missing setting: %s", tdb->track, SUBTRACK_HIDE_EMPTY_SOURCES_URL);
             return FALSE;
             }
-// multi-bed specified (to speed display)
-if (retMultiBedFile)
-    *retMultiBedFile = cloneString(hReplaceGbdb(words[1]));
-if (retSubtrackIdFile)
-    *retSubtrackIdFile = cloneString(hReplaceGbdb(words[2]));
+        *retSubtrackIdFile = cloneString(hReplaceGbdb(file));
+        }
+    }
 return TRUE;
 }
 
 boolean compositeHideEmptySubtracks(struct cart *cart, struct trackDb *tdb,
                                         char **retMultiBedFile, char **retSubtrackIdFile)
 /* Parse hideEmptySubtracks setting and check cart
  * Return TRUE if we should hide empties
  */
 {
 boolean deflt = FALSE;
 if (!compositeHideEmptySubtracksSetting(tdb, &deflt, retMultiBedFile, retSubtrackIdFile))
     return FALSE;
 char buf[128];
 safef(buf, sizeof buf, "%s.%s", tdb->track, SUBTRACK_HIDE_EMPTY);
 return cartUsualBoolean(cart, buf, deflt);
@@ -5309,30 +5311,31 @@
 int subCount = slCount(subtrackRefList);
 if (subCount > LARGE_COMPOSITE_CUTOFF && membersForAll->dimensions != NULL)
     {
     // ignore displaySubtracks setting for large composites with a matrix as
     // matrix effectively shows all
     safef(buffer, SMALLBUF,"%s.displaySubtracks", parentTdb->track);
     displaySubs = cartUsualString(cart, buffer,"some"); // track specific defaults to only selected
     }
 else
     {
     displaySubs = cartUsualString(cart, "displaySubtracks", "all"); // browser wide defaults to all
     }
 boolean displayAll = sameString(displaySubs, "all");
 
 boolean hideSubtracksDefault;
+// TODO: Gray out or otherwise suppress when in multi-region mode 
 if (compositeHideEmptySubtracksSetting(parentTdb, &hideSubtracksDefault, NULL, NULL))
     {
     char *hideLabel = "Hide empty subtracks";
     hideLabel = trackDbSettingOrDefault(parentTdb, SUBTRACK_HIDE_EMPTY_LABEL, hideLabel);
     printf("<BR><B>%s:</B> &nbsp;", hideLabel);
     char buf[128];
     safef(buf, sizeof buf, "%s.%s", parentTdb->track, SUBTRACK_HIDE_EMPTY);
     boolean doHideEmpties = compositeHideEmptySubtracks(cart, parentTdb, NULL, NULL);
     cgiMakeCheckBox(buf, doHideEmpties);
     }
 
 // Table wraps around entire list so that "Top" link can float to the correct place.
 cgiDown(0.7);
 printf("<table><tr><td class='windowSize'>");
 printf("<A NAME='DISPLAY_SUBTRACKS'></A>");