bafe3eac7b6809e3e15c9171712f17ac5301c57f angie Fri Feb 22 14:56:22 2019 -0800 Allow pennantIcon to be a ;-separated sequence of icon settings so we can display more than one icon next to a track name. diff --git src/hg/lib/hui.c src/hg/lib/hui.c index f67c09e..91df2a8 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -8548,37 +8548,33 @@ count++; while (sources && sameString(sources->name, source->name)) { source = slPopHead(&sources); fputs(", ", stdout); fputs(source->description, stdout); count++; } webPrintLinkCellEnd(); } sqlFreeResult(&sr); webPrintLinkTableEnd(); printf("Total: %d\n", count); } -static char *makePennantIcon(struct trackDb *tdb, char **hintRet) +static char *makeOnePennantIcon(char *setting, char **hintRet) // Builds a string with pennantIcon HTML and returns it. Also returns hint. */ { -char *setting = trackDbSetting(tdb, "pennantIcon"); -if (setting == NULL) - return FALSE; - setting = cloneString(setting); char *icon = nextWord(&setting); char buffer[4096]; char *src = NULL; char *url = NULL, *hint = NULL, *color = NULL; boolean isTextIcon = FALSE; if (!(endsWith(icon, ".jpg") || endsWith(icon, ".png"))) { isTextIcon = TRUE; color = nextWord(&setting); src = strLower(icon); } else if (startsWith("http://", icon) || startsWith("https://", icon) || startsWith("ftp://", icon)) @@ -8617,60 +8613,84 @@ else dyStringPrintf(ds, "<img height='16' width='16' src='%s'>", src); // close tags if (url) dyStringAppend(ds, "</a>"); else if (isTextIcon) dyStringAppend(ds, "</span>"); dyStringAppend(ds, "\n"); if (hint && hintRet) *hintRet = cloneString(hint); return dyStringCannibalize(&ds); } +static struct slPair *makePennantIcons(struct trackDb *tdb) +/* Return a list of pairs of pennantIcon HTML and note strings. */ +{ +char *setting = trackDbSetting(tdb, "pennantIcon"); +if (setting == NULL) + return NULL; +struct slPair *list = NULL; +int maxPennants = 3; +char *pennants[maxPennants]; +int numPennants = chopByChar(setting, ';', pennants, ArraySize(pennants)); +int i; +for (i = 0; i < numPennants; i++) + { + char *hint = NULL; + char *html = makeOnePennantIcon(pennants[i], &hint); + slPairAdd(&list, html, hint); + freeMem(html); + } +slReverse(&list); +return list; +} boolean hPrintPennantIcon(struct trackDb *tdb) // Returns TRUE and prints out the "pennantIcon" when found. // Example: ENCODE tracks in hgTracks config list. { if (trackDbSetting(tdb, "wgEncode") != NULL) { hPrintf("<a title='encode project' href='../ENCODE'><img height='16' width='16' " "src='../images/encodeThumbnail.jpg'></a>\n"); - return TRUE; } -char *pennantIcon = makePennantIcon(tdb, NULL); -if (!pennantIcon) - return FALSE; -hPrintf("%s\n", pennantIcon); -return TRUE; +struct slPair *list = makePennantIcons(tdb), *el; +boolean gotPennant = (list != NULL); +for (el = list; el != NULL; el = el->next) + hPrintf("%s\n", el->name); +slPairFreeValsAndList(&list); +return gotPennant; } boolean printPennantIconNote(struct trackDb *tdb) // Returns TRUE and prints out the "pennantIcon" and note when found. //This is used by hgTrackUi and hgc before printing out trackDb "html" { -char *hintRet; -char *pennantIcon = makePennantIcon(tdb, &hintRet); -if (!pennantIcon) - return FALSE; -printf("<br>%s\n", pennantIcon); -if (hintRet) - printf("<b>Note:</b> %s\n", hintRet); -return TRUE; +struct slPair *list = makePennantIcons(tdb), *el; +boolean gotPennant = (list != NULL); +for (el = list; el != NULL; el = el->next) + { + printf("<br>%s\n", el->name); + char *hint = el->val; + if (hint) + printf("<b>Note:</b> %s\n", hint); + } +slPairFreeValsAndList(&list); +return gotPennant; } void printUpdateTime(char *database, struct trackDb *tdb, struct customTrack *ct) /* display table update time */ { if (trackHubDatabase(database)) return; /* have not decided what to do for a composite container */ if (tdbIsComposite(tdb) || tdbIsSuper(tdb)) return; struct sqlConnection *conn = NULL; char *tableName = NULL; if (isCustomTrack(tdb->track)) {