0658fac8d5f0ec35d5212eec876c3a2d87bd25ac
braney
  Mon Feb 6 15:46:27 2017 -0800
add the ability to set default labels and the label separator for bigBed
labels

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 8c609f5..168fbe7 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -5789,54 +5789,86 @@
 // initial value of chromosome coloring option is "on", unless
 // overridden by the colorChromDefault setting in the track
 char *colorDefault = trackDbSettingOrDefault(tdb, "colorChromDefault", "on");
 
 printf("<p><b>Color track based on chromosome:</b> ");
 safef(colorVar, sizeof(colorVar), "%s.color", tdb->track);
 colorSetting = cartUsualString(cart, colorVar, colorDefault);
 cgiMakeRadioButton(colorVar, "on", sameString(colorSetting, "on"));
 printf(" on ");
 cgiMakeRadioButton(colorVar, "off", sameString(colorSetting, "off"));
 printf(" off ");
 printf("<br><br>");
 filterByChromCfgUi(cart,tdb);
 }
 
+struct slPair *buildFieldList(struct trackDb *tdb, char *trackDbVar, struct asObject *as)
+/* Build up a hash of a list of fields in an AS file. */
+{
+struct slPair *list = NULL;
+char *fields = trackDbSettingClosestToHome(tdb, trackDbVar);
+
+if (fields != NULL)
+    {
+    struct slName *thisField, *fieldList = slNameListFromComma(fields);
+    for(thisField = fieldList; thisField; thisField = thisField->next)
+        {
+        char *trimLabel = trimSpaces(thisField->name);
+        unsigned colNum = asColumnFindIx(as->columnList, trimLabel);
+        if (colNum == -1)
+            errAbort("cannot find field named '%s' in as file '%s'", 
+                trimLabel, as->name);
+
+        slAddHead(&list, slPairNew(trimLabel, NULL + colNum));
+        }
+    }
+
+slReverse(&list);
+return list;
+}
+
 void labelCfgUi(char *db, struct cart *cart, struct trackDb *tdb)
 /* If there is a labelFields for a bigBed, this routine is called to put up the label options. */
 {
-char *labelFields = trackDbSettingClosestToHome(tdb, "labelFields");
-if (labelFields == NULL)
-    return;
-
-struct slName *thisLabel, *labelIds = slNameListFromComma(labelFields);
 struct asObject *as = asForDb(tdb, db);  
+struct slPair *labelList = buildFieldList(tdb, "labelFields",  as);
+struct slPair *defaultLabelList = buildFieldList(tdb, "defaultLabelFields",  as);
 char varName[1024];
 
+if (labelList == NULL)
+    return;
+
 printf("<B>Label:</B> ");
-for(thisLabel = labelIds; thisLabel; thisLabel = thisLabel->next)
+struct slPair *thisLabel = labelList;
+for(; thisLabel; thisLabel = thisLabel->next)
     {
-    char *trimLabel = trimSpaces(thisLabel->name);
-    struct asColumn *col = asColumnFind(as, trimLabel);
-
-    if (col == NULL)
-        errAbort("cannot find field named '%s' in as file '%s'",
-            trimLabel, as->name);
+    safef(varName, sizeof(varName), "%s.label.%s", tdb->track, thisLabel->name);
+    boolean isDefault = FALSE;
+    if (defaultLabelList == NULL)
+        isDefault = (thisLabel == labelList);
+    else
+        isDefault = (slPairFind(defaultLabelList, thisLabel->name) != NULL);
 
-    safef(varName, sizeof(varName), "%s.label.%s", tdb->track, trimLabel);
-    boolean option = cartUsualBoolean(cart, varName, thisLabel==labelIds);
+    boolean option = cartUsualBoolean(cart, varName, isDefault);
     cgiMakeCheckBox(varName, option);
+
+    // find comment for the column listed
+    struct asColumn *col = as->columnList;
+    unsigned num = ptToInt(thisLabel->val);
+    for(; col && num--; col = col->next)
+        ;
+    assert(col);
     printf(" %s&nbsp;&nbsp;&nbsp;", col->comment);
     }
 }
 
 void pslCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *name, char *title,
               boolean boxed)
 /* Put up UI for psl tracks */
 {
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 
 char *typeLine = cloneString(tdb->type);
 char *words[8];
 int wordCount = wordCount = chopLine(typeLine, words);
 if (sameString(tdb->type, "bigPsl"))
     labelCfgUi(db, cart, tdb);