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("&nbsp; <B> Show only items in top-scoring </B>");
     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("&nbsp; (range: 1 to 100,000 total items: %d)\n",getTableSize(db, tdb->table));
     else
         printf("&nbsp; (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("<p><b>Filter by chromosome (e.g. chr10):</b> ");
+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("<p><b>Color track based on chromosome:</b> ");
+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("<br><br>");
+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  "<B><A HREF=\"#a_cfg_%s\" onclick=\"return (showConfigControls('%s') == false);\" title=\"%s Configuration\">%s</A><INPUT TYPE=HIDDEN NAME='%s.%s.showCfg' value='%s'></B>"
 #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("<B>Select %s</B> (<A HREF='../goldenPath/help/multiView.html' title='Help on views' TARGET=_BLANK>help</A>):\n", membersOfView->groupTitle);
 printf("<TABLE><TR style='text-align:left;'>\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("<TD>");
         if(configurable[ix] != cfgNone)
             {
             MAKE_CFG_LINK(membersOfView->tags[ix],membersOfView->titles[ix],parentTdb->track,(firstOpened == ix));
             }
         else
             printf("<B>%s</B>",membersOfView->titles[ix]);
         puts("</TD>");
 
         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("<TD>");
         safef(classes, sizeof(classes), "viewDD normalText %s", membersOfView->tags[ix]);
         hTvDropDownClassWithJavascript(varName, tv, parentTdb->canPack,classes,javascript);
         puts(" &nbsp; &nbsp; &nbsp;</TD>");
         }
     }
 puts("</TR>");
 
 // Make row of cfg boxes if needed
 if(makeCfgRows)
     {
     puts("</TABLE><TABLE>");
     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("<TR id=\"tr_cfg_%s\"", viewName);
             if((firstOpened == -1 && !compositeViewCfgExpandedByDefault(parentTdb,membersOfView->tags[ix],NULL))
                 || (firstOpened != -1 && firstOpened != ix))
                 printf(" style=\"display:none\"");
             printf("><TD width=10>&nbsp;</TD>");
             int ix2=ix;
             while(0 < ix2--)
                 printf("<TD width=100>&nbsp;</TD>");
             printf("<TD colspan=%d>",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("</TABLE>");
-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;