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))
     {