01b8b1aaaa97fc172c91d7d4ff928f83e7480c6f
tdreszer
  Mon Oct 31 10:55:40 2011 -0700
Working towards fix in viewVis reshaping.
diff --git src/hg/lib/cart.c src/hg/lib/cart.c
index af57c01..ac56d94 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -11,30 +11,34 @@
 #include "cart.h"
 #include "net.h"
 #include "web.h"
 #include "hdb.h"
 #include "jksql.h"
 #include "jsHelper.h"
 #include "trashDir.h"
 #ifndef GBROWSE
 #include "customFactory.h"
 #include "googleAnalytics.h"
 #include "wikiLink.h"
 #endif /* GBROWSE */
 #include "hgMaf.h"
 #include "hui.h"
 
+// NOTE: using '.' as delimiter in trackName.var cart vars is too pervasive to
+//       to support '_' so don't bother!
+//////// #define SUPPORT_UNDERBAR_DELIMIT
+
 static char *sessionVar = "hgsid";	/* Name of cgi variable session is stored in. */
 static char *positionCgiName = "position";
 
 DbConnector cartDefaultConnector = hConnectCart;
 DbDisconnect cartDefaultDisconnector = hDisconnectCart;
 
 static void hashUpdateDynamicVal(struct hash *hash, char *name, void *val)
 /* Val is a dynamically allocated (freeMem-able) entity to put
  * in hash.  Override existing hash item with that name if any.
  * Otherwise make new hash item. */
 {
 struct hashEl *hel = hashLookup(hash, name);
 if (hel == NULL)
     hashAdd(hash, name, val);
 else
@@ -2022,60 +2026,76 @@
 *cartNames = newList;
 return pruned;
 }
 
 
 int cartRemoveFromTdbTree(struct cart *cart,struct trackDb *tdb,char *suffix,boolean skipParent)
 /* Removes a 'trackName.suffix' from all tdb descendents (but not parent).
    If suffix NULL then removes 'trackName' which holds visibility */
 {
 int removed = 0;
 boolean vis = (suffix == NULL || *suffix == '\0');
 struct slRef *tdbRef, *tdbRefList = trackDbListGetRefsToDescendants(skipParent?tdb->subtracks:tdb);
 for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
     {
     struct trackDb *descendentTdb = tdbRef->val;
-    char settingName[512];  // wgEncodeOpenChromChip.Peaks.vis
+    char setting[512];
     if (vis)
-        safef(settingName,sizeof(settingName),"%s",descendentTdb->track);
+        safef(setting,sizeof(setting),"%s",descendentTdb->track);
     else
-        safef(settingName,sizeof(settingName),"%s.%s",descendentTdb->track,suffix);
-    removed += cartRemoveAndCount(cart,settingName);
+        safef(setting,sizeof(setting),"%s.%s",descendentTdb->track,suffix);
+#ifdef SUPPORT_UNDERBAR_DELIMIT
+    int count = cartRemoveAndCount(cart,setting);
+    if (count > 0 || vis)
+        {
+        removed += count;
+        continue;
+        }
+    *(setting + strlen(descendentTdb->track)) = '_'; // Try '_'
+#endif///def SUPPORT_UNDERBAR_DELIMIT
+    removed += cartRemoveAndCount(cart,setting);
     }
 return removed;
 }
 
 static int cartRemoveOldFromTdbTree(struct cart *newCart,struct hash *oldVars,struct trackDb *tdb,char *suffix,char *parentVal,boolean skipParent)
 /* Removes a 'trackName.suffix' from all tdb descendents (but not parent), BUT ONLY IF OLD or same as parentVal.
    If suffix NULL then removes 'trackName' which holds visibility */
 {
 int removed = 0;
 boolean vis = (suffix == NULL || *suffix == '\0');
 struct slRef *tdbRef, *tdbRefList = trackDbListGetRefsToDescendants(skipParent?tdb->subtracks:tdb);
 for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
     {
     struct trackDb *descendentTdb = tdbRef->val;
-    char settingName[512];  // wgEncodeOpenChromChip.Peaks.vis
+    char setting[512];
     if (vis)
-        safef(settingName,sizeof(settingName),"%s",descendentTdb->track);
+        safef(setting,sizeof(setting),"%s",descendentTdb->track);
     else
-        safef(settingName,sizeof(settingName),"%s.%s",descendentTdb->track,suffix);
-    char *newVal = cartOptionalString(newCart,settingName);
+        safef(setting,sizeof(setting),"%s.%s",descendentTdb->track,suffix);
+    char *newVal = cartOptionalString(newCart,setting);
+#ifdef SUPPORT_UNDERBAR_DELIMIT
+    if (newVal == NULL && !vis)                          // NOTE: assumed '.' not '_'
+        {
+        *(setting + strlen(descendentTdb->track)) = '_'; // Try '_'
+        newVal = cartOptionalString(newCart,setting);
+        }
+#endif///def SUPPORT_UNDERBAR_DELIMIT
     if (    newVal    != NULL
     && (   (parentVal != NULL && sameString(newVal,parentVal))
-        || (FALSE == cartValueHasChanged(newCart,oldVars,settingName,TRUE,FALSE))))
-        removed += cartRemoveAndCount(newCart,settingName);
+        || (FALSE == cartValueHasChanged(newCart,oldVars,setting,TRUE,FALSE))))
+        removed += cartRemoveAndCount(newCart,setting);
     }
 return removed;
 }
 
 static boolean cartTdbOverrideSuperTracks(struct cart *cart,struct trackDb *tdb,boolean ifJustSelected)
 /* 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;
 
 char setting[512];
 
 // Must be from having just selected the track in findTracks.  This will carry with it the "_sel" setting.
@@ -2367,52 +2387,69 @@
     {
     (void)cartNamesPruneChanged(newCart,oldVars,&changedSettings,TRUE,FALSE);
     if (changedSettings == NULL && !containerVisChanged)
         return anythingChanged;
     }
 
 // Walk through views
 if (hasViews)
     {
     for (tdbView = tdb->subtracks;tdbView != NULL; tdbView = tdbView->next)
         {
         boolean viewVisChanged = FALSE;
         if (!tdbIsView(tdbView,&view))
             break;
 
+    #ifndef SUBTRACK_CFG
         safef(setting,   sizeof(setting),"%s.%s.",tdb->track,view); // unfortunatly setting name could be containerName.View.???
-        char settingAlt[512];
-        safef(settingAlt,sizeof(settingAlt),"%s.",tdbView->track);  // or viewTrackName.???
+    #endif///ndef SUBTRACK_CFG
         struct slPair *leftOvers = NULL;
         // Walk through settings that match this view
         while ((oneName = slPopHead(&changedSettings)) != NULL)
             {
-            if(startsWith(setting,oneName->name))
+            suffix = NULL;
+            if(startsWith(tdbView->track,oneName->name))
+                {
+                suffix = oneName->name + strlen(tdbView->track);
+            #ifdef SUPPORT_UNDERBAR_DELIMIT
+                if (*suffix == '.' || *suffix == '_')
+            #else///ifndef SUPPORT_UNDERBAR_DELIMIT
+                if (*suffix == '.') // NOTE: standardize on '.' since its is so pervasive
+            #endif///ndef SUPPORT_UNDERBAR_DELIMIT
+                    suffix++;
+                else if (isalnum(*suffix)) // viewTrackName is subset of another track!
+                    suffix = NULL;         // add back to list for next round
+                }
+        #ifndef SUBTRACK_CFG
+            else if(startsWith(setting,oneName->name))
                 suffix = oneName->name + strlen(setting);
-            else if(startsWith(settingAlt,oneName->name))
-                suffix = oneName->name + strlen(settingAlt);
-            else
+        #endif///ndef SUBTRACK_CFG
+
+            if (suffix == NULL)
                 {
                 slAddHead(&leftOvers,oneName);
                 continue;
                 }
 
-            if (sameString(suffix,"vis"))
-                {
+        #ifdef SUBTRACK_CFG
+            if (*suffix == '\0')
+        #else///ifndef SUBTRACK_CFG
+            if (*suffix == '\0' || sameString(suffix,"vis"))
+        #endif///ndef SUBTRACK_CFG
                 viewVisChanged = TRUE;
-                }
-            else if (cartRemoveOldFromTdbTree(newCart,oldVars,tdbView,suffix,oneName->val,TRUE) > 0)
+            else  // be certain to exclude vis settings here
+                if (cartRemoveOldFromTdbTree(newCart,oldVars,tdbView,suffix,oneName->val,TRUE) > 0)
                     clensed++;
 
             }
         if (viewVisChanged)
             {
             // If just created and if vis is the same as tdb default then vis has not changed
         #ifdef SUBTRACK_CFG
             char *cartVis = cartOptionalString(newCart,tdbView->track);
             char *oldValue = hashFindVal(oldVars,tdbView->track);
         #else///ifndef SUBTRACK_CFG
             safef(setting,sizeof(setting),"%s.%s.vis",tdb->track,view);
             char *cartVis = cartOptionalString(newCart,setting);
             char *oldValue = hashFindVal(oldVars,setting);
         #endif///ndef SUBTRACK_CFG
             if (cartVis && oldValue == NULL && hTvFromString(cartVis) != tdbView->visibility)