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