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);