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/cart.c src/hg/lib/cart.c
index e7d4392..acbbb5a 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -326,6 +326,7 @@
                 {
                 char *name = cloneString(el->name);
                 safecpy(name+suffixOffset,strlen(POSITION_SUFFIX),IMGORD_SUFFIX); // We know that POSITION_SUFFIX is longer than IMGORD_SUFFIX
+                //warn("Removing imgOrd for %s",name);
                 cartRemove(cart, name); // Removes if found
                 freeMem(name);
                 }
@@ -2067,99 +2068,113 @@
 
 // vis is a special additive case! composite or view level changes then remove subtrack vis
 boolean compositeVisChanged = cartValueHasChanged(newCart,oldVars,tdb->track,TRUE,TRUE);
-//boolean compositeVisHidden  = FALSE;
-//if(compositeVisChanged)
-//    compositeVisHidden = (cartUsualInt(cart,tdb->track,tvFull) == tvHide);
-
+struct trackDb *tdbView = NULL;
+struct slRef *oneName = NULL;
+char * var = NULL;
+int clensed = 0;
 
-// FIXME: Big problem in persistence of changed state.
-boolean debug = FALSE;//sameString(tdb->track,"wgEncodeBroadChipSeq");
+// Do some debugging
+boolean debug = FALSE;//sameString(tdb->track,"wgEncodeBroadHistone");
 if(debug)
     {
     char *newValue = cartOptionalString(newCart,tdb->track);
     char *oldValue = hashFindVal(oldVars,tdb->track);
-    warn("Cleanup: wgEncodeBroadChipSeq  compositeVisChanged:%s  new:%s  old:%s",
+    warn("Cleanup: %s  compositeVisChanged:%s  new:%s  old:%s",tdb->track,
          (compositeVisChanged?"yes":"no"),(newValue!=NULL?newValue:"(null)"),(oldValue!=NULL?oldValue:"(null)"));
     }
 
-// Build list of current settings for composite
+// Build list of current settings for composite and views
 char setting[512];
 safef(setting,sizeof(setting),"%s.",tdb->track);
+char * view = NULL;
+boolean hasViews = FALSE;
 struct slRef *changedSettings = cartNamesPrefixedBy(newCart, setting);
+for (tdbView = tdb->subtracks;tdbView != NULL; tdbView = tdbView->next)
+    {
+    if (!tdbIsView(tdbView,&view))
+        break;
+    hasViews = TRUE;
+    safef(setting,sizeof(setting),"%s.",tdbView->track);
+    struct slRef *changeViewSettings = cartNamesPrefixedBy(newCart, setting);
+    changedSettings = slCat(changedSettings, changeViewSettings);
+    }
 if (changedSettings == NULL && !compositeVisChanged)
     return FALSE;
 
 // Prune list to only those which have changed
 if(changedSettings != NULL)
     {
-    if(debug) warn("Cleanup: settings:%d",slCount(changedSettings));
+    if (debug)
+        warn("Cleanup: settings:%d",slCount(changedSettings));
     (void)cartNamesPruneChanged(newCart,oldVars,&changedSettings,TRUE,FALSE);
     if (changedSettings == NULL && !compositeVisChanged)
         return FALSE;
-    if(debug) warn("Cleanup: changed:%d",changedSettings==NULL?0:slCount(changedSettings));
+    if (debug)
+        warn("Cleanup: changed:%d",changedSettings==NULL?0:slCount(changedSettings));
     }
 
-struct slRef *oneName = NULL;
-char * var = NULL;
-boolean clensed = FALSE;
-
 // Walk through views
-boolean hasViews = FALSE;
-struct trackDb *tdbView = tdb->subtracks;
-for (;tdbView != NULL; tdbView = tdbView->next)
+if (hasViews)
+    {
+    for (tdbView = tdb->subtracks;tdbView != NULL; tdbView = tdbView->next)
     {
     boolean viewVisChanged = FALSE;
-//    boolean viewVisHidden  = FALSE;
-    char * view = NULL;
     if (!tdbIsView(tdbView,&view))
         break;
 
-    hasViews = TRUE;
-    safef(setting,sizeof(setting),"%s.%s.",tdb->track,view);
+        safef(setting,   sizeof(setting),"%s.%s.",tdb->track,view); // unfortunatly setting name could be wgEncodeBroadHistone.Sig.???r
+        char settingAlt[512];
+        safef(settingAlt,sizeof(settingAlt),"%s.",tdbView->track);  // or wgEncodeBroadHistoneViewSig.???
     struct slRef *leftOvers = NULL;
     // Walk through settings that match this view
     while ((oneName = slPopHead(&changedSettings)) != NULL)
         {
-        if(!startsWith(setting,oneName->val))
-            slAddHead(&leftOvers,oneName);
+            if(startsWith(setting,oneName->val))
+                var = oneName->val + strlen(setting);
+            else if(startsWith(settingAlt,oneName->val))
+                var = oneName->val + strlen(settingAlt);
         else
             {
-            var = oneName->val + strlen(setting);
+                slAddHead(&leftOvers,oneName);
+                continue;
+                }
+
             if (sameString(var,"vis"))
                 {
                 viewVisChanged = TRUE;
-//                viewVisHidden = (cartUsualInt(cart,oneName->val,tvFull) == tvHide);
-                }
-            else {
-                if (cartRemoveFromTdbTree(newCart,tdbView,var,TRUE) > 0)
-                    clensed = TRUE;
             }
+            else if (cartRemoveFromTdbTree(newCart,tdbView,var,TRUE) > 0)
+                clensed++;
+
             freeMem(oneName);
             }
-        }
     if  (compositeVisChanged || viewVisChanged)
         { // vis is a special additive case!
         if (cartRemoveFromTdbTree(newCart,tdbView,NULL,TRUE) > 0)
-            clensed = TRUE;
+                clensed++;
         }
     changedSettings = leftOvers;
     }
+    }
 
 // Now deal with anything remaining at the composite level
 while ((oneName = slPopHead(&changedSettings)) != NULL)
     {
     var = oneName->val + strlen(tdb->track) + 1;
     if(cartRemoveFromTdbTree(newCart,tdb,var,TRUE) > 0)
-        clensed = TRUE;
+        clensed++;
     freeMem(oneName);
     }
 if  (compositeVisChanged || !hasViews)
     { // vis is a special additive case!
     if (cartRemoveFromTdbTree(newCart,tdb,NULL,TRUE) > 0)
-        clensed = TRUE;
+        clensed++;
     }
 
-return clensed;
+if (debug)
+    warn("Cleaned up %d composite%s settings",clensed,hasViews?"/view":"");
+
+return (clensed > 0);
 }