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("
Color track based on chromosome: ");
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("
");
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("Label: ");
-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 ", 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);