402e9b52de6f531a9283c84bd20f91464517d3c7 braney Thu May 11 12:51:52 2017 -0700 get "add all visible tracks" to work in hgComposite diff --git src/hg/hgComposite/hgComposite.c src/hg/hgComposite/hgComposite.c index 8850a60..269e6f3 100644 --- src/hg/hgComposite/hgComposite.c +++ src/hg/hgComposite/hgComposite.c @@ -667,105 +667,137 @@ //selectOutput(); //submitAndDisclaimer(); } printf("</FORM>"); jsReloadOnBackButton(cart); webNewSection("Using the Composite Builder"); webIncludeHelpFileSubst("hgCompositeHelp", NULL, FALSE); jsIncludeFile("jquery-ui.js", NULL); jsIncludeFile("hgVarAnnogrator.js", NULL); jsIncludeFile("ui.dropdownchecklist.js", NULL); jsIncludeFile("ddcl.js", NULL); } - - - - - void doUi(char *db, struct grp *groupList, struct trackDb *fullTrackList,struct composite *currentComposite, struct composite *compositeList) /* Set up globals and make web page */ { cartWebStart(cart, db, "Composite Editor"); doMainPage(database, groupList, fullTrackList, currentComposite, compositeList); cartWebEnd(); /* Save variables. */ //cartCheckout(&cart); } static void addWigs(struct hash *hash, struct trackDb **wigList, struct trackDb *list) +// Add tracks that are acceptable in custom composites. { if (list == NULL) return; struct trackDb *tdb, *tdbNext; for(tdb = list; tdb; tdb = tdbNext) { tdbNext = tdb->next; addWigs(hash, wigList, tdb->subtracks); if (trackCanBeAdded(tdb)) { slAddHead(wigList, tdb); hashStore(hash, tdb->grp); } } } char *makeUnique(struct hash *nameHash, struct trackDb *tdb) +// Make the name of this track unique. { if (hashLookup(nameHash, tdb->track) == NULL) { hashAdd(nameHash, tdb->track, tdb); return tdb->track; } unsigned count = 0; char buffer[4096]; for(;; count++) { safef(buffer, sizeof buffer, "%s%d", tdb->track, count); if (hashLookup(nameHash, buffer) == NULL) { hashAdd(nameHash, buffer, tdb); return cloneString(buffer); } } return NULL; } -bool trackVisible(struct trackDb *tdb) +static bool subtrackEnabledInTdb(struct trackDb *subTdb) +/* Return TRUE unless the subtrack was declared with "subTrack ... off". */ { -if ((tdb->parent != NULL) && !trackVisible(tdb->parent)) - return FALSE; +bool enabled = TRUE; +char *words[2]; +char *setting; +if ((setting = trackDbLocalSetting(subTdb, "parent")) != NULL) + { + if (chopLine(cloneString(setting), words) >= 2) + if (sameString(words[1], "off")) + enabled = FALSE; + } +else + return subTdb->visibility != 0; -boolean vis = tdb->visibility != tvHide; -char *cartVis = cartOptionalString(cart, tdb->track); +return enabled; +} -if (cartVis != NULL) +bool isSubtrackVisible(struct trackDb *tdb) +/* Has this subtrack not been deselected in hgTrackUi or declared with + * * "subTrack ... off"? -- assumes composite track is visible. */ { - if (differentString(cartVis, "hide")) - vis = TRUE; - else - vis = FALSE; +boolean overrideComposite = (NULL != cartOptionalString(cart, tdb->track)); +bool enabledInTdb = subtrackEnabledInTdb(tdb); +char option[1024]; +safef(option, sizeof(option), "%s_sel", tdb->track); +boolean enabled = cartUsualBoolean(cart, option, enabledInTdb); +if (overrideComposite) + enabled = TRUE; +return enabled; } + +bool isParentVisible( struct trackDb *tdb) +// Are this track's parents visible? +{ +if (tdb->parent == NULL) + return TRUE; + +if (!isParentVisible(tdb->parent)) + 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; } int main(int argc, char *argv[]) /* Process command line. */ { long enteredMainTime = clock1000(); if (hIsPrivateHost()) pushCarefulMemHandler(LIMIT_2or6GB); cgiSpoof(&argc, argv); htmlPushEarlyHandlers(); /* Make errors legible during initialization. */ oldVars = hashNew(10); cart = cartAndCookie(hUserCookie(), excludeVars, oldVars); @@ -841,33 +873,33 @@ composite->longLabel = composite->name; else composite->longLabel = cloneString(newCompositeLongLabel); } } if (currentCompositeName == NULL) currentComposite = compositeList; char *addAllVisible = cartOptionalString(cart, hgsAddVisTrack); if (addAllVisible != NULL) { struct trackDb *tdb; - for(tdb = fullTrackList; tdb; tdb = tdb->next) + for(tdb = wigTracks; tdb; tdb = tdb->next) { - if (trackCanBeAdded(tdb) && trackVisible(tdb)) + if (isParentVisible(tdb) && isSubtrackVisible(tdb)) { struct track *track; AllocVar(track); track->name = makeUnique(nameHash, tdb); track->shortLabel = tdb->shortLabel; track->longLabel = tdb->longLabel; slAddHead(¤tComposite->trackList, track); } } } char *newTrackName = cartOptionalString(cart, hgsAddTrack); if (newTrackName != NULL) { if (currentComposite == NULL)