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