17848d410ab4196fed212aba4d8f036769501205 kate Mon Feb 24 17:54:33 2020 -0800 Change syntax of hideEmptySubtracks: add settings for multiBed and sources URLs. refs #23365 diff --git src/hg/lib/hui.c src/hg/lib/hui.c index f6856da..fd26e51 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -5210,71 +5210,73 @@ settings->bgColorIx = COLOR_BG_DEFAULT_IX; // Start with non-default allows alternation puts("'>"); dyStringFree(&dyHtml) // save count of subtracks for use by footer code int subCount = slCount(subtrackRefList); printSubtrackTableHeader(parentTdb, subtrackRefList, settings); printSubtrackTableBody(parentTdb, subtrackRefList, settings, cart); printSubtrackTableFooter(subCount, settings); puts("</TABLE>"); } boolean compositeHideEmptySubtracksSetting(struct trackDb *tdb, boolean *retDefault, char **retMultiBedFile, char **retSubtrackIdFile) -/* Parse hideEmptySubtracks setting +/* Parse hideEmptySubtracks settings * Format: hideEmptySubtracks on|off - * or - * hideEmptySubtracks on|off multiBed.bed subtrackIds.tab - * where multiBed.bed is a bed3Sources bigBed, generated with bedtools multiinter - * post-processed by UCSC multiBed.pl tool + * Optional index files for performance: + * hideEmptySubtracksMultiBedUrl multiBed.bigBed + * hideEmptySubtracksSourceUrl subtrackIds.tab + * MultiBed.bed is a bed3Sources bigBed, generated with UCSC tool trackDbIndexBb + * (for single view subtracks, can use bedtools multiinter + * post-processed by UCSC multiBed.pl tool) * subtrackIds.tab is a tab-sep file: id subtrackName * * Return TRUE if setting is present. retDefault is TRUE if set to 'on', o/w FALSE */ { if (!tdbIsComposite(tdb)) return FALSE; char *hideEmpties = cloneString(trackDbSetting(tdb, SUBTRACK_HIDE_EMPTY)); if (!hideEmpties) return FALSE; -char *orig = cloneString(hideEmpties); -char *words[3]; -int wordCount = chopByWhite(hideEmpties, words, ArraySize(words)); -char *mode = words[0]; -if (differentString(mode, "on") && differentString(mode, "off")) +if (sameString(hideEmpties, "on")) + *retDefault = TRUE; +else if (sameString(hideEmpties, "off")) + *retDefault = FALSE; +else { - warn("Track %s %s setting invalid: %s", tdb->track, SUBTRACK_HIDE_EMPTY, orig); + warn("Track %s %s setting invalid: %s", tdb->track, SUBTRACK_HIDE_EMPTY, hideEmpties); return FALSE; } -boolean deflt = sameString(mode, "on") ? TRUE : FALSE; -if (retDefault) - *retDefault = deflt; - -if (wordCount == 1) - return TRUE; -if (wordCount != 3) +if (retMultiBedFile != NULL && retSubtrackIdFile != NULL) + { + char *file = cloneString(trackDbSetting(tdb, SUBTRACK_HIDE_EMPTY_MULTIBED_URL)); + if (file != NULL) + { + // multi-bed specified to speed display + *retMultiBedFile = cloneString(hReplaceGbdb(file)); + file = cloneString(trackDbSetting(tdb, SUBTRACK_HIDE_EMPTY_SOURCES_URL)); + if (file == NULL) { - warn("Track %s %s setting invalid: %s", tdb->track, SUBTRACK_HIDE_EMPTY, orig); + warn("Track %s missing setting: %s", tdb->track, SUBTRACK_HIDE_EMPTY_SOURCES_URL); return FALSE; } -// multi-bed specified (to speed display) -if (retMultiBedFile) - *retMultiBedFile = cloneString(hReplaceGbdb(words[1])); -if (retSubtrackIdFile) - *retSubtrackIdFile = cloneString(hReplaceGbdb(words[2])); + *retSubtrackIdFile = cloneString(hReplaceGbdb(file)); + } + } return TRUE; } boolean compositeHideEmptySubtracks(struct cart *cart, struct trackDb *tdb, char **retMultiBedFile, char **retSubtrackIdFile) /* Parse hideEmptySubtracks setting and check cart * Return TRUE if we should hide empties */ { boolean deflt = FALSE; if (!compositeHideEmptySubtracksSetting(tdb, &deflt, retMultiBedFile, retSubtrackIdFile)) return FALSE; char buf[128]; safef(buf, sizeof buf, "%s.%s", tdb->track, SUBTRACK_HIDE_EMPTY); return cartUsualBoolean(cart, buf, deflt); @@ -5309,30 +5311,31 @@ int subCount = slCount(subtrackRefList); if (subCount > LARGE_COMPOSITE_CUTOFF && membersForAll->dimensions != NULL) { // ignore displaySubtracks setting for large composites with a matrix as // matrix effectively shows all safef(buffer, SMALLBUF,"%s.displaySubtracks", parentTdb->track); displaySubs = cartUsualString(cart, buffer,"some"); // track specific defaults to only selected } else { displaySubs = cartUsualString(cart, "displaySubtracks", "all"); // browser wide defaults to all } boolean displayAll = sameString(displaySubs, "all"); boolean hideSubtracksDefault; +// TODO: Gray out or otherwise suppress when in multi-region mode if (compositeHideEmptySubtracksSetting(parentTdb, &hideSubtracksDefault, NULL, NULL)) { char *hideLabel = "Hide empty subtracks"; hideLabel = trackDbSettingOrDefault(parentTdb, SUBTRACK_HIDE_EMPTY_LABEL, hideLabel); printf("<BR><B>%s:</B> ", hideLabel); char buf[128]; safef(buf, sizeof buf, "%s.%s", parentTdb->track, SUBTRACK_HIDE_EMPTY); boolean doHideEmpties = compositeHideEmptySubtracks(cart, parentTdb, NULL, NULL); cgiMakeCheckBox(buf, doHideEmpties); } // Table wraps around entire list so that "Top" link can float to the correct place. cgiDown(0.7); printf("<table><tr><td class='windowSize'>"); printf("<A NAME='DISPLAY_SUBTRACKS'></A>");