402e9b52de6f531a9283c84bd20f91464517d3c7
braney
  Thu May 11 12:51:52 2017 -0700
get "add all visible tracks" to work in hgComposite

diff --git src/hg/hgComposite/hgComposite.c src/hg/hgComposite/hgComposite.c
index 8850a60..269e6f3 100644
--- src/hg/hgComposite/hgComposite.c
+++ src/hg/hgComposite/hgComposite.c
@@ -667,105 +667,137 @@
     //selectOutput();
     //submitAndDisclaimer();
     }
 
 printf("</FORM>");
 jsReloadOnBackButton(cart);
 
 webNewSection("Using the Composite Builder");
 webIncludeHelpFileSubst("hgCompositeHelp", NULL, FALSE);
 jsIncludeFile("jquery-ui.js", NULL);
 jsIncludeFile("hgVarAnnogrator.js", NULL);
 jsIncludeFile("ui.dropdownchecklist.js", NULL);
 jsIncludeFile("ddcl.js", NULL);
 }
 
-
-
-
-
-
 void doUi(char *db, struct grp *groupList, struct trackDb *fullTrackList,struct composite *currentComposite, struct composite *compositeList) 
 /* Set up globals and make web page */
 {
 cartWebStart(cart, db, "Composite Editor");
 doMainPage(database, groupList, fullTrackList, currentComposite, compositeList);
 cartWebEnd();
 /* Save variables. */
 //cartCheckout(&cart);
 }
 
 static void addWigs(struct hash *hash, struct trackDb **wigList, struct trackDb *list)
+// Add tracks that are acceptable in custom composites.
 {
 if (list == NULL)
     return;
 
 struct trackDb *tdb, *tdbNext;
 for(tdb = list; tdb; tdb = tdbNext)
     {
     tdbNext = tdb->next;
     addWigs(hash, wigList, tdb->subtracks);
 
     if (trackCanBeAdded(tdb))
         {
         slAddHead(wigList, tdb);
         hashStore(hash, tdb->grp);
         }
     }
 
 }
 
 char *makeUnique(struct hash *nameHash, struct trackDb *tdb)
+// Make the name of this track unique.
 {
 if (hashLookup(nameHash, tdb->track) == NULL)
     {
     hashAdd(nameHash, tdb->track, tdb);
     return tdb->track;
     }
 
 unsigned count = 0;
 char buffer[4096];
 
 for(;; count++)
     {
     safef(buffer, sizeof buffer, "%s%d", tdb->track, count);
     if (hashLookup(nameHash, buffer) == NULL)
         {
         hashAdd(nameHash, buffer, tdb);
         return cloneString(buffer);
         }
     }
 
 return NULL;
 }
 
-bool trackVisible(struct trackDb *tdb)
+static bool subtrackEnabledInTdb(struct trackDb *subTdb)
+/* Return TRUE unless the subtrack was declared with "subTrack ... off". */
 {
-if ((tdb->parent != NULL) && !trackVisible(tdb->parent))
-    return FALSE;
+bool enabled = TRUE;
+char *words[2];
+char *setting;
+if ((setting = trackDbLocalSetting(subTdb, "parent")) != NULL)
+    {
+    if (chopLine(cloneString(setting), words) >= 2)
+        if (sameString(words[1], "off"))
+            enabled = FALSE;
+    }
+else
+    return subTdb->visibility != 0;
 
-boolean vis = tdb->visibility != tvHide;
-char *cartVis = cartOptionalString(cart, tdb->track);
+return enabled;
+}
 
-if (cartVis != NULL) 
+bool isSubtrackVisible(struct trackDb *tdb)
+/* Has this subtrack not been deselected in hgTrackUi or declared with
+ *  * "subTrack ... off"?  -- assumes composite track is visible. */
 {
-    if (differentString(cartVis, "hide"))
-        vis = TRUE;
-    else
-        vis = FALSE;
+boolean overrideComposite = (NULL != cartOptionalString(cart, tdb->track));
+bool enabledInTdb = subtrackEnabledInTdb(tdb);
+char option[1024];
+safef(option, sizeof(option), "%s_sel", tdb->track);
+boolean enabled = cartUsualBoolean(cart, option, enabledInTdb);
+if (overrideComposite)
+    enabled = TRUE;
+return enabled;
 }
 
+
+bool isParentVisible( struct trackDb *tdb)
+// Are this track's parents visible?
+{
+if (tdb->parent == NULL)
+    return TRUE;
+
+if (!isParentVisible(tdb->parent))
+    return FALSE;
+
+char *cartVis = cartOptionalString(cart, tdb->parent->track);
+boolean vis;
+if (cartVis != NULL) 
+    vis =  differentString(cartVis, "hide");
+else if (tdbIsSuperTrack(tdb->parent))
+    vis = tdb->parent->isShow;
+else
+    vis = tdb->parent->visibility != tvHide;
+
 return vis;
 }
 
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 long enteredMainTime = clock1000();
 if (hIsPrivateHost())
     pushCarefulMemHandler(LIMIT_2or6GB);
 
 cgiSpoof(&argc, argv);
 htmlPushEarlyHandlers(); /* Make errors legible during initialization. */
 oldVars = hashNew(10);
 cart = cartAndCookie(hUserCookie(), excludeVars, oldVars);
@@ -841,33 +873,33 @@
             composite->longLabel = composite->name;
         else
             composite->longLabel = cloneString(newCompositeLongLabel);
 
         }
     }
 
 if (currentCompositeName == NULL)
     currentComposite = compositeList;
 
 char *addAllVisible = cartOptionalString(cart, hgsAddVisTrack);
 if (addAllVisible != NULL)
     {
     struct trackDb *tdb;
 
-    for(tdb = fullTrackList; tdb; tdb = tdb->next)
+    for(tdb = wigTracks; tdb; tdb = tdb->next)
         {
-        if (trackCanBeAdded(tdb) && trackVisible(tdb))
+        if (isParentVisible(tdb) &&  isSubtrackVisible(tdb))
             {
             struct track *track;
             AllocVar(track);
             track->name = makeUnique(nameHash,  tdb);
             track->shortLabel = tdb->shortLabel;
             track->longLabel = tdb->longLabel;
             slAddHead(&currentComposite->trackList, track);
             }
         }
     }
 
 char *newTrackName = cartOptionalString(cart, hgsAddTrack);
 if (newTrackName != NULL)
     {
     if (currentComposite == NULL)