b5972d8ddeddbca1b26e0f295c9325a23fbe6f40
tdreszer
  Fri Sep 17 16:40:14 2010 -0700
SuperTracks may have superpowers, but still should avoiding cloning kids.
diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index be9fed8..9a14203 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -203,7 +203,7 @@
         {
         struct track *track = tr->track;
 	struct trackDb *tdb = track->tdb;
-        if (changeVis == -1)
+        if (changeVis == -1) // to default
                 {
                 if(tdbIsComposite(tdb))
                     {
@@ -240,7 +240,7 @@
                     track->priority = track->defaultPriority;
                     }
                 }
-            else
+            else // to changeVis value (Usually tvHide)
                 {
                 /* change to specified visibility */
                 if (tdbIsSuperTrackChild(tdb))
@@ -258,17 +258,31 @@
                         cartSetString(cart, parentTdb->track,
                                     changeVis == tvHide ? "hide" : "show");
                     }
-                else
+                else // Not super  child
                     {
-                    /* regular track */
                     if (changeVis == tdb->visibility)
                         /* remove if setting to default vis */
                         cartRemove(cart, track->track);
                     else
-                        cartSetString(cart, track->track,
-                                                hStringFromTv(changeVis));
+                        cartSetString(cart, track->track, hStringFromTv(changeVis));
                     track->visibility = changeVis;
                     }
+
+                #ifdef SUBTRACKS_HAVE_VIS
+                // Whether super child or not, if its a composite, then handle the children
+                if (tdbIsComposite(tdb))
+                    {
+                    struct track *subtrack;
+                    for(subtrack=track->subtracks;subtrack!=NULL;subtrack=subtrack->next)
+                        {
+                        if (changeVis == tvHide)
+                            cartRemove(cart, subtrack->track); // Since subtrack level vis is an override, simply remove it to hide it
+                        else
+                            cartSetString(cart, subtrack->track, hStringFromTv(changeVis));
+                        subtrack->visibility = changeVis;
+                        }
+                    }
+                #endif///def SUBTRACKS_HAVE_VIS
                 }
             }
         }
@@ -4232,12 +4246,31 @@
     warn("Unrecognized jsCommand %s", command);
 }
 
-void subtrackCartCleanup(struct track *trackList,struct cart *newCart,struct hash *oldVars)
-/* When composite/view settings changes, remove subtrack specific vis */
+static void parentChildCartCleanup(struct track *trackList,struct cart *newCart,struct hash *oldVars)
+/* When composite/view settings changes, remove subtrack specific vis
+   When superTrackChild is found and selected, shape superTrack to match. */
 {
 struct track *track = trackList;
 for (;track != NULL; track = track->next)
-    cartTdbTreeCleanupOverrides(track->tdb,newCart,oldVars);
+    {
+    if (cartTdbTreeCleanupOverrides(track->tdb,newCart,oldVars))
+        { // Need to update track visibility
+        if (tdbIsSuperTrackChild(track->tdb))
+            {
+            // Unfortunately, since supertracks are not in trackList, this occurs on superChildren,
+            // So now we need to find the supertrack and take changed cart values of its children
+            struct slRef *childRef;
+            for(childRef = track->tdb->parent->children;childRef != NULL;childRef = childRef->next)
+                {
+                struct trackDb * childTdb = childRef->val;
+                struct track *child = hashFindVal(trackHash, childTdb->track);
+                char *cartVis = cartOptionalString(cart,child->track);
+                if (cartVis)
+                    child->visibility = hTvFromString(cartVis);
+                }
+            }
+        }
+    }
 }
 
 void doTrackForm(char *psOutput, struct tempName *ideoTn)
@@ -4302,7 +4335,7 @@
     cartRemoveLike(cart, wildCard);
     }
 #ifdef SUBTRACKS_HAVE_VIS
-subtrackCartCleanup(trackList,cart,oldVars); // Subtrack settings must be removed when composite/view settings are updated
+parentChildCartCleanup(trackList,cart,oldVars); // Subtrack settings must be removed when composite/view settings are updated
 #endif///def SUBTRACKS_HAVE_VIS
 
 /* Honor hideAll and visAll variables */