8a6bf192d6c474938510f746fb924393ce236295
braney
  Wed Sep 13 17:58:23 2017 -0700
make visible tracks in hgCollection follow imgOrd in cart.   Put
collections information in AJAX

diff --git src/hg/hgCollection/hgCollection.c src/hg/hgCollection/hgCollection.c
index 4ab61dd..9b4b37b 100644
--- src/hg/hgCollection/hgCollection.c
+++ src/hg/hgCollection/hgCollection.c
@@ -35,30 +35,37 @@
 char *excludeVars[] = {"Submit", "submit", "hgva_startQuery", "jsonp", NULL,};
 
 struct track
 {
 struct track *next;
 struct track *trackList;
 struct trackDb *tdb;
 char *name;
 char *shortLabel;
 char *longLabel;
 char *visibility;
 unsigned long color;
 char *viewFunc;
 };
 
+struct trackDbRef 
+{
+struct trackDbRef *next;
+struct trackDb *tdb;
+int order;
+};
+
 char *getString(char **input)
 // grab a quoted string out of text blob
 {
 char *ptr = *input;
 
 if (*ptr != '"')
     errAbort("string must start with \"");
 ptr++;
 char *ret = ptr;
 for(; *ptr != '"'; ptr++)
     ;
 *ptr = 0;
 ptr++;
 
 if (*ptr == ',')
@@ -231,44 +238,83 @@
     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;
 }
 
 
-void addVisibleTracks()
-// add the visible tracks table rows
+void checkForVisible(struct trackDbRef **list, struct trackDb *tdb)
+/* Walk the trackDb hierarchy looking for visible leaf tracks. */
 {
-jsInlineF("<ul>");
-jsInlineF("<li class='nodrop' name='%s'>%s", "visibile", "Visible Tracks");
-jsInlineF("<ul>");
-struct trackDb *tdb;
-for(tdb = fullTrackList; tdb; tdb = tdb->next)
+struct trackDb *subTdb;
+char buffer[4096];
+
+if (tdb->subtracks)
+    {
+    for(subTdb = tdb->subtracks; subTdb; subTdb = subTdb->next)
+        checkForVisible(list, subTdb);
+    }
+else
     {
     if (isParentVisible(tdb) &&  isSubtrackVisible(tdb))
         {
-        printGroup("visible", tdb, FALSE, FALSE);
+        struct trackDbRef *tdbRef;
+        AllocVar(tdbRef);
+        tdbRef->tdb = tdb;
+        slAddHead(list, tdbRef);
+        safef(buffer, sizeof buffer, "%s_imgOrd", tdb->track);
+
+        tdbRef->order = cartUsualInt(cart, buffer, 0);
+        }
+    }
 }
+
+int tdbRefCompare (const void *va, const void *vb)
+// Compare to sort on imgTrack->order.
+{
+const struct trackDbRef *a = *((struct trackDbRef **)va);
+const struct trackDbRef *b = *((struct trackDbRef **)vb);
+return (a->order - b->order);
+}       
+
+void addVisibleTracks()
+// add the visible tracks table rows.
+{
+struct trackDb *tdb;
+struct trackDbRef *tdbRefList = NULL, *tdbRef;
+//checkForVisible(fullTrackList);
+for(tdb = fullTrackList; tdb; tdb = tdb->next)
+    {
+    checkForVisible(&tdbRefList, tdb);
     }
+
+slSort(&tdbRefList, tdbRefCompare);
+
+jsInlineF("<ul>");
+jsInlineF("<li class='nodrop' name='%s'>%s", "visibile", "Visible Tracks");
+jsInlineF("<ul>");
+for(tdbRef = tdbRefList; tdbRef; tdbRef = tdbRef->next)
+    printGroup("visible", tdbRef->tdb, FALSE, FALSE);
+
 jsInlineF("</ul>");
 jsInlineF("</li>");
 jsInlineF("</ul>");
 }
 
 void doTable()
 // output the tree table
 {
 char *hubName = hubNameFromUrl(getHubName(database));
 struct grp *curGroup;
 for(curGroup = fullGroupList; curGroup;  curGroup = curGroup->next)
     {
     if ((hubName != NULL) && sameString(curGroup->name, hubName))
         break;
     }