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)