2704a613e0835e7cb815963c792a40e4627b4b8d
tdreszer
  Mon Feb 6 16:20:27 2012 -0800
Subtracks were sometimes seen in the image even though they are not checked.  Fix for redmine 2375
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index e2027f2..76141b9 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -7374,39 +7374,42 @@
         if (subtrackOverride != NULL && tdbIsContainerChild(tdb))
             *subtrackOverride = TRUE;
         }
     }
 return vis;
 }
 
 enum trackVisibility tdbVisLimitedByAncestors(struct cart *cart, struct trackDb *tdb, boolean checkBoxToo, boolean foldersToo)
 // returns visibility limited by ancestry.  This includes subtrack vis override and parents limit maximum.
 // cart may be null, in which case, only trackDb settings (default state) are examined
 // checkBoxToo means ensure subtrack checkbox state is visible
 // foldersToo means limit by folders (aka superTracks) as well.
 {
 boolean subtrackOverride = FALSE;
 enum trackVisibility vis = tdbLocalVisibility(cart,tdb,&subtrackOverride);
-if (subtrackOverride)
-    return vis;
 
-// subtracks without explicit (cart) vis but are selected, should get inherited vis
 if (tdbIsContainerChild(tdb))
     {
-    if (!checkBoxToo || fourStateVisible(subtrackFourStateChecked(tdb,cart)))
-        vis = tvFull; // to be limited by ancestry
+    // subtracks without explicit (cart) vis but are selected, should get inherited vis
+    if (!subtrackOverride)
+        vis = tvFull;
+    // subtracks with checkbox that says no, are stopped cold
+    if (checkBoxToo && !fourStateVisible(subtrackFourStateChecked(tdb,cart)))
+        vis = tvHide; // Checkbox says no
     }
+if (subtrackOverride)
+    return vis;
 
 if (vis == tvHide || tdb->parent == NULL || (!foldersToo && tdbIsFolder(tdb->parent)))  // aka superTrack
     return vis; // end of line
 
 return tvMin(vis,tdbVisLimitedByAncestors(cart,tdb->parent,checkBoxToo,foldersToo));
 }
 
 char *compositeViewControlNameFromTdb(struct trackDb *tdb)
 /* Returns a string with the composite view control name if one exists */
 {
 char *stView   = NULL;
 char *name     = NULL;
 char *rootName = NULL;
 // This routine should give these results: compositeName.viewName or else subtrackName.viewName or else compositeName or else subtrackName
 if(tdbIsCompositeChild(tdb) == TRUE && trackDbLocalSetting(tdb, "parent") != NULL)