6e57bd7dddafb83f609a22cba99c47c97fb506d9
tdreszer
  Thu Sep 9 09:09:18 2010 -0700
hgTrackUi can now use ajax to update composite/view settings, which enables keeping subtrack level v. composite/view level settings properly influencing each other.  That is, timing is important in ensuring that composite/view level changes overrides subtrack level settings.  The triggers for this code in hui.c are all ifdef'd on SUBTRACK_CFG_POPUP.
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 1c860f4..09a8a85 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -47,6 +47,7 @@
 #define ENCODE_DCC_DOWNLOADS "encodeDCC"
 
 //#define SUBTRACK_CFG_POPUP
+//#define BAM_CFG_UI_CHANGES
 // TODO: For subtrack cfg and integration with right-click and subtrack level vis:
 /*
 1) Composite/view level settings should be ajaxed over upon change
@@ -972,7 +973,10 @@
 			baseColorDrawAllOptionValues,
 			ArraySize(baseColorDrawAllOptionLabels),
 			curValue, NULL);
-    printf("<BR><A HREF=\"%s\">Help on mRNA coloring</A><BR>",
+#ifndef BAM_CFG_UI_CHANGES
+    printf("<BR>");
+#endif///ndef BAM_CFG_UI_CHANGES
+    printf("<A HREF=\"%s\">Help on mRNA coloring</A><BR>",
 	   CDS_MRNA_HELP_PAGE);
     }
 else if (gotCds)
@@ -982,7 +986,10 @@
 			baseColorDrawGenomicOptionValues,
 			ArraySize(baseColorDrawGenomicOptionLabels),
 			curValue, NULL);
-    printf("<BR><A HREF=\"%s\">Help on codon coloring</A><BR>",
+#ifndef BAM_CFG_UI_CHANGES
+    printf("<BR>");
+#endif///ndef BAM_CFG_UI_CHANGES
+    printf("<A HREF=\"%s\">Help on codon coloring</A><BR>",
 	   CDS_HELP_PAGE);
     }
 else if (gotSeq)
@@ -992,7 +999,10 @@
 			baseColorDrawItemOptionValues,
 			ArraySize(baseColorDrawItemOptionLabels),
 			curValue, NULL);
-    printf("<BR><A HREF=\"%s\">Help on base coloring</A><BR>",
+#ifndef BAM_CFG_UI_CHANGES
+    printf("<BR>");
+#endif///ndef BAM_CFG_UI_CHANGES
+    printf("<A HREF=\"%s\">Help on base coloring</A><BR>",
 	   CDS_BASE_HELP_PAGE);
     }
 }
@@ -1037,6 +1047,30 @@
     boolean showDoubleInsert, showQueryInsert, showPolyA;
     char var[512];
     indelEnabled(cart, tdb, 0.0, &showDoubleInsert, &showQueryInsert, &showPolyA);
+#ifdef BAM_CFG_UI_CHANGES
+    printf("<TABLE><TR><TD colspan=2><B>Alignment Gap/Insertion Display Options</B>");
+    printf("&nbsp;<A HREF=\"%s\">Help on display options</A>\n<TR valign='top'><TD>",
+           INDEL_HELP_PAGE);
+    safef(var, sizeof(var), "%s_%s", INDEL_DOUBLE_INSERT, tdb->track);
+    cgiMakeCheckBox(var, showDoubleInsert);
+    printf("</TD><TD>Draw double horizontal lines when both genome and query have "
+           "an insertion</TD></TR>\n<TR valign='top'><TD>");
+    safef(var, sizeof(var), "%s_%s", INDEL_QUERY_INSERT, tdb->track);
+    cgiMakeCheckBox(var, showQueryInsert);
+    printf("</TD><TD>Draw a vertical purple line for an insertion at the beginning or "
+           "end of the <BR>query, orange for insertion in the middle of the query</TD></TR>\n<TR valign='top'><TD>");
+    safef(var, sizeof(var), "%s_%s", INDEL_POLY_A, tdb->track);
+    /* We can highlight valid polyA's only if we have query sequence --
+     * so indelPolyA code piggiebacks on baseColor code: */
+    if (baseColorGotSequence(tdb))
+        {
+        cgiMakeCheckBox(var, showPolyA);
+        printf("</TD><TD>Draw a vertical green line where query has a polyA tail "
+               "insertion</TD></TR>\n");
+        }
+
+    printf("</TABLE>\n");
+#else///ifndef BAM_CFG_UI_CHANGES
     printf("<P><B>Alignment Gap/Insertion Display Options</B><BR>\n");
     safef(var, sizeof(var), "%s_%s", INDEL_DOUBLE_INSERT, tdb->track);
     cgiMakeCheckBox(var, showDoubleInsert);
@@ -1062,6 +1096,7 @@
     printf("<A HREF=\"%s\">Help on alignment gap/insertion display options</A>"
 	   "<BR>\n",
 	   INDEL_HELP_PAGE);
+#endif///ndef BAM_CFG_UI_CHANGES
     }
 }
 
@@ -3683,11 +3718,15 @@
 return date;
 }
 
-static void cfgLinkToDependentCfgs(struct trackDb *tdb,char *prefix)
+static void cfgLinkToDependentCfgs(struct cart *cart, struct trackDb *tdb,char *prefix)
 /* Link composite or view level controls to all associateled lower level controls */
 {
-if(tdbIsComposite(tdb)) // FIXME: Only when some subtracks are configurable
+if (!cartVarExists(cart, "ajax") && tdbIsComposite(tdb))
+#ifdef SUBTRACK_CFG_POPUP
+    printf("<script type='text/javascript'>registerViewOnchangeAction('%s')</script>\n",prefix);
+#else///ifndef SUBTRACK_CFG_POPUP
     printf("<script type='text/javascript'>compositeCfgRegisterOnchangeAction(\"%s\")</script>\n",prefix);
+#endif///ndef SUBTRACK_CFG_POPUP
 }
 
 static void compositeUiSubtracks(char *db, struct cart *cart, struct trackDb *parentTdb,
@@ -3703,7 +3742,9 @@
 char *colors[2]   = { COLOR_BG_DEFAULT,
                       COLOR_BG_ALTDEFAULT };
 int colorIx = COLOR_BG_DEFAULT_IX; // Start with non-default allows alternation
+#ifndef SUBTRACK_CFG_POPUP
 boolean dependentCfgsNeedBinding = FALSE;
+#endif///ndef SUBTRACK_CFG_POPUP
 
 // Get list of leaf subtracks to work with
 struct slRef *subtrackRef, *subtrackRefList = trackDbListGetRefsToDescendantLeaves(parentTdb->subtracks);
@@ -4009,8 +4050,10 @@
 puts("<P>");
 if (!primarySubtrack)
     puts("<script type='text/javascript'>matInitializeMatrix();</script>");
+#ifndef SUBTRACK_CFG_POPUP
 if(dependentCfgsNeedBinding)
-    cfgLinkToDependentCfgs(parentTdb,parentTdb->track);
+    cfgLinkToDependentCfgs(cart,parentTdb,parentTdb->track);
+#endif//ndef SUBTRACK_CFG_POPUP
 membersForAllSubGroupsFree(parentTdb,&membersForAll);
 dyStringFree(&dyHtml)
 sortOrderFree(&sortOrder);
@@ -4064,7 +4107,7 @@
     char *view = tdbGetViewName(tdb);
     if(view != NULL)
         printf(" %s",view);
-    printf("' bgcolor=\"%s\" borderColor=\"%s\"><TR><TD align='RIGHT'>", COLOR_BG_ALTDEFAULT, COLOR_BG_ALTDEFAULT);
+    printf("' bgcolor=\"%s\" borderColor=\"%s\"><TR><TD>", COLOR_BG_ALTDEFAULT, COLOR_BG_ALTDEFAULT);
     if (title)
         printf("<CENTER><B>%s Configuration</B></CENTER>\n", title);
     }
@@ -5462,6 +5505,33 @@
 {
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 char cartVarName[1024];
+
+#ifdef BAM_CFG_UI_CHANGES
+printf("<TABLE%s><TR><TD>",boxed?" width='100%'":"");
+char *tdbShowNames = trackDbSetting(tdb, BAM_SHOW_NAMES);
+safef(cartVarName, sizeof(cartVarName), "%s.%s", name, BAM_SHOW_NAMES);
+cartMakeCheckBox(cart, cartVarName, !sameOk(tdbShowNames, "off"));
+printf("</TD><TD>Display read names</TD>");
+if (boxed && fileExists(hHelpFile("hgBamTrackHelp")))
+    printf("<TD style='text-align:right'><A HREF=\"../goldenPath/help/hgBamTrackHelp.html\" TARGET=_BLANK>BAM "
+           "configuration help</A></TD>");
+printf("</TR>\n");
+boolean canPair = (trackDbSetting(tdb, BAM_PAIR_ENDS_BY_NAME) != NULL);
+if (canPair)
+    {
+    printf("<TR><TD>");
+    safef(cartVarName, sizeof(cartVarName), "%s." BAM_PAIR_ENDS_BY_NAME, name);
+    cartMakeCheckBox(cart, cartVarName, TRUE);
+    printf("</TD><TD>Attempt to join paired end reads by name\n");
+    //puts("<BR>");
+    }
+printf("<TR><TD colspan=2>Minimum alignment quality:\n");
+safef(cartVarName, sizeof(cartVarName), "%s." BAM_MIN_ALI_QUAL, name);
+cartMakeIntVar(cart, cartVarName,
+               atoi(trackDbSettingOrDefault(tdb, BAM_MIN_ALI_QUAL, BAM_MIN_ALI_QUAL_DEFAULT)), 4);
+printf("</TD></TR></TABLE>");
+
+#else///nef BAM_CFG_UI_CHANGES
 puts("<BR>");
 printf("<B>Display read names:</B>\n");
 char *tdbShowNames = trackDbSetting(tdb, BAM_SHOW_NAMES);
@@ -5481,6 +5551,8 @@
 cartMakeIntVar(cart, cartVarName,
 	       atoi(trackDbSettingOrDefault(tdb, BAM_MIN_ALI_QUAL, BAM_MIN_ALI_QUAL_DEFAULT)), 4);
 puts("<BR>");
+#endif///ndef BAM_CFG_UI_CHANGES
+
 if (isCustomTrack(name))
     {
     // Auto-magic baseColor defaults for BAM, same as in hgTracks.c newCustomTrack
@@ -5490,6 +5562,9 @@
     hashAdd(tdb->settingsHash, "showDiffBasesMaxZoom", cloneString("100"));
     }
 baseColorDrawOptDropDown(cart, tdb);
+#ifdef BAM_CFG_UI_CHANGES
+puts("<BR>");
+#endif///def BAM_CFG_UI_CHANGES
 indelShowOptions(cart, tdb);
 printf("<BR>\n");
 printf("<B>Additional coloring modes:</B><BR>\n");
@@ -5523,11 +5598,18 @@
     printf("<BR>\n");
     }
 cgiMakeRadioButton(cartVarName, BAM_COLOR_MODE_OFF, sameString(selected, BAM_COLOR_MODE_OFF));
-printf("No additional coloring<BR>\n");
+printf("No additional coloring");
+#ifndef BAM_CFG_UI_CHANGES
+printf("<BR>\n");
+#endif///ndef BAM_CFG_UI_CHANGES
 
 //TODO: include / exclude flags
 
+#ifdef BAM_CFG_UI_CHANGES
+if (!boxed && fileExists(hHelpFile("hgBamTrackHelp")))
+#else///ifndef BAM_CFG_UI_CHANGES
 if (fileExists(hHelpFile("hgBamTrackHelp")))
+#endif///ndef BAM_CFG_UI_CHANGES
     printf("<P><A HREF=\"../goldenPath/help/hgBamTrackHelp.html\" TARGET=_BLANK>BAM "
 	   "configuration help</A></P>");
 
@@ -5696,7 +5778,7 @@
                 {
                 cfgByCfgType(configurable[ix],db,cart,view->subtracks,varName,
                         membersOfView->titles[ix],TRUE);
-                cfgLinkToDependentCfgs(parentTdb,varName);
+                cfgLinkToDependentCfgs(cart,parentTdb,varName);
                 }
             }
         }
@@ -6493,7 +6575,7 @@
 boolean isMatrix = dimensionsExist(tdb);
 boolean viewsOnly = FALSE;
 
-if(cartOptionalString(cart, "ajax") == NULL)
+if (!cartVarExists(cart, "ajax"))
     {
     if(trackDbSetting(tdb, "dragAndDrop") != NULL)
         jsIncludeFile("jquery.tablednd.js", NULL);
@@ -6507,6 +6589,7 @@
 #ifdef SUBTRACK_CFG_POPUP
 printf("<div id='popit' style='display: none'></div>");
 cgiMakeHiddenVar("db", db);
+printf("<input type=HIDDEN id='track' value='%s';</input>\n",tdb->track);
 #endif
 puts("<P>");
 if (trackDbCountDescendantLeaves(tdb) < MANY_SUBTRACKS && !hasSubgroups)
@@ -6540,6 +6623,11 @@
             hCompositeUiByMatrix(db, cart, tdb, formName);
 	    }
         }
+#ifdef SUBTRACK_CFG_POPUP
+    if(primarySubtrack == NULL)
+        cfgLinkToDependentCfgs(cart,tdb,tdb->track);  // Must be after views are set up to get view vis
+    printf("<script type='text/javascript'>registerFormSubmit('mainForm');</script>\n");
+#endif
     }
 
 cartSaveSession(cart);