6e57bd7dddafb83f609a22cba99c47c97fb506d9 tdreszer Thu Sep 9 09:09:18 2010 -0700 hgTrackUi can now use ajax to update composite/view settings, which enables keeping subtrack level v. composite/view level settings properly influencing each other. That is, timing is important in ensuring that composite/view level changes overrides subtrack level settings. The triggers for this code in hui.c are all ifdef'd on SUBTRACK_CFG_POPUP. diff --git src/hg/lib/cart.c src/hg/lib/cart.c index e7d4392..acbbb5a 100644 --- src/hg/lib/cart.c +++ src/hg/lib/cart.c @@ -326,6 +326,7 @@ { char *name = cloneString(el->name); safecpy(name+suffixOffset,strlen(POSITION_SUFFIX),IMGORD_SUFFIX); // We know that POSITION_SUFFIX is longer than IMGORD_SUFFIX + //warn("Removing imgOrd for %s",name); cartRemove(cart, name); // Removes if found freeMem(name); } @@ -2067,99 +2068,113 @@ // vis is a special additive case! composite or view level changes then remove subtrack vis boolean compositeVisChanged = cartValueHasChanged(newCart,oldVars,tdb->track,TRUE,TRUE); -//boolean compositeVisHidden = FALSE; -//if(compositeVisChanged) -// compositeVisHidden = (cartUsualInt(cart,tdb->track,tvFull) == tvHide); - +struct trackDb *tdbView = NULL; +struct slRef *oneName = NULL; +char * var = NULL; +int clensed = 0; -// FIXME: Big problem in persistence of changed state. -boolean debug = FALSE;//sameString(tdb->track,"wgEncodeBroadChipSeq"); +// Do some debugging +boolean debug = FALSE;//sameString(tdb->track,"wgEncodeBroadHistone"); if(debug) { char *newValue = cartOptionalString(newCart,tdb->track); char *oldValue = hashFindVal(oldVars,tdb->track); - warn("Cleanup: wgEncodeBroadChipSeq compositeVisChanged:%s new:%s old:%s", + warn("Cleanup: %s compositeVisChanged:%s new:%s old:%s",tdb->track, (compositeVisChanged?"yes":"no"),(newValue!=NULL?newValue:"(null)"),(oldValue!=NULL?oldValue:"(null)")); } -// Build list of current settings for composite +// Build list of current settings for composite and views char setting[512]; safef(setting,sizeof(setting),"%s.",tdb->track); +char * view = NULL; +boolean hasViews = FALSE; struct slRef *changedSettings = cartNamesPrefixedBy(newCart, setting); +for (tdbView = tdb->subtracks;tdbView != NULL; tdbView = tdbView->next) + { + if (!tdbIsView(tdbView,&view)) + break; + hasViews = TRUE; + safef(setting,sizeof(setting),"%s.",tdbView->track); + struct slRef *changeViewSettings = cartNamesPrefixedBy(newCart, setting); + changedSettings = slCat(changedSettings, changeViewSettings); + } if (changedSettings == NULL && !compositeVisChanged) return FALSE; // Prune list to only those which have changed if(changedSettings != NULL) { - if(debug) warn("Cleanup: settings:%d",slCount(changedSettings)); + if (debug) + warn("Cleanup: settings:%d",slCount(changedSettings)); (void)cartNamesPruneChanged(newCart,oldVars,&changedSettings,TRUE,FALSE); if (changedSettings == NULL && !compositeVisChanged) return FALSE; - if(debug) warn("Cleanup: changed:%d",changedSettings==NULL?0:slCount(changedSettings)); + if (debug) + warn("Cleanup: changed:%d",changedSettings==NULL?0:slCount(changedSettings)); } -struct slRef *oneName = NULL; -char * var = NULL; -boolean clensed = FALSE; - // Walk through views -boolean hasViews = FALSE; -struct trackDb *tdbView = tdb->subtracks; -for (;tdbView != NULL; tdbView = tdbView->next) +if (hasViews) + { + for (tdbView = tdb->subtracks;tdbView != NULL; tdbView = tdbView->next) { boolean viewVisChanged = FALSE; -// boolean viewVisHidden = FALSE; - char * view = NULL; if (!tdbIsView(tdbView,&view)) break; - hasViews = TRUE; - safef(setting,sizeof(setting),"%s.%s.",tdb->track,view); + safef(setting, sizeof(setting),"%s.%s.",tdb->track,view); // unfortunatly setting name could be wgEncodeBroadHistone.Sig.???r + char settingAlt[512]; + safef(settingAlt,sizeof(settingAlt),"%s.",tdbView->track); // or wgEncodeBroadHistoneViewSig.??? struct slRef *leftOvers = NULL; // Walk through settings that match this view while ((oneName = slPopHead(&changedSettings)) != NULL) { - if(!startsWith(setting,oneName->val)) - slAddHead(&leftOvers,oneName); + if(startsWith(setting,oneName->val)) + var = oneName->val + strlen(setting); + else if(startsWith(settingAlt,oneName->val)) + var = oneName->val + strlen(settingAlt); else { - var = oneName->val + strlen(setting); + slAddHead(&leftOvers,oneName); + continue; + } + if (sameString(var,"vis")) { viewVisChanged = TRUE; -// viewVisHidden = (cartUsualInt(cart,oneName->val,tvFull) == tvHide); - } - else { - if (cartRemoveFromTdbTree(newCart,tdbView,var,TRUE) > 0) - clensed = TRUE; } + else if (cartRemoveFromTdbTree(newCart,tdbView,var,TRUE) > 0) + clensed++; + freeMem(oneName); } - } if (compositeVisChanged || viewVisChanged) { // vis is a special additive case! if (cartRemoveFromTdbTree(newCart,tdbView,NULL,TRUE) > 0) - clensed = TRUE; + clensed++; } changedSettings = leftOvers; } + } // Now deal with anything remaining at the composite level while ((oneName = slPopHead(&changedSettings)) != NULL) { var = oneName->val + strlen(tdb->track) + 1; if(cartRemoveFromTdbTree(newCart,tdb,var,TRUE) > 0) - clensed = TRUE; + clensed++; freeMem(oneName); } if (compositeVisChanged || !hasViews) { // vis is a special additive case! if (cartRemoveFromTdbTree(newCart,tdb,NULL,TRUE) > 0) - clensed = TRUE; + clensed++; } -return clensed; +if (debug) + warn("Cleaned up %d composite%s settings",clensed,hasViews?"/view":""); + +return (clensed > 0); }