src/hg/lib/hui.c 1.270

1.270 2010/03/30 05:33:36 tdreszer
Round 2 of fixing 4-state checkbox lookup looking at both defaults and cart.
Index: src/hg/lib/hui.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/hui.c,v
retrieving revision 1.269
retrieving revision 1.270
diff -b -B -U 4 -r1.269 -r1.270
--- src/hg/lib/hui.c	27 Mar 2010 04:26:47 -0000	1.269
+++ src/hg/lib/hui.c	30 Mar 2010 05:33:36 -0000	1.270
@@ -3234,8 +3234,51 @@
 if(tdbIsComposite(tdb))
     printf("<script type='text/javascript'>compositeCfgRegisterOnchangeAction(\"%s\")</script>\n",prefix);
 }
 
+#define TV_HIDE "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;
+
+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.
+
+    safef(objName, sizeof(objName), "%s.vis", thisTdb->tableName);
+    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->tableName,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
+    }
+if(setting != NULL) // assertably false
+    return TV_HIDE;
+
+if(applyMax && vis >= tvHide)
+    return hStringFromTv(vis);
+
+return setting; // nothing found
+}
+
 static int subtrackFourStateChecked(struct trackDb *subtrack, struct cart *cart)
 /* Returns the four state checked state of the subtrack */
 {
 char * setting = NULL;
@@ -3245,11 +3288,12 @@
     {
     if(findWordByDelimiter("off",' ',setting) == NULL)
         fourState = 1;
     }
-// Must determine visibility form cartsafef(objName, sizeof(objName), "%s_sel", subtrack->tableName);
-setting = trackDbSettingOrDefault(subtrack, "visibility","hide");
-if(sameWord(setting,"hide"))
+// Now check visibility
+setting = tdbResolveVis(cart,subtrack,FALSE);
+
+if(sameWord(setting,TV_HIDE))
     fourState -= 2; // visibility: hide means -1 or -2
 
 safef(objName, sizeof(objName), "%s_sel", subtrack->tableName);
 return cartUsualInt(cart, objName, fourState);