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/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index e0ace1f..e841685 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -4762,31 +4762,41 @@
 if ((sortTrack = cgiOptionalString( "sortSim")) != NULL)
     {
     char buffer[1024];
     safef(buffer, sizeof buffer,  "simOrder_%s", sortTrack);
     wigOrder = cartString(cart, buffer);
     }
 
 if ((sortTrack = cgiOptionalString( "sortExp")) != NULL)
     {
     char buffer[1024];
     safef(buffer, sizeof buffer,  "expOrder_%s", sortTrack);
     wigOrder = cartString(cart, buffer);
     }
 
 if (wigOrder != NULL)
+    {
     orderedWiggles = slNameListFromString(wigOrder, ' ');
+    struct slName *name = orderedWiggles;
+    // if we're sorting, remove existing sort order for this composite
+    for(; name; name = name->next)
+        {
+        char buffer[1024];
+        safef(buffer, sizeof buffer,  "%s_imgOrd", name->name);
+        cartRemove(cart, buffer);
+        }
+    }
 
 // Construct flatTracks 
 for (track = trackList; track != NULL; track = track->next)
     {
     if (tdbIsComposite(track->tdb))
         {
         struct track *subtrack;
         if (isCompositeInAggregate(track))
             flatTracksAdd(&flatTracks,track,cart, orderedWiggles);
         else
             {
             for (subtrack = track->subtracks; subtrack != NULL; subtrack = subtrack->next)
                 {
                 if (!isSubtrackVisible(subtrack))
                     continue;
@@ -4796,30 +4806,42 @@
                     flatTracksAdd(&flatTracks,subtrack,cart, orderedWiggles);
                     }
                 }
             }
         }
     else
 	{	
 	if (!isLimitedVisHiddenForAllWindows(track))
 	    {
 	    flatTracksAdd(&flatTracks,track,cart, orderedWiggles);
 	    }
 	}
     }
 flatTracksSort(&flatTracks); // Now we should have a perfectly good flat track list!
 
+if (orderedWiggles)
+    {
+    // save order to cart
+    struct flatTracks *ft;
+    char buffer[4096];
+    int count = 1;
+    for(ft = flatTracks; ft; ft = ft->next)
+        {
+        safef(buffer, sizeof buffer, "%s_imgOrd", ft->track->track);
+        cartSetInt(cart, buffer, count++);
+        }
+    }
 
 // for each track, figure out maximum height needed from all windows
 for (flatTrack = flatTracks; flatTrack != NULL; flatTrack = flatTrack->next)
     {
     track = flatTrack->track;
 
     if (track->limitedVis == tvHide)
 	{
 	continue;
 	}
 
     setFlatTrackMaxHeight(flatTrack, fontHeight);
     
     }
 
@@ -7460,30 +7482,54 @@
 	break;
 	}
     }
 if (sharedErrMsg)
     {
     for (tg=track; tg; tg=tg->nextWindow)
 	{
 	tg->networkErrMsg = sharedErrMsg;
 	tg->drawItems = bigDrawWarning;
 	tg->totalHeight = bigWarnTotalHeight;
 	}
     }
 }
 
 
+void outCollectionsToJson()
+/* Output the current collections to the hgTracks JSON block. */
+{
+struct grp *groupList = NULL;
+struct trackDb *hubTdbs = hubCollectTracks( database,  &groupList);
+char buffer[4096];
+safef(buffer, sizeof buffer, "%s-%s", customCompositeCartName, database);
+char *hubFile = cartOptionalString(cart, buffer);
+char *hubName = hubNameFromUrl(hubFile);
+struct trackDb *tdb;
+struct jsonElement *jsonList = NULL;
+for(tdb = hubTdbs; tdb;  tdb = tdb->next)
+    {
+    if (sameString(tdb->grp, hubName))
+        {
+        if (jsonList == NULL)
+            jsonList = newJsonList(NULL);
+
+        jsonListAdd(jsonList, newJsonString(tdb->shortLabel));
+        }
+    }
+if (jsonList)
+    jsonObjectAdd(jsonForClient, "collections", jsonList);
+}
 
 void doTrackForm(char *psOutput, struct tempName *ideoTn)
 /* Make the tracks display form with the zoom/scroll buttons and the active
  * image.  If the ideoTn parameter is not NULL, it is filled in if the
  * ideogram is created.  */
 {
 struct group *group;
 struct track *track;
 char *freezeName = NULL;
 boolean hideAll = cgiVarExists("hgt.hideAll");
 boolean defaultTracks = cgiVarExists("hgt.reset");
 boolean showedRuler = FALSE;
 boolean showTrackControls = cartUsualBoolean(cart, "trackControlsOnMain", TRUE);
 long thisTime = 0, lastTime = 0;
 
@@ -7830,30 +7876,31 @@
         }
     }
 
 if (theImgBox)
     {
     // If a portal was established, then set the global dimensions back to the portal size
     if (imgBoxPortalDimensions(theImgBox,NULL,NULL,NULL,NULL,&virtWinStart,&virtWinEnd,&(tl.picWidth),NULL))
         {
         virtWinBaseCount = virtWinEnd - virtWinStart;
         fullInsideWidth = tl.picWidth-gfxBorder-fullInsideX;
         }
     }
 /* Center everything from now on. */
 hPrintf("<CENTER>\n");
 
+outCollectionsToJson();
 
 jsonObjectAdd(jsonForClient, "winStart", newJsonNumber(virtWinStart));
 jsonObjectAdd(jsonForClient, "winEnd", newJsonNumber(virtWinEnd));
 jsonObjectAdd(jsonForClient, "chromName", newJsonString(virtChromName));
 
 // Tell javascript about multiple windows info
 if (virtMode)
     {
     // pre windows
     long preVWinStart = virtWinStart - virtWinBaseCount;
     if (preVWinStart < 0)
 	preVWinStart = 0;
     long preVWinEnd = virtWinStart;
     struct window *preWindows = makeWindowListFromVirtChrom(preVWinStart, preVWinEnd);
     struct jsonElement *jsonForList = newJsonList(NULL);