154c2d14c0952d76054aff0b959a38c6c9ded41c tdreszer Tue Nov 16 11:08:10 2010 -0800 Removed a bunch of composite reshaping ifdefs, now that track search is out the door. diff --git src/hg/lib/cart.c src/hg/lib/cart.c index 441b055..fc7af72 100644 --- src/hg/lib/cart.c +++ src/hg/lib/cart.c @@ -1750,102 +1750,30 @@ char buf[512]; safef(buf, sizeof buf, "%s.%s", tdb->track,suffix); char *cartSetting = hashFindVal(cart->hash, buf); if (cartSetting != NULL) { if(pVariable != NULL) *pVariable = cloneString(buf); return cartSetting; } } if (pVariable != NULL) *pVariable = NULL; return NULL; } -// NEVER CHECKED IN. -//#define NORMALIZE_CLOSEST_TO_HOME -#ifdef NORMALIZE_CLOSEST_TO_HOME -static void cartPairNormalize(struct cart *cart,struct cart *oldCart,char **lowestVar,char **lowestVal,char *parentVar,char *parentVal) -/* Removes the lower level variable if it is the same as parent OR if the parent just changed */ -{ -if(parentVal) - { - if(*lowestVal) - { - if(sameString(*lowestVal,parentVal)) // same so don't need lowest - { - cartRemove(cart,*lowestVar); - *lowestVal = NULL; - } - else // Is parent newer? - { - char *oldVal = hashFindVal(oldCart->hash, parentVar); - if(oldVal == NULL || differentString(oldVal,parentVal)) // parent updated - { - oldVal = hashFindVal(oldCart->hash, *lowestVar); - if(oldVal && sameString(oldVal,*lowestVal)) // lowest not updated - { - cartRemove(cart,*lowestVar); // parent newer - *lowestVal = NULL; - } - } - } - } - if(*lowestVal == NULL) - { - *lowestVal = parentVal; - //safecpy(*lowestVar, sizeof *lowestVar, parentVar); - strcpy(*lowestVar, parentVar); // NOTE: these two must be same size! - } - } -} - -char *cartNormalizeVariableClosestToHome(struct cart *cart,struct cart *oldCart,struct trackDb *tdb,boolean oneLevel, char *suffix) -/* returns the ClosestToHome cart variable, but will remove any cart variable - most recently superceded */ -{ -char childVar[512]; -safef(childVar, sizeof childVar, "%s.%s", tdb->track,suffix); -char *lowestVar = childVar; -char *lowestVal = hashFindVal(cart->hash, childVar); -if(!tdbIsCompositeChild(tdb)) - return lowestVal; -char *oldVal = cartOptionalString(oldCart, childVar); -if(oldVal && differentString(oldVal,lowestVal)) - return lowestVal; // It is newest and nothing needs to be removed - -// Find the closest to home parent -char parentVar[512]; -char *parentVal = NULL; -char *stView; -if (tdbIsView(viewTdb,&stView)) - { - safef(parentVar,sizeof parentVar,"%s.%s.%s",tdb->parent->track,stView,suffix); - parentVal = hashFindVal(cart->hash, parentVar); - cartPairNormalize(cart,oldCart,&lowestVar,&lowestVal,parentVar,parentVal); - } -if(!oneLevel) - { - safef(parentVar,sizeof parentVar,"%s.%s",tdb->parent->track,suffix); - parentVal = hashFindVal(cart->hash, parentVar); - cartPairNormalize(cart,oldCart,&lowestVar,&lowestVal,parentVar,parentVal); - } -return lowestVal?lowestVal:parentVal; -} -#endif//def NORMALIZE_CLOSEST_TO_HOME - void cartRemoveVariableClosestToHome(struct cart *cart, struct trackDb *tdb, boolean compositeLevel, char *suffix) /* Looks for then removes a cart variable from lowest level on up: subtrackName.suffix, then compositeName.view.suffix, then compositeName.suffix */ { char *var = NULL; (void)cartLookUpVariableClosestToHome(cart,tdb,compositeLevel,suffix,&var); if(var != NULL) { cartRemove(cart,var); freeMem(var); } } char *cartStringClosestToHome(struct cart *cart, struct trackDb *tdb, boolean compositeLevel, char *suffix) /* Returns value or Aborts for a cart string from lowest level on up: @@ -2110,89 +2038,31 @@ { if (child->visibility == tvHide) cartRemove(cart,child->track); else if (hTvFromString(cartVis) != tvHide) cartSetString(cart,child->track,"hide"); } else if (child->visibility != tvHide) cartSetString(cart,child->track,"hide"); } // and finally show the parent cartSetString(cart,tdb->parent->track,"show"); WARN("Set %s to 'show'",tdb->parent->track); return TRUE; } -// Shaping composite vis by subtrack specific vis comes in 3 flavors: -// Simple) No shaping. Subtrack specific vis overrides composite/view level but does not alter it -// Plan A) When composite is in default settings only, then composite/vis is shaped to reflect current subtrack vis -// Plan B) Whenever there is subtrack level vis, the composite and view vis are shaped to show maximum subtrack vis, -// while subtracks with inherited vis may be given subtrack specific vis to return them to that state -#define COMPOSITE_VIS_SHAPING_PLAN_A -#define COMPOSITE_VIS_SHAPING_PLAN_B - -#ifndef COMPOSITE_VIS_SHAPING_PLAN_B -static boolean cartVarsNoneFoundForTdb(struct cart *cart,struct hash *subVisHash,struct trackDb *tdb) -{ -struct slPair *cartVar,*cartVars = cartVarsWithPrefix(cart,tdb->track); -if (cartVars != NULL) - { - for (cartVar = cartVars; cartVar != NULL; cartVar = cartVar->next) - { - if (tdbIsCompositeView(tdb) || !hashFindVal(subVisHash, cartVar->name)) // subVisHash does not contain anything prefixed by view! - { - // If composite vis changed but it is the same as trackDb default then ignore it - if (tdbIsContainer(tdb) - && sameString(cartVar->name,tdb->track) - && sameString((char *)cartVar->val,hStringFromTv(tdb->visibility)) ) - continue; - - // If view vis changed but it is the same as trackDb default then ignore it - if (tdbIsContainer(tdb) - && endsWith((char *)cartVar->val,".vis")) - { - // find out view - char *val = skipBeyondDelimit(cartVar->name,'.'); - char *viewFound = cloneFirstWordByDelimiter(val,'.'); - if (viewFound) - { - // find tdb for View - struct trackDb *viewTdb; - for (viewTdb=tdb->subtracks; viewTdb!=NULL; viewTdb=viewTdb->next) - { - char *viewOfTdb = NULL; - if (tdbIsView(viewTdb,&viewOfTdb) && sameString(viewOfTdb,viewFound)) - { - if(sameString((char *)cartVar->val,hStringFromTv(viewTdb->visibility)) ) - continue; - break; - } - } - } - } - WARN("cartVarsNoneFoundForTdb: %s=%s",cartVar->name,(char *)cartVar->val); - slFreeList(&cartVars); - return FALSE; // Any view cart vars means non-default so do not "shape" composite - } - } - slFreeList(&cartVars); - } -return TRUE; -} -#endif///ndef COMPOSITE_VIS_SHAPING_PLAN_B -#if defined(COMPOSITE_VIS_SHAPING_PLAN_A) || defined(COMPOSITE_VIS_SHAPING_PLAN_B) static int cartTdbParentShapeVis(struct cart *cart,struct trackDb *parent,char *view,struct hash *subVisHash,boolean reshapeFully) // This shapes one level of vis (view or container) based upon subtrack specific visibility. Returns count of tracks affected { ASSERT(view || (tdbIsContainer(parent) && tdbIsContainerChild(parent->subtracks))); struct trackDb *subtrack = NULL; char setting[512]; if (view != NULL) safef(setting,sizeof(setting),"%s.%s.vis",parent->parent->track,view); else safef(setting,sizeof(setting),"%s",parent->track); enum trackVisibility visMax = tvHide; enum trackVisibility visOrig = tdbVisLimitedByAncestry(cart, parent, FALSE); // Should walk through children to get max new vis for this parent @@ -2271,39 +2141,35 @@ { // MultiTrack vis is ALWAYS inherited vis so remove any subtrack specific vis struct hashCookie brownie = hashFirst(subVisHash); struct hashEl* cartVar = NULL; while ((cartVar = hashNext(&brownie)) != NULL) { if (!endsWith(cartVar->name,"_sel")) cartRemove(cart,cartVar->name); } } if (countUnchecked + countVisChanged) WARN("%s visOrig:%s visMax:%s unchecked:%d Vis changed:%d",parent->track,hStringFromTv(visOrig),hStringFromTv(visMax),countUnchecked,countVisChanged); return (countUnchecked + countVisChanged); } -#endif/// defined(COMPOSITE_VIS_SHAPING_PLAN_A) || defined(COMPOSITE_VIS_SHAPING_PLAN_B) boolean cartTdbTreeMatchSubtrackVis(struct cart *cart,struct trackDb *tdbContainer) /* When subtrack vis is set via findTracks, and composite has no cart settings, then "shape" composite to match found */ { -#if !defined(COMPOSITE_VIS_SHAPING_PLAN_A) && !defined(COMPOSITE_VIS_SHAPING_PLAN_B) - return FALSE; // Don't do any shaping -#else/// if defined(COMPOSITE_VIS_SHAPING_PLAN_A) || defined(COMPOSITE_VIS_SHAPING_PLAN_B) if (!tdbIsContainer(tdbContainer)) return FALSE; // Don't do any shaping // First look for subtrack level vis char setting[512]; struct trackDb *subtrack = NULL; struct trackDb *tdbView = NULL; struct hash *subVisHash = newHash(0); struct slRef *tdbRef, *tdbRefList = trackDbListGetRefsToDescendantLeaves(tdbContainer->subtracks); for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next) { subtrack = tdbRef->val; char *val=cartOptionalString(cart,subtrack->track); if (val && differentString(val,"hide")) // NOTE should we include hide? { @@ -2315,73 +2181,34 @@ hashAdd(subVisHash,subtrack->track,val); safef(setting,sizeof(setting),"%s_sel",subtrack->track); hashAdd(subVisHash,setting,subtrack); // Add the "_sel" setting which should also exist. Point it to subtrack } } } slFreeList(&tdbRefList); if (hashNumEntries(subVisHash) == 0) { //WARN("No subtrack level vis for %s",tdbContainer->track); return FALSE; } // Next look for any cart settings other than subtrack vis/sel -#ifdef COMPOSITE_VIS_SHAPING_PLAN_B // New directive means that if composite is hidden, then ignore previous and don't bother checking cart. boolean reshapeFully = (tdbVisLimitedByAncestry(cart, tdbContainer, FALSE) == tvHide); boolean hasViews = tdbIsCompositeView(tdbContainer->subtracks); -#else///ifndef COMPOSITE_VIS_SHAPING_PLAN_B -boolean reshapeFully = cartVarsNoneFoundForTdb(cart,subVisHash,tdbContainer); -boolean hasViews = FALSE; -tdbView = tdbContainer->subtracks; -if (tdbIsCompositeView(tdbView)) - { - hasViews = TRUE; - if (reshapeFully) - { - for( ;tdbView != NULL; tdbView = tdbView->next ) - { - if(!cartVarsNoneFoundForTdb(cart,subVisHash,tdbView)) - { - reshapeFully = FALSE; - break; - } - } - } - } - -// How about subtrack level settings? Assume that compositePrefix caught them? If views then YES -if (reshapeFully && !hasViews) - { - for(subtrack = tdbContainer->subtracks;subtrack != NULL; subtrack = subtrack->next ) - { - if (!cartVarsNoneFoundForTdb(cart,subVisHash,subtrack)); - { - reshapeFully = FALSE; - break; - } - } - } -if (!reshapeFully) - { - hashFree(&subVisHash); - return FALSE; // Any view cart vars means non-default so do not "shape" composite - } -#endif///ndef COMPOSITE_VIS_SHAPING_PLAN_B WARN("reshape: %s",reshapeFully?"Fully":"Incrementally"); // Now shape views and composite to match subtrack specific visibility int count = 0; if (hasViews) { for(tdbView = tdbContainer->subtracks;tdbView != NULL; tdbView = tdbView->next ) { char *view = NULL; if (tdbIsView(tdbView,&view) ) count += cartTdbParentShapeVis(cart,tdbView,view,subVisHash,reshapeFully); } if (count > 0) { // At least on view was shaped, so all views will get explicit vis. This means composite must be set to full @@ -2390,31 +2217,30 @@ if (visOrig == tvHide && tdbIsSuperTrackChild(tdbContainer)) cartTdbOverrideSuperTracks(cart,tdbContainer,FALSE); // deal with superTrack vis! cleanup } } else // If no views then composite is not set to fuul but to max of subtracks count = cartTdbParentShapeVis(cart,tdbContainer,NULL,subVisHash,reshapeFully); hashFree(&subVisHash); // If reshaped, be sure to set flag to stop composite cleanup #define RESHAPED_COMPOSITE "reshaped" if (count > 0) tdbExtrasAddOrUpdate(tdbContainer,RESHAPED_COMPOSITE,(void *)(long)TRUE); // Exists for the life of the cgi only return TRUE; -#endif/// defined(COMPOSITE_VIS_SHAPING_PLAN_A) || defined(COMPOSITE_VIS_SHAPING_PLAN_B) } boolean cartTdbTreeCleanupOverrides(struct trackDb *tdb,struct cart *newCart,struct hash *oldVars) /* When container or composite/view settings changes, remove subtrack specific settings Returns TRUE if any cart vars are removed */ { boolean anythingChanged = cartTdbOverrideSuperTracks(newCart,tdb,TRUE); if (!tdbIsContainer(tdb)) return anythingChanged; // If composite has been reshaped then don't clean it up if ((boolean)(long)tdbExtrasGetOrDefault(tdb,RESHAPED_COMPOSITE,(void *)(long)FALSE)) return anythingChanged; // vis is a special additive case! composite or view level changes then remove subtrack vis