f1a07a6ccea68ecce8806e980fb8e3445b834896
tdreszer
  Wed Oct 13 21:02:02 2010 -0700
Condensed 2 routines that did the same thing
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 21704ad..99fb34c 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -2082,78 +2082,6 @@
     }
 }
 
-#define TV_HIDE "hide"
-static boolean subtracksViewIsHidden(struct cart *cart,struct trackDb *subtrack)
-// Returns TRUE if the subtrack belongs to a view that is hidden
-{
-if(subgroupFind(subtrack,"view",NULL) == FALSE)
-    return FALSE; // No view
-
-if(subtrack->parent == NULL || subtrack->parent->parent == NULL)
-    return FALSE; // Not the subtrack
-
-char * view = trackDbLocalSetting(subtrack->parent, "view");
-assert(view != NULL);
-
-char objName[SMALLBUF];
-char *setting =trackDbLocalSetting(subtrack->parent, "visibility");
-if(setting == NULL)
-    setting = TV_HIDE;
-
-safef(objName, sizeof(objName), "%s.%s.vis", subtrack->parent->parent->track,view);
-
-setting = cartUsualString(cart, objName, setting); // Not ClosestToHome
-return sameWord(setting,TV_HIDE);
-}
-
-char *tdbResolveVis(struct cart *cart,struct trackDb *tdb, boolean applyMax)
-// Determines the correct vis for a tdb as modified by parent
-{
-// Vis can be in trackDb and/or in cart
-// vis at subtrack overrides higher up
-// no subtrack vis then composite is max applied to view vis
-// FIXME: This should become the main API for determining a subtrack's vis.
-
-char objName[SMALLBUF];
-char *setting = NULL;
-struct trackDb *thisTdb;
-enum trackVisibility vis = tvFull;  // Successively limited
-
-for(thisTdb = tdb;thisTdb != NULL;thisTdb = thisTdb->parent)
-    {
-    setting = trackDbLocalSetting(thisTdb, "visibility");
-    if(setting == NULL && thisTdb->subtracks != NULL)
-        {
-        setting = TV_HIDE;// non-subtrack must default to hide.  subtracks default to NULL
-        // FIXME: If querying for subtrack, need to determine if subtrack checked.
-        //if(tdbIsCompositeChild(tdb))
-        //    {
-        //    char *subSetting = trackDbLocalSetting(tdb, "parent");
-        //    if (subSetting != NULL && findWordByDelimiter("off",' ',subSetting) == NULL)
-        //        setting = "full";// subtrack checked, so default to full and let applyMax do it's trick
-        //    }
-        }
-
-    safef(objName, sizeof(objName), "%s.vis", thisTdb->track);
-    if(thisTdb->parent != NULL && thisTdb->subtracks != NULL) // middle level so probably view
-        {
-        char * view = trackDbLocalSetting(thisTdb, "view");
-        if(view != NULL)
-            safef(objName, sizeof(objName), "%s.%s.vis", thisTdb->parent->track,view);
-        }
-    setting = cartUsualString(cart, objName, setting); // Not ClosestToHome
-    if(setting != NULL && (thisTdb->subtracks == NULL || !applyMax))
-        return setting;  // defined at lowest level so accept it.
-
-    if(setting != NULL && applyMax) // applyMax is assertable if settings is not NULL !
-        vis = tvMin(vis,hTvFromStringNoAbort(setting)); // successively limits
-    }
-assert(setting != NULL);
-assert(applyMax);
-
-return hStringFromTv(vis);
-}
-
 // Four State checkboxes can be checked/unchecked by enable/disabled
 // NOTE: fourState is not a bitmap because it is manipulated in javascript and int seemed easier at the time
 #define FOUR_STATE_KEY               "fourState"
@@ -2179,12 +2107,17 @@
     if(findWordByDelimiter("off",' ',setting) == NULL)
         fourState = FOUR_STATE_CHECKED;
     }
-// Now check visibility
-setting = tdbResolveVis(cart,subtrack,FALSE);
 
-// If subtrack's view is hide then fourstate includes disabled
-if(sameWord(setting,TV_HIDE) && subtracksViewIsHidden(cart,subtrack))
+// Now check visibility
+enum trackVisibility vis = tdbLocalVisibility(cart, subtrack, NULL);
+if (vis == tvHide)
+    {
+    if(tdbIsCompositeView(subtrack->parent))
+        {
+        if(tdbLocalVisibility(cart, subtrack->parent, NULL) == tvHide)
     FOUR_STATE_DISABLE(fourState);
+        }
+    }
 
 safef(objName, sizeof(objName), "%s_sel", subtrack->track);
 fourState = cartUsualInt(cart, objName, fourState);
@@ -6731,18 +6664,24 @@
     return b;
 }
 
-enum trackVisibility tdbVisLimitedByAncestry(struct cart *cart, struct trackDb *tdb, boolean noSupers)
-// returns visibility limited by ancestry (or subtrack vis override)
+enum trackVisibility tdbLocalVisibility(struct cart *cart, struct trackDb *tdb,boolean *subtrackOverride)
+// returns visibility NOT limited by ancestry.  Fills optional boolean if subtrack specific vis is found
+// If not NULL cart will be examined without ClosestToHome.  Folders/supertracks resolve to hide/full
 {
+if (subtrackOverride != NULL)
+*subtrackOverride = FALSE; // default
+
+// tdb->visibility should reflect local trackDb setting
 enum trackVisibility vis = tdb->visibility;
 if (tdbIsSuperTrack(tdb))
     vis = (tdb->isShow ? tvFull : tvHide);
-if (cart != NULL)
+
+if (cart != NULL) // cart is optional
     {
     char *cartVis = NULL;
     if (tdbIsCompositeView(tdb))
         {
-        char *view = trackDbLocalSetting(tdb,"view");
+        char *view = trackDbLocalSetting(tdb,"view"); // views have funky cart setting
         assert(view != NULL);
         char setting[512];
         safef(setting,sizeof(setting),"%s.%s.vis",tdb->parent->track,view);
@@ -6753,24 +6692,35 @@
     if (cartVis != NULL)
         {
         vis = hTvFromString(cartVis);
-        if (tdbIsContainerChild(tdb))
-            return vis; // subtrackVis override
+        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 (vis == tvHide && tdbIsContainerChild(tdb))
     {
-    if (fourStateVisible(subtrackFourStateChecked(tdb,cart)))
-        vis = tvFull;
+    if (checkBoxToo && fourStateVisible(subtrackFourStateChecked(tdb,cart)))
+        vis = tvFull; // to be limited by ancestry
     }
 
-if (vis == tvHide || tdb->parent == NULL)
-    return vis;
+if (vis == tvHide || tdb->parent == NULL || (!foldersToo && tdbIsFolder(tdb->parent)))  // aka superTrack
+    return vis; // end of line
 
-if (noSupers && tdbIsSuperTrack(tdb->parent))
-    return vis;
-return tvMin(vis,tdbVisLimitedByAncestry(cart,tdb->parent,noSupers));
+return tvMin(vis,tdbVisLimitedByAncestors(cart,tdb->parent,checkBoxToo,foldersToo));
 }
 
 char *compositeViewControlNameFromTdb(struct trackDb *tdb)