a2b887e7bae9377807d176890e0958f4a10edecb braney Mon Nov 4 14:28:40 2019 -0800 add FilterLabel for labeling bigBed filters diff --git src/hg/lib/hui.c src/hg/lib/hui.c index 0aaa42b..d4ffb3b 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -3634,49 +3634,65 @@ } char *extractFieldName(char *cartVariable, char *filterType) /* Extract field name from a filter cart variable. Variables can either be * <columnName>Filter* or <columnName>.Filter* */ { char *field = cloneString(cartVariable); int ix = strlen(field) - strlen(filterType); field[ix] = '\0'; if (field[ix - 1] == '.') field[ix - 1] = '\0'; return field; } +static char *getLabelSetting(struct cart *cart, struct trackDb *tdb, char *field) +{ +char labelSetting[4096]; +safef(labelSetting, sizeof labelSetting, "%s%s", field, FILTER_LABEL_NAME); +char *trackDbLabel = cartOrTdbString(cart, tdb, labelSetting, NULL); +if (trackDbLabel == NULL) + { + safef(labelSetting, sizeof labelSetting, "%s.%s", field, FILTER_LABEL_NAME); + trackDbLabel = cartOrTdbString(cart, tdb, labelSetting, NULL); + } +return trackDbLabel; +} + filterBy_t *buildFilterBy(struct trackDb *tdb, struct cart *cart, struct asObject *as, char *filterName, char *name) /* Build a filterBy_t structure from a <column>FilterValues statement. */ { char *field = extractFieldName(filterName, FILTER_VALUES_NAME); char *setting = trackDbSetting(tdb, filterName); if (isEmpty(setting)) errAbort("FilterValues setting of field '%s' must have a value.", field); char *value = cartUsualStringClosestToHome(cart, tdb, FALSE, filterName, setting); filterBy_t *filterBy; AllocVar(filterBy); filterBy->column = field; filterBy->title = field; /// title should come from AS file, or trackDb variable struct asColumn *asCol = asColumnFind(as, field); if (asCol != NULL) filterBy->title = asCol->comment; else errAbort("Building filter on field %s which is not in AS file.", field); +char *trackDbLabel = getLabelSetting(cart, tdb, field); +if (trackDbLabel) + filterBy->title = trackDbLabel; filterBy->useIndex = FALSE; filterBy->slValues = slNameListFromCommaEscaped(value); chopUpValues(filterBy); if (cart != NULL) { char suffix[256]; safef(suffix, sizeof(suffix), "%s.%s", "filterBy", filterBy->column); boolean parentLevel = isNameAtParentLevel(tdb,tdb->track); if (cartLookUpVariableClosestToHome(cart,tdb,parentLevel,suffix,&(filterBy->htmlName))) { filterBy->slChoices = cartOptionalSlNameList(cart,filterBy->htmlName); freeMem(filterBy->htmlName); } } @@ -6083,48 +6099,54 @@ if (!isHubTrack(db)) conn = hAllocConnTrack(db, tdb); struct asObject *as = asForTdb(conn, tdb); hFreeConn(&conn); while ((filter = slPopHead(&filterSettings)) != NULL) { if (differentString(filter->name,NO_SCORE_FILTER)) { // Determine floating point or integer char *setting = trackDbSetting(tdb, filter->name); boolean isFloat = (strchr(setting,'.') != NULL); char *scoreName = cloneString(filter->name); char *field = extractFieldName(filter->name, FILTER_NUMBER_NAME); + char *trackDbLabel = getLabelSetting(cart, tdb, field); if (as != NULL) { struct asColumn *asCol = asColumnFind(as, field); if (asCol != NULL) { // Found label so replace field field = asCol->comment; if (!isFloat) isFloat = asTypesIsFloating(asCol->lowType->type); } else errAbort("Building filter on field %s which is not in AS file.", field); } char varName[256]; - char label[128]; + char labelBuf[1024]; + char *label = labelBuf; safef(varName, sizeof(varName), "%s%s", scoreName, _BY_RANGE); boolean filterByRange = trackDbSettingClosestToHomeOn(tdb, varName); - safef(label, sizeof(label),"%s%s", filterByRange ? "": "Minimum ", field); + + if (trackDbLabel) + label = trackDbLabel; + else + safef(labelBuf, sizeof(labelBuf),"%s%s", filterByRange ? "": "Minimum ", field); showScoreFilter(cart,tdb,opened,boxed,parentLevel,name,title,label,scoreName,isFloat); freeMem(scoreName); count++; } slNameFree(&filter); } if (as != NULL) asObjectFree(&as); } if (count > 0) puts("</TABLE>"); return count; }