c5d4303120891ad38c855d560c94b1db76d5f038
tdreszer
  Thu Jul 8 14:50:16 2010 -0700
Remove subtrack level vis override when composite or view vis comes in.
diff --git src/hg/lib/cart.c src/hg/lib/cart.c
index 4b730b0..279140c 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -324,8 +324,6 @@
             }
         }
     }
-
-// subtrack settings overridden by more recent view or composite level settings (HOW?)
 }
 
 static void loadCgiOverHash(struct cart *cart, struct hash *oldVars)
@@ -1911,3 +1909,37 @@
     return atof(a);
 }
 
+
+boolean cartValueHasChanged(struct cart *newCart,struct hash *oldVars,char *setting,boolean ignoreRemoved)
+/* Returns TRUE if new cart setting has changed from old cart setting */
+{
+char *newValue = cartOptionalString(newCart,setting);
+char *oldValue = hashFindVal(oldVars,setting);
+
+if (newValue == NULL)
+    return (!ignoreRemoved && oldValue != NULL);
+if (oldValue == NULL)
+    return FALSE;  // FIXME: This seems strange but it is what works in practice.
+return (differentString(newValue,oldValue));
+}
+
+
+void cartRemoveFromTdbTree(struct cart *cart,struct trackDb *tdb,char *suffix,boolean skipParent)
+/* Removes a 'trackName.suffix' from all tdb descendents (but not parent).
+   If suffix NULL then removes 'trackName' which holds visibility */
+{
+struct slRef *tdbRef, *tdbRefList = trackDbListGetRefsToDescendants(skipParent?tdb->subtracks:tdb);
+for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
+    {
+    struct trackDb *descendentTdb = tdbRef->val;
+    char settingName[512];  // wgEncodeOpenChromChip.Peaks.vis
+    if (suffix != NULL)
+        safef(settingName,sizeof(settingName),"%s.%s",descendentTdb->track,suffix);
+    else
+        safef(settingName,sizeof(settingName),"%s",descendentTdb->track);
+    cartRemove(cart,settingName);
+    }
+}
+
+
+