ae9de008e7786f3fccd9f52db6514540b1c995d5 kent Thu Mar 31 05:52:43 2011 -0700 Smoothing out the handling of the track->children pointer and track->subtracks pointer so that it works the same in hgTrackUi as elsewhere. The children pointers are set after pruning the track list for ones where the data table is not available. diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c index fa04de1..03b87a3 100644 --- src/hg/hgTrackUi/hgTrackUi.c +++ src/hg/hgTrackUi/hgTrackUi.c @@ -2298,44 +2298,53 @@ "&list_uids=%s&dopt=Abstract&tool=genome.ucsc.edu\" TARGET=_BLANK>%s</A>", pmId, ref); labelArr[refCount] = cloneString(label); valueArr[refCount++] = cloneString(pmId); if (! filterPmIdInCart) slNameAddHead(&checked, pmId); if (refCount >= MAX_DGV_REFS) errAbort("dgvUi: %s has too many references (max %d)", tdb->track, MAX_DGV_REFS); } sqlFreeResult(&sr); jsMakeCheckboxGroupSetClearButton(cartVarName, TRUE); jsMakeCheckboxGroupSetClearButton(cartVarName, FALSE); cgiMakeCheckboxGroupWithVals(cartVarName, labelArr, valueArr, refCount, checked, 4); hFreeConn(&conn); } -void superTrackUi(struct trackDb *superTdb) -/* List tracks in this collection, with visibility controls and UI links */ +static boolean isInTrackList(struct trackDb *tdbList, struct trackDb *target) +/* Return TRUE if target is in tdbList. */ { struct trackDb *tdb; +for (tdb = tdbList; tdb != NULL; tdb = tdb->next) + if (tdb == target) + return TRUE; +return FALSE; +} + +void superTrackUi(struct trackDb *superTdb, struct trackDb *tdbList) +/* List tracks in this collection, with visibility controls and UI links */ +{ printf("<P><TABLE CELLPADDING=2>"); -tdbSortPrioritiesFromCart(cart, &superTdb->subtracks); -for (tdb = superTdb->subtracks; tdb != NULL; tdb = tdb->next) - { - if (!hTableOrSplitExists(database, tdb->table) - && tdb->subtracks != NULL && trackDbLocalSetting(tdb, "compositeTrack") == NULL - && !tdbIsDownloadsOnly(tdb)) - // NOTE: tdb if composite, is not yet populated with it's own subtracks! - continue; +tdbRefSortPrioritiesFromCart(cart, &superTdb->children); +struct slRef *childRef; +for (childRef = superTdb->children; childRef != NULL; childRef = childRef->next) + { + struct trackDb *tdb = childRef->val; printf("<TR><TD NOWRAP>"); + boolean uglyOne = (sameString(tdb->track, "wgEncodeRegProEnhCorrLoose")); + if (uglyOne) + uglyf("corrLoose %d", isInTrackList(tdbList, tdb)); if (tdbIsDownloadsOnly(tdb)) printf("%s ",tdb->shortLabel); else printf("<A HREF='%s?%s=%u&c=%s&g=%s'>%s</A> ", (tdbIsDownloadsOnly(tdb)? hgFileUiName(): hgTrackUiName()), cartSessionVarName(), cartSessionId(cart), chromosome, cgiEncode(tdb->track), tdb->shortLabel); printf("</TD><TD>"); if (tdbIsDownloadsOnly(tdb)) { printf("<A HREF='%s?%s=%u&g=%s'>Downloads</A>", hgFileUiName(),cartSessionVarName(), cartSessionId(cart), cgiEncode(tdb->track)); } else { @@ -2343,31 +2352,31 @@ hTvFromString(cartUsualString(cart, tdb->track, hStringFromTv(tdb->visibility))); hTvDropDownClassVisOnly(tdb->track, tv, tdb->canPack, tv == tvHide ? "hiddenText" : "normalText", trackDbSetting(tdb, "onlyVisibility")); } printf("<TD>%s", tdb->longLabel); char *dataVersion = trackDbSetting(tdb, "dataVersion"); if (dataVersion) printf("  <EM><FONT COLOR=#666666 SIZE=-1>%s</FONT></EM>", dataVersion); printf("</TD></TR>"); } printf("</TABLE>"); } -void specificUi(struct trackDb *tdb, struct customTrack *ct, boolean ajax) +void specificUi(struct trackDb *tdb, struct trackDb *tdbList, struct customTrack *ct, boolean ajax) /* Draw track specific parts of UI. */ { char *track = tdb->track; if (sameString(track, "stsMap")) stsMapUi(tdb); else if (sameString(track, "affyTxnPhase2")) affyTxnPhase2Ui(tdb); else if (sameString(track, "cgapSage")) cgapSageUi(tdb); else if (sameString(track, "stsMapMouseNew")) stsMapMouseUi(tdb); else if (sameString(track, "stsMapRat")) stsMapRatUi(tdb); else if (sameString(track, "snpMap")) @@ -2583,42 +2592,58 @@ indelShowOptions(cart, tdb); } else if (sameWord(words[0], "factorSource")) { printf("<BR><B>Cell Abbreviations:</B><BR>\n"); char *sourceTable = trackDbRequiredSetting(tdb, "sourceTable"); struct sqlConnection *conn = hAllocConn(database); hPrintAbbreviationTable(conn, sourceTable, "Cell Type"); hFreeConn(&conn); } } freeMem(typeLine); } if (tdbIsSuperTrack(tdb)) { - superTrackUi(tdb); + superTrackUi(tdb, tdbList); } else if (tdbIsComposite(tdb)) // for the moment generalizing this to include other containers... { hCompositeUi(database, cart, tdb, NULL, NULL, MAIN_FORM, trackHash); } if (!ajax) extraUiLinks(database,tdb, trackHash); } +#ifdef UNUSED +static void findSuperChildrenAndSettings(struct trackDb *tdbList, struct trackDb *super) +/* Find the tracks that have super as a parent and stuff references to them on + * super's children list. Also do some visibility and parentName futzing. */ +{ +struct trackDb *tdb; +for (tdb = tdbList; tdb != NULL; tdb = tdb->next) + { + if (tdb->parent == super) + { + trackDbSuperMemberSettings(tdb); /* This adds tdb to tdb->parent->children. */ + } + } +} +#endif /* UNUSED */ + -void trackUi(struct trackDb *tdb, struct customTrack *ct, boolean ajax) +void trackUi(struct trackDb *tdb, struct trackDb *tdbList, struct customTrack *ct, boolean ajax) /* Put up track-specific user interface. */ { if (!ajax) { jsIncludeFile("jquery.js", NULL); webIncludeResourceFile("jquery-ui.css"); jsIncludeFile("jquery-ui.js", NULL); jsIncludeFile("utils.js",NULL); } #define RESET_TO_DEFAULTS "defaults" char setting[128]; // NOTE: Currently only composite multi-view tracks because // reset relies upon all cart vars following naming convention: // {track}.{varName}... ( One exception supported: {track}_sel ). @@ -2696,34 +2721,30 @@ tdb->canPack = TRUE; else if (sameString(tdb->track, WIKI_TRACK_TABLE)) // special case wikiTrack (there's no trackDb entry); fixes redmine 2395 tdb->canPack = TRUE; // Don't bother with vis controls for downloadsOnly if (!tdbIsDownloadsOnly(tdb)) { /* Display visibility menu */ if (tdbIsComposite(tdb) && multViewCount(tdb) > 0) printf("<B>Maximum display mode: </B>"); else printf("<B>Display mode: </B>"); if (tdbIsSuper(tdb)) { - /* This is a supertrack -- load its members and show hide/show dropdown */ - // hub tracks already have their subtracks loaded - if (!isHubTrack(tdb->track)) - hTrackDbLoadSuper(database, tdb); superTrackDropDown(cart, tdb, 1); } else { /* normal visibility control dropdown */ enum trackVisibility vis = tdb->visibility; boolean canPack = tdb->canPack; if (ajax) { vis = tdbVisLimitedByAncestry(cart, tdb, TRUE); // ajax popups should show currently inherited visability if (tdbIsCompositeChild(tdb)) canPack = TRUE; } else vis = hTvFromString(cartUsualString(cart,tdb->track, hStringFromTv(vis))); // But hgTrackUi page should show local vis @@ -2772,31 +2793,31 @@ } char *downArrow = "⇓"; enum browserType browser = cgiBrowser(); if (browser == btIE || browser == btFF) downArrow = "↓"; printf(" <A HREF='#DISPLAY_SUBTRACKS' TITLE='Jump to subtracks section of page'>Subtracks%s</A>",downArrow); printf(" <A HREF='#TRACK_HTML' TITLE='Jump to description section of page'>Description%s</A>",downArrow); printf(" </span>"); } } printf("<BR>\n"); if (tdbIsDownloadsOnly(tdb)) filesDownloadUi(database,cart,tdb); // Composites without tracks but with files to download are tdb->type: downloadsOnly else - specificUi(tdb, ct, ajax); + specificUi(tdb, tdbList, ct, ajax); puts("</FORM>"); if (ajax) return; if (ct) { /* hidden form for custom tracks CGI */ printf("<FORM ACTION='%s' NAME='customTrackForm'>", hgCustomName()); cartSaveSession(cart); cgiMakeHiddenVar(CT_SELECTED_TABLE_VAR, tdb->track); puts("</FORM>\n"); if (ct->bbiFile) { time_t timep = bbiUpdateTime(ct->bbiFile); @@ -2917,58 +2938,56 @@ } } } else if (isHubTrack(track)) { tdb = hubConnectAddHubForTrackAndFindTdb(database, track, &tdbList, trackHash); } else if (sameString(track, "hgPcrResult")) tdb = pcrResultFakeTdb(); else { tdb = tdbForTrack(database, track,&tdbList); } if (tdb == NULL) { - uglyAbort("Can't find %s in track database %s chromosome %s. TrackHash has %d els", - track, database, chromosome, trackHash->elCount); errAbort("Can't find %s in track database %s chromosome %s", track, database, chromosome); } char *super = trackDbGetSupertrackName(tdb); if (super) { /* configured as a supertrack member in trackDb */ if (tdb->parent) { /* the supertrack is also configured, so use supertrack defaults */ tdbMarkAsSuperTrack(tdb->parent); trackDbSuperMemberSettings(tdb); } } char *title = (tdbIsSuper(tdb) ? "Super-track Settings" : tdbIsDownloadsOnly(tdb) ? DOWNLOADS_ONLY_TITLE : "Track Settings"); if(cartOptionalString(cart, "ajax")) { // html is going to be used w/n a dialog in hgTracks.js so serve up stripped down html - trackUi(tdb, ct, TRUE); + trackUi(tdb, tdbList, ct, TRUE); cartRemove(cart,"ajax"); } else { cartWebStart(cart, database, "%s %s", tdb->shortLabel, title); - trackUi(tdb, ct, FALSE); + trackUi(tdb, tdbList, ct, FALSE); printf("<BR>\n"); webEnd(); } } char *excludeVars[] = { "submit", "Submit", "g", NULL, "ajax", NULL,}; int main(int argc, char *argv[]) /* Process command line. */ { cgiSpoof(&argc, argv); htmlSetBackground(hBackgroundImage()); setUdcCacheDir(); cartEmptyShell(doMiddle, hUserCookie(), excludeVars, NULL); return 0;