b5972d8ddeddbca1b26e0f295c9325a23fbe6f40
tdreszer
  Fri Sep 17 16:40:14 2010 -0700
SuperTracks may have superpowers, but still should avoiding cloning kids.
diff --git src/hg/lib/cart.c src/hg/lib/cart.c
index 6644ce4..c857e49 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -2097,7 +2097,6 @@
 if (vis != visOrig)
     {
     cartSetString(cart,setting,hStringFromTv(vis));
-    //warn("Set %s to %s",(view?view:parent->track),hStringFromTv(vis));
 
     // Now set all subtracks that inherit vis back to visOrig
     struct slRef *refSub;
@@ -2121,13 +2120,9 @@
                 }
             }
         }
-    //warn("Altered %d subtrack(s) for %s",count,(view?view:parent->track));
 
     if (tdbIsCompositeView(parent))
-        {
         cartSetString(cart,parent->parent->track,"full");    // Now set composite to full.
-        //warn("Set composite %s to full",tdbComposite->track);
-        }
     }
 return count;
 }
@@ -2186,7 +2181,6 @@
     }
 if (slCount(subVisVars) == 0)
     {
-    //warn("No subtrack vis found.");
     slFreeList(&tdbRefList);
     return FALSE;
     }
@@ -2256,7 +2250,6 @@
     }
 else // If no views then composite is not set to fuul but to max of subtracks
     count = cartTdbParentShapeVis(cart,tdbComposite,NULL,tdbRefList,subVisVars,compositeAtDefault);
-//warn("Altered %d subtrack(s)",count);
 
 slFreeList(&tdbRefList);
 slFreeList(&subVisVars);
@@ -2264,12 +2257,63 @@
 #endif/// defined(COMPOSITE_VIS_SHAPING_PLAN_A) || defined(COMPOSITE_VIS_SHAPING_PLAN_B)
 }
 
+static boolean cartTdbOverrideSuperTracks(struct trackDb *tdb,struct cart *cart)
+/* When when the child of a hidden supertrack is foudn and selected, then shape the supertrack accordingly
+   Returns TRUE if any cart changes are made */
+{
+// This is only pertinent to supertrack children just turned on
+if (!tdbIsSuperTrackChild(tdb))
+    return FALSE;
+
+// Must be from having just selected the track in findTracks.  This will carry with it the "_sel" setting.
+char setting[512];
+safef(setting,sizeof(setting),"%s_sel",tdb->track);
+if (!cartVarExists(cart,setting))
+    return FALSE;
+cartRemove(cart,setting); // Unlike composite subtracks, supertrack children keep the "_sel" setting only for detecting this moment
+
+// if parent is not hidden then nothing to do
+assert(tdb->parent != NULL && tdbIsSuperTrack(tdb->parent));
+enum trackVisibility vis = tdbVisLimitedByAncestry(cart, tdb->parent, FALSE);
+if (vis != tvHide)
+    return FALSE;
+
+// Now turn all other supertrack children to hide and the supertrack to visible
+struct slRef *childRef;
+for(childRef = tdb->parent->children;childRef != NULL; childRef = childRef->next)
+    {
+    struct trackDb *child = childRef->val;
+    if (child == tdb)
+        continue;
+
+    // Make sure this chile hasn't also just been turned on!
+    safef(setting,sizeof(setting),"%s_sel",child->track);
+    if (cartVarExists(cart,setting))
+        {
+        cartRemove(cart,setting); // Unlike composite subtracks, supertrack children keep the "_sel" setting only for detecting this moment
+        continue;
+        }
+
+    // hide this sibling if not already hidden
+    vis = child->visibility;
+    char *cartVis = cartOptionalString(cart,child->track);
+    if (cartVis != NULL)
+        vis = hTvFromString(cartVis);
+    if (vis != tvHide)
+        cartSetString(cart,child->track,"hide");
+    }
+// and finally show the parent
+cartSetString(cart,tdb->parent->track,"show");
+return TRUE;
+}
+
 boolean cartTdbTreeCleanupOverrides(struct trackDb *tdb,struct cart *newCart,struct hash *oldVars)
 /* When composite/view settings changes, remove subtrack specific settings
    Returns TRUE if any cart vars are removed */
 {
+boolean anythingChanged = cartTdbOverrideSuperTracks(tdb,newCart);
 if (!tdbIsComposite(tdb))
-    return FALSE;
+    return anythingChanged;
 
 // vis is a special additive case! composite or view level changes then remove subtrack vis
 boolean compositeVisChanged = cartValueHasChanged(newCart,oldVars,tdb->track,TRUE,TRUE);
@@ -2278,16 +2322,6 @@
 char * var = NULL;
 int clensed = 0;
 
-// 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: %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 and views
 char setting[512];
 safef(setting,sizeof(setting),"%s.",tdb->track);
@@ -2304,18 +2338,14 @@
     changedSettings = slCat(changedSettings, changeViewSettings);
     }
 if (changedSettings == NULL && !compositeVisChanged)
-    return FALSE;
+    return anythingChanged;
 
 // Prune list to only those which have changed
 if(changedSettings != NULL)
     {
-    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));
+        return anythingChanged;
     }
 
 // Walk through views
@@ -2376,10 +2406,8 @@
         clensed++;
     }
 
-if (debug)
-    warn("Cleaned up %d composite%s settings",clensed,hasViews?"/view":"");
-
-return (clensed > 0);
+anythingChanged = (anythingChanged || (clensed > 0));
+return anythingChanged;
 }