ac96ec4ed3d2e088a485dd54ffb89cddcbbbe3c3
tdreszer
  Thu Aug 12 17:15:27 2010 -0700
Extended limitedVisFromComposite() because findTracks calls it when composite itself is hidden
diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index af695f1..71d8d4d 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -1555,11 +1555,7 @@
 #ifdef SUBTRACKS_HAVE_VIS
 if (tdbIsCompositeChild(subtrack->tdb))
     {
-    char setting[512];
-    safef(setting,sizeof(setting),"%s_sel",subtrack->track);  // Must have "{trackName}_sel" to use subtrack level vis!
-    // FIXME: four state logic is for subtracks only and exists as static in hui.c.  When time is right, make this logic non-static
-    #define FOURSTATE_CHECKED           1
-    if (FOURSTATE_CHECKED == cartUsualInt(cart, setting, 0)) // Don't need all 4 states here.  Just checked/not
+    if (fourStateVisible(subtrackFourStateChecked(subtrack->tdb,cart))) // Don't need all 4 states here.  Visible=checked&&enabled
         {
         char *var = cartOptionalString(cart, subtrack->track);
         if (var)
@@ -1575,10 +1571,11 @@
 
                 limitVisibility(subtrack);
                 }
-
             return hTvFromString(var);
             }
         }
+    else
+        return tvHide;
     }
 #endif///def SUBTRACKS_HAVE_VIS
 
@@ -1588,22 +1585,28 @@
 struct trackDb *tdb = subtrack->tdb;
 if(tdbIsCompositeChild(tdb))
     {
+    struct trackDb *parentTdb = trackDbCompositeParent(tdb);
+    assert(parentTdb != NULL);
+    struct track *parentTrack = tdbExtrasGetOrDefault(parentTdb,"track",NULL);
+    assert(parentTrack != NULL);
+    vis = tvMin(vis,(parentTrack->limitedVisSet?parentTrack->limitedVis:parentTrack->visibility));
+    if (vis == tvHide) // short curcuit this effort
+        return vis;
+
     char *viewName = NULL;
     if (subgroupFind(tdb,"view",&viewName))
 	{
-	struct trackDb *parent = trackDbCompositeParent(tdb);
-	assert(parent != NULL);
-        int len = strlen(parent->track) + strlen(viewName) + 10;
+        int len = strlen(parentTdb->track) + strlen(viewName) + 10;
 
 	// Create the view dropdown var name.  This needs to have the view name surrounded by dots
 	// in the middle for the javascript to work.
 	char ddName[len];
-        safef(ddName,len,"%s.%s.vis", parent->track,viewName);
+        safef(ddName,len,"%s.%s.vis", parentTdb->track,viewName);
         char * fromParent = cartOptionalString(cart, ddName);
         if(fromParent)
-            vis = hTvFromString(fromParent);
+            vis = tvMin(vis,hTvFromString(fromParent));
         else
-            vis = visCompositeViewDefault(parent,viewName);
+            vis = tvMin(vis,visCompositeViewDefault(parentTdb,viewName));
         subgroupFree(&viewName);
 	}
     }