4e91fbccad6b04384ba5792bce44f933b5a1c1ff tdreszer Tue Oct 4 11:56:27 2011 -0700 Further fixes to the cfgByType consistency logic, prompted by side by side comparisons on hg18 tracks. diff --git src/hg/lib/hui.c src/hg/lib/hui.c index 3a38892..defb9b3 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -4962,34 +4962,74 @@ cgiMakeCheckBox(option, doScoreCtFilter); safef(option, sizeof(option), "%s.filterTopScorersCt", name); scoreFilterCt = cartUsualStringClosestToHome(cart, tdb, compositeLevel, "filterTopScorersCt", words[1]); puts("  Show only items in top-scoring "); cgiMakeIntVarWithLimits(option,atoi(scoreFilterCt),"Top-scoring count",0,1,100000); /* Only check size of table if track does not have subtracks */ if ( !compositeLevel && hTableExists(db, tdb->table)) printf("  (range: 1 to 100,000 total items: %d)\n",getTableSize(db, tdb->table)); else printf("  (range: 1 to 100,000)\n"); } cfgEndBox(boxed); } +// Moved from hgTrackUi for consistency +static void filterByChromCfgUi(struct cart *cart, struct trackDb *tdb) +{ +char *filterSetting; +char filterVar[256]; +char *filterVal = ""; + +printf("

Filter by chromosome (e.g. chr10): "); +snprintf(filterVar, sizeof(filterVar), "%s.chromFilter", tdb->track); +filterSetting = cartUsualString(cart, filterVar, filterVal); +cgiMakeTextVar(filterVar, cartUsualString(cart, filterVar, ""), 15); +} + +// Moved from hgTrackUi for consistency +void crossSpeciesCfgUi(struct cart *cart, struct trackDb *tdb) +// Put up UI for selecting rainbow chromosome color or intensity score. +{ +char colorVar[256]; +char *colorSetting; +// 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: "); +snprintf(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); +} + 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 (wordCount == 3 && sameWord(words[1], "xeno")) + crossSpeciesCfgUi(cart,tdb); baseColorDropLists(cart, tdb, name); indelShowOptionsWithName(cart, tdb, name); cfgEndBox(boxed); } void netAlignCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *prefix, char *title, boolean boxed) /* Put up UI for net tracks */ { boxed = cfgBeginBoxAndTitle(tdb, boxed, title); boolean compositeLevel = isNameAtCompositeLevel(tdb,prefix); enum netColorEnum netColor = netFetchColorOption(cart, tdb, compositeLevel); @@ -6013,128 +6053,127 @@ return view; } return NULL; } static boolean hCompositeDisplayViewDropDowns(char *db, struct cart *cart, struct trackDb *parentTdb) /* UI for composite view drop down selections. */ { int ix; char varName[SMALLBUF]; char classes[SMALLBUF]; char javascript[JBUFSIZE]; #define CFG_LINK "%s" #define MAKE_CFG_LINK(name,title,tbl,open) printf(CFG_LINK, (name),(name),(title),(title),(tbl),(name),((open)?"on":"off")) -members_t *membersOfView = subgroupMembersGet(parentTdb,"view"); +membersForAll_t *membersForAll = membersForAllSubGroupsGet(parentTdb, cart); // membersForAll is generated once per track, then cached +members_t *membersOfView = membersForAll->members[dimV]; if(membersOfView == NULL) return FALSE; char configurable[membersOfView->count]; memset(configurable,cfgNone,sizeof(configurable)); int firstOpened = -1; boolean makeCfgRows = FALSE; -struct trackDb **matchedSubtracks = needMem(sizeof(struct trackDb *)*membersOfView->count); +struct trackDb **matchedViewTracks = needMem(sizeof(struct trackDb *)*membersOfView->count); for (ix = 0; ix < membersOfView->count; ix++) { char *viewName = membersOfView->tags[ix]; - struct trackDb *view = rFindView(parentTdb->subtracks, viewName); - if (view != NULL) + if (membersOfView->subtrackList != NULL && membersOfView->subtrackList[ix] != NULL) { - matchedSubtracks[ix] = view; - configurable[ix] = (char)cfgTypeFromTdb(view->subtracks, TRUE); + struct trackDb *subtrack = membersOfView->subtrackList[ix]->val; + matchedViewTracks[ix] = subtrack->parent; + configurable[ix] = (char)cfgTypeFromTdb(subtrack, TRUE); if(configurable[ix] != cfgNone) { if(firstOpened == -1) { safef(varName, sizeof(varName), "%s.%s.showCfg", parentTdb->track, viewName); if(cartUsualBoolean(cart,varName,FALSE)) firstOpened = ix; } makeCfgRows = TRUE; } } } toLowerN(membersOfView->groupTitle, 1); printf("Select %s (help):\n", membersOfView->groupTitle); printf("\n"); // Make row of vis drop downs for (ix = 0; ix < membersOfView->count; ix++) { - struct trackDb *view = matchedSubtracks[ix]; char *viewName = membersOfView->tags[ix]; - if (view != NULL) + if (matchedViewTracks[ix] != NULL) { printf(""); safef(varName, sizeof(varName), "%s.%s.vis", parentTdb->track, viewName); enum trackVisibility tv = hTvFromString(cartUsualString(cart, varName,hStringFromTv(visCompositeViewDefault(parentTdb,viewName)))); safef(javascript, sizeof(javascript), "onchange=\"matSelectViewForSubTracks(this,'%s');\" onfocus='this.lastIndex=this.selectedIndex;'", viewName); printf(""); } } puts(""); // Make row of cfg boxes if needed if(makeCfgRows) { puts("
"); if(configurable[ix] != cfgNone) { MAKE_CFG_LINK(membersOfView->tags[ix],membersOfView->titles[ix],parentTdb->track,(firstOpened == ix)); } else printf("%s",membersOfView->titles[ix]); puts(""); safef(classes, sizeof(classes), "viewDD normalText %s", membersOfView->tags[ix]); hTvDropDownClassWithJavascript(varName, tv, parentTdb->canPack,classes,javascript); puts("      
"); for (ix = 0; ix < membersOfView->count; ix++) { - struct trackDb *view = matchedSubtracks[ix]; + struct trackDb *view = matchedViewTracks[ix]; if (view != NULL) { char *viewName = membersOfView->tags[ix]; printf("tags[ix],NULL)) || (firstOpened != -1 && firstOpened != ix)) printf(" style=\"display:none\""); printf(">"); int ix2=ix; while(0 < ix2--) printf(""); printf("
  ",membersOfView->count+1); safef(varName, sizeof(varName), "%s", view->track); if(configurable[ix] != cfgNone) { cfgByCfgType(configurable[ix],db,cart,view->subtracks,varName, membersOfView->titles[ix],TRUE); #ifndef SUBTRACK_CFG cfgLinkToDependentCfgs(cart,parentTdb,varName); #endif///ndef SUBTRACK_CFG } } } } puts("
"); -subgroupMembersFree(&membersOfView); -freeMem(matchedSubtracks); +freeMem(matchedViewTracks); return TRUE; } char *compositeLabelWithVocabLink(char *db,struct trackDb *parentTdb, struct trackDb *childTdb, char *vocabType, char *label) /* If the parentTdb has a controlledVocabulary setting and the vocabType is found, then label will be wrapped with the link to display it. Return string is cloned. */ { char *vocab = trackDbSetting(parentTdb, "controlledVocabulary"); (void)metadataForTable(db,childTdb,NULL); if(vocab == NULL) return cloneString(label); // No wrapping! char *words[15]; int count,ix;