f63a718960b6a66276d579e7cd3fbb107f2cfd78
tdreszer
Tue Nov 16 16:37:13 2010 -0800
Removed obsolete ifdef for SUBTRACKS_HAVE_VIS. Streamlined some composite vis code. Added support for remote tracks being rendered by AJAX callback. Currently ifdefed out.
diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 5077694..7267911 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -257,45 +257,43 @@
}
else
cartSetString(cart, parentTdb->track,
changeVis == tvHide ? "hide" : "show");
}
else // Not super child
{
if (changeVis == tdb->visibility)
/* remove if setting to default vis */
cartRemove(cart, track->track);
else
cartSetString(cart, track->track, hStringFromTv(changeVis));
track->visibility = changeVis;
}
- #ifdef SUBTRACKS_HAVE_VIS
// Whether super child or not, if its a composite, then handle the children
if (tdbIsComposite(tdb))
{
struct track *subtrack;
for(subtrack=track->subtracks;subtrack!=NULL;subtrack=subtrack->next)
{
if (changeVis == tvHide)
cartRemove(cart, subtrack->track); // Since subtrack level vis is an override, simply remove it to hide it
else
cartSetString(cart, subtrack->track, hStringFromTv(changeVis));
subtrack->visibility = changeVis;
}
}
- #endif///def SUBTRACKS_HAVE_VIS
}
}
}
}
slSort(&groupList, gCmpPriority);
}
int trackOffsetX()
/* Return x offset where track display proper begins. */
{
int x = gfxBorder;
if (withLeftLabels)
x += tl.leftLabelWidth + gfxBorder;
return x;
}
@@ -359,34 +357,68 @@
char buf[2048];
if(chromName == NULL)
safef(buf, sizeof(buf), "%s?%s=%u&g=%s", hgTrackUiName(), cartSessionVarName(), cartSessionId(cart), encodedMapName);
else
safef(buf, sizeof(buf), "%s?%s=%u&c=%s&g=%s", hgTrackUiName(), cartSessionVarName(), cartSessionId(cart), chromName, encodedMapName);
freeMem(encodedMapName);
return(cloneString(buf));
}
void smallBreak()
/* Draw small horizontal break */
{
hPrintf("
\n");
}
+#ifdef REMOTE_TRACK_AJAX_CALLBACK
+static boolean trackUsesRemoteData(struct track *track)
+/* returns TRUE is this track has a remote datasource */
+{
+if (!IS_KNOWN(track->remoteDataSource))
+ {
+ SET_TO_NO(track->remoteDataSource);
+ //if (track->bbiFile != NULL) // FIXME: Chicken or the egg. bigWig/bigBed "bbiFile" filled in by loadItems, but we don't want to load items.
+ // {
+ // if (!startsWith("/gbdb/",track->bbiFile->fileName))
+ // SET_TO_YES(track->remoteDataSource);
+ // }
+ if (startsWithWord("bigWig",track->tdb->type) || startsWithWord("bigBed",track->tdb->type))
+ {
+ SET_TO_YES(track->remoteDataSource);
+ }
+ else if (startsWithWord("bam",track->tdb->type))
+ {
+ SET_TO_YES(track->remoteDataSource);
+ }
+ }
+return IS_YES(track->remoteDataSource);
+}
+
+boolean trackShouldUseAjaxRetrieval(struct track *track)
+/* Tracks with remote data sources should berendered via an ajax callback */
+{
+return (theImgBox && !trackImgOnly && trackUsesRemoteData(track));
+}
+#endif///def REMOTE_TRACK_AJAX_CALLBACK
+
static int trackPlusLabelHeight(struct track *track, int fontHeight)
/* Return the sum of heights of items in this track (or subtrack as it may be)
* and the center label(s) above the items (if any). */
{
+if (trackShouldUseAjaxRetrieval(track))
+ return REMOTE_TRACK_HEIGHT;
+
int y = track->totalHeight(track, limitVisibility(track));
if (isCenterLabelIncluded(track))
y += fontHeight;
if (tdbIsComposite(track->tdb))
{
struct track *subtrack;
for (subtrack = track->subtracks; subtrack != NULL; subtrack = subtrack->next)
{
if (isSubtrackVisible(subtrack) && isCenterLabelIncluded(subtrack))
y += fontHeight;
}
}
return y;
}
@@ -1548,42 +1580,40 @@
{
scaleBases = 2 * pow(10, numFigs);
scaleBasesTextNum = 2 * pow(10, numFigs % 3);
}
if ((numFigs >= 3) && (numFigs < 6))
baseWord = "kb";
else if ((numFigs >= 6) && (numFigs < 9))
baseWord = "Mb";
safef(scaleText, scaleTextSize, "%d %s", scaleBasesTextNum, baseWord);
return scaleBases;
}
enum trackVisibility limitedVisFromComposite(struct track *subtrack)
/* returns the subtrack visibility which may be limited by composite with multi-view dropdowns. */
{
-enum trackVisibility vis = subtrack->limitedVisSet ? tvMin(subtrack->visibility,subtrack->limitedVis) : subtrack->visibility;
+assert(tdbIsCompositeChild(subtrack->tdb));
if(tdbIsCompositeChild(subtrack->tdb))
{
if (!subtrack->limitedVisSet)
{
subtrack->visibility = tdbVisLimitedByAncestors(cart, subtrack->tdb, TRUE, TRUE);
limitVisibility(subtrack);
- return vis;
}
- return subtrack->limitedVis;
}
-return vis;
+return subtrack->limitedVis;
}
static int makeRulerZoomBoxes(struct hvGfx *hvg, struct cart *cart, int winStart,int winEnd,
int insideWidth,int seqBaseCount,int rulerClickY,int rulerClickHeight)
/* Make hit boxes that will zoom program around ruler. */
{
int boxes = 30;
int winWidth = winEnd - winStart;
int newWinWidth = winWidth;
int i, ws, we = 0, ps, pe = 0;
int mid, ns, ne;
double wScale = (double)winWidth/boxes;
double pScale = (double)insideWidth/boxes;
char message[32];
char *zoomType = cartCgiUsualString(cart, RULER_BASE_ZOOM_VAR, ZOOM_3X);
@@ -1940,111 +1970,82 @@
yAfterBases = yAfterRuler;
pixHeight += basePositionHeight;
if (rulerCds)
{
yAfterRuler += rulerTranslationHeight;
pixHeight += rulerTranslationHeight;
}
}
boolean safeHeight = TRUE;
/* firefox on Linux worked almost up to 34,000 at the default 620 width */
#define maxSafeHeight 32000
/* Hash tracks/subtracks, limit visibility and calculate total image height: */
for (track = trackList; track != NULL; track = track->next)
{
+ if(tdbIsCompositeChild(track->tdb)) // When single track is requested via AJAX, it could be a subtrack
+ limitedVisFromComposite(track);
+ else
limitVisibility(track);
+
if (!safeHeight)
{
track->limitedVis = tvHide;
track->limitedVisSet = TRUE;
continue;
}
-#ifndef SUBTRACKS_HAVE_VIS
- if (track->limitedVis != tvHide)
-#endif///ndef SUBTRACKS_HAVE_VIS
- {
+
if (tdbIsComposite(track->tdb))
{
struct track *subtrack;
for (subtrack = track->subtracks; subtrack != NULL;
subtrack = subtrack->next)
{
if (!isSubtrackVisible(subtrack))
continue;
- // If the composite track has "view" based drop downs, set visibility based upon those
- enum trackVisibility vis = limitedVisFromComposite(subtrack);
- if(subtrack->visibility != vis)
- {
- subtrack->visibility = vis;
- if (subtrack->limitedVisSet)
- {
- subtrack->limitedVis = tvMin(vis, subtrack->limitedVis);
- }
- else
- {
- subtrack->limitedVis = tvMin(vis,subtrack->visibility);
- subtrack->limitedVisSet = (subtrack->limitedVis != tvHide && subtrack->visibility != subtrack->limitedVis);
- }
- }
- if (!subtrack->limitedVisSet && track->limitedVisSet)
- {
- subtrack->visibility = track->visibility;
- subtrack->limitedVis = track->limitedVis;
- subtrack->limitedVisSet = track->limitedVisSet;
- }
+ // subtrack vis can be explicit or inherited from composite/view. Then it could be limited because of pixel height
+ limitedVisFromComposite(subtrack);
+ assert(subtrack->limitedVisSet);
- #ifdef SUBTRACKS_HAVE_VIS
if (subtrack->limitedVis != tvHide)
- #endif///def SUBTRACKS_HAVE_VIS
{
subtrack->hasUi = track->hasUi;
flatTracksAdd(&flatTracks,subtrack,cart);
}
}
}
- else
- #ifdef SUBTRACKS_HAVE_VIS
- if (track->limitedVis != tvHide)
- #endif///def SUBTRACKS_HAVE_VIS
+ else if (track->limitedVis != tvHide)
flatTracksAdd(&flatTracks,track,cart);
- if (maxSafeHeight < (pixHeight+trackPlusLabelHeight(track,fontHeight)))
- {
- char numBuf[SMALLBUF];
- sprintLongWithCommas(numBuf, maxSafeHeight);
- printf("warning: image is over %s pixels high at "
- "track '%s',
remaining tracks set to hide "
- "for this view.
\n", numBuf, track->tdb->shortLabel);
- safeHeight = FALSE;
- track->limitedVis = tvHide;
- track->limitedVisSet = TRUE;
- }
- }
}
flatTracksSort(&flatTracks); // Now we should have a perfectly good flat track list!
struct track *prevTrack = NULL;
for (flatTrack = flatTracks,prevTrack=NULL; flatTrack != NULL; flatTrack = flatTrack->next)
{
track = flatTrack->track;
- if (maxSafeHeight < (pixHeight+trackPlusLabelHeight(track,fontHeight)))
+ assert(track->limitedVis != tvHide);
+ int totalHeight = pixHeight+trackPlusLabelHeight(track,fontHeight);
+ if (maxSafeHeight < totalHeight)
{
char numBuf[SMALLBUF];
sprintLongWithCommas(numBuf, maxSafeHeight);
printf("warning: image is over %s pixels high at "
"track '%s',
remaining tracks set to hide "
"for this view.
\n", numBuf, track->tdb->shortLabel);
+ warn("warning: image is over %s pixels high (%d pix) at "
+ "track '%s' (%s),
remaining tracks set to hide "
+ "for this view.", numBuf, totalHeight, track->tdb->shortLabel,track->track);
safeHeight = FALSE;
track->limitedVis = tvHide;
track->limitedVisSet = TRUE;
}
if (track->limitedVis != tvHide)
{
track->prevTrack = prevTrack; // Important for keeping track of conditional center labels!
pixHeight += trackPlusLabelHeight(track, fontHeight);
prevTrack = track;
}
}
imagePixelHeight = pixHeight;
if (psOutput)
{
@@ -2101,36 +2102,36 @@
findTrackColors(hvg, trackList);
// Good to go ahead and add all imgTracks regardless of buttons, left label, centerLabel, etc.
if(theImgBox)
{
if (rulerMode != tvHide)
{
curImgTrack = imgBoxTrackFindOrAdd(theImgBox,NULL,RULER_TRACK_NAME,rulerMode,FALSE,IMG_FIXEDPOS); // No tdb, no centerlabel, not reorderable
}
for (flatTrack = flatTracks; flatTrack != NULL; flatTrack = flatTrack->next)
{
track = flatTrack->track;
if (track->limitedVis != tvHide)
{
- #ifdef SUBTRACKS_HAVE_VIS
if(track->labelColor == track->ixColor && track->ixColor == 0)
track->ixColor = hvGfxFindRgb(hvg, &track->color);
- #endif//def SUBTRACKS_HAVE_VIS
int order = flatTrack->order;
curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isCenterLabelIncluded(track),order);
+ if (trackShouldUseAjaxRetrieval(track))
+ imgTrackMarkForAjaxRetrieval(curImgTrack,TRUE);
}
}
}
/* Draw mini-buttons. */
if (withLeftLabels && psOutput == NULL)
{
int butOff;
boolean grayButtonGroup = FALSE;
struct group *lastGroup = NULL;
y = gfxBorder;
if (rulerMode != tvHide)
{
/* draw button for Base Position pseudo-track */
int height = basePositionHeight;
@@ -2269,30 +2270,33 @@
}
for (flatTrack = flatTracks; flatTrack != NULL; flatTrack = flatTrack->next)
{
track = flatTrack->track;
if (track->limitedVis == tvHide)
continue;
if(theImgBox)
{
// side label slice for tracks
sliceHeight = trackPlusLabelHeight(track, fontHeight);
sliceOffsetY = y;
curImgTrack = imgBoxTrackFind(theImgBox,track->tdb,NULL);
curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,stSide,theSideImg,NULL,sliceWidth[stSide],sliceHeight,sliceOffsetX[stSide],sliceOffsetY);
curMap = sliceMapFindOrStart(curSlice,track->tdb->track,NULL); // No common linkRoot
}
+ if (trackShouldUseAjaxRetrieval(track))
+ y += REMOTE_TRACK_HEIGHT;
+ else
y = doLeftLabels(track, hvgSide, font, y);
}
}
else
{
leftLabelX = leftLabelWidth = 0;
}
/* Draw guidelines. */
if (withGuidelines)
{
struct hvGfx *bgImg = hvg; // Default to the one image
boolean exists = FALSE;
if(theImgBox)
{
@@ -2360,30 +2364,33 @@
track = flatTrack->track;
if (track->limitedVis == tvHide)
continue;
if(theImgBox)
{
// center label slice of tracks Must always make, even if the centerLabel is empty
sliceHeight = fontHeight;
sliceOffsetY = y;
curImgTrack = imgBoxTrackFind(theImgBox,track->tdb,NULL);
curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,stCenter,theOneImg,NULL,sliceWidth[stData],sliceHeight,sliceOffsetX[stData],sliceOffsetY);
curMap = sliceMapFindOrStart(curSlice,track->tdb->track,NULL); // No common linkRoot
if (isCenterLabelConditional(track))
imgTrackUpdateCenterLabelSeen(curImgTrack,isCenterLabelConditionallySeen(track)?clNowSeen:clNotSeen);
}
+ if (trackShouldUseAjaxRetrieval(track))
+ y += REMOTE_TRACK_HEIGHT;
+ else
y = doCenterLabels(track, track, hvg, font, y);
}
hvGfxUnclip(hvg);
}
/* Draw tracks. */
{
long lastTime = 0;
y = yAfterRuler;
if (measureTiming)
lastTime = clock1000();
for (flatTrack = flatTracks; flatTrack != NULL; flatTrack = flatTrack->next)
{
track = flatTrack->track;
if (track->limitedVis == tvHide)
@@ -2392,30 +2399,33 @@
int centerLabelHeight = (isCenterLabelIncluded(track) ? fontHeight : 0);
int yStart = y + centerLabelHeight;
int yEnd = y + trackPlusLabelHeight(track, fontHeight);
if(theImgBox)
{
// data slice of tracks
sliceOffsetY = yStart;
sliceHeight = yEnd - yStart - 1;
curImgTrack = imgBoxTrackFind(theImgBox,track->tdb,NULL);
if(sliceHeight > 0)
{
curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,stData,theOneImg,NULL,sliceWidth[stData],sliceHeight,sliceOffsetX[stData],sliceOffsetY);
curMap = sliceMapFindOrStart(curSlice,track->tdb->track,NULL); // No common linkRoot
}
}
+ if (trackShouldUseAjaxRetrieval(track))
+ y += REMOTE_TRACK_HEIGHT;
+ else
y = doDrawItems(track, hvg, font, y, &lastTime);
if (theImgBox && track->limitedVis == tvDense && tdbIsCompositeChild(track->tdb))
mapBoxToggleVis(hvg, 0, yStart,tl.picWidth, sliceHeight,track); // Strange mabBoxToggleLogic handles reverse complement itself so x=0, width=tl.picWidth
if(yEnd!=y)
warn("Slice height does not add up. Expecting %d != %d actual",yEnd - yStart - 1,y-yStart);
}
y++;
}
/* if a track can draw its left labels, now is the time since it
* knows what exactly happened during drawItems
*/
if (withLeftLabels)
{
@@ -2423,31 +2433,33 @@
for (flatTrack = flatTracks; flatTrack != NULL; flatTrack = flatTrack->next)
{
track = flatTrack->track;
if (track->limitedVis == tvHide)
continue;
if(theImgBox)
{
// side label slice of tracks
sliceHeight = trackPlusLabelHeight(track, fontHeight);
sliceOffsetY = y;
curImgTrack = imgBoxTrackFind(theImgBox,track->tdb,NULL);
curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,stSide,theSideImg,NULL,sliceWidth[stSide],sliceHeight,sliceOffsetX[stSide],sliceOffsetY);
curMap = sliceMapFindOrStart(curSlice,track->tdb->track,NULL); // No common linkRoot
}
- if (track->drawLeftLabels != NULL)
+ if (trackShouldUseAjaxRetrieval(track))
+ y += REMOTE_TRACK_HEIGHT;
+ else if (track->drawLeftLabels != NULL)
y = doOwnLeftLabels(track, hvgSide, font, y);
else
y += trackPlusLabelHeight(track, fontHeight);
}
}
/* Make map background. */
y = yAfterRuler;
for (flatTrack = flatTracks; flatTrack != NULL; flatTrack = flatTrack->next)
{
track = flatTrack->track;
if (track->limitedVis != tvHide)
{
if(theImgBox)
@@ -2952,30 +2964,35 @@
sprintf(buf, "%s %s", ctFileName, itemName);
else
sprintf(buf, "%s NoItemName", ctFileName);
return buf;
}
void coloredExonMethodsFromCt(struct track *tg)
/* same as coloredExonMethods but different loader. */
{
linkedFeaturesSeriesMethods(tg);
tg->loadItems = ctLoadColoredExon;
tg->canPack = TRUE;
}
+void dontLoadItems(struct track *tg)
+/* No-op loadItems when we aren't going to try. */
+{
+}
+
struct track *newCustomTrack(struct customTrack *ct)
/* Make up a new custom track. */
{
struct track *tg = NULL;
struct trackDb *tdb = ct->tdb;
boolean useItemRgb = FALSE;
char *typeOrig = tdb->type;
char *typeDupe = cloneString(typeOrig);
char *typeParam = typeDupe;
char *type = nextWord(&typeParam);
if (ct->dbTrack)
{
// make sure we can connect
struct sqlConnection *conn = hAllocConn(CUSTOM_TRASH);
@@ -3003,45 +3020,49 @@
else if (sameString(type, "wig"))
{
tg = trackFromTrackDb(tdb);
if (ct->dbTrack)
tg->loadItems = wigLoadItems;
else
tg->loadItems = ctWigLoadItems;
tg->customPt = ct;
tg->nextItemButtonable = FALSE;
}
else if (sameString(type, "bigWig"))
{
tg = trackFromTrackDb(tdb);
tg->bbiFile = ct->bbiFile;
tg->nextItemButtonable = FALSE;
+ if (trackShouldUseAjaxRetrieval(tg))
+ tg->loadItems = dontLoadItems;
}
else if (sameString(type, "bigBed"))
{
struct bbiFile *bbi = ct->bbiFile;
/* Find field counts, and from that revise the tdb->type to be more complete. */
char extra = (bbi->fieldCount > bbi->definedFieldCount ? '+' : '.');
char typeBuf[64];
safef(typeBuf, sizeof(typeBuf), "bigBed %d %c", bbi->definedFieldCount, extra);
tdb->type = cloneString(typeBuf);
/* Finish wrapping track around tdb. */
tg = trackFromTrackDb(tdb);
tg->bbiFile = bbi;
tg->nextItemButtonable = FALSE;
+ if (trackShouldUseAjaxRetrieval(tg))
+ tg->loadItems = dontLoadItems;
}
else if (sameString(type, "bedGraph"))
{
tg = trackFromTrackDb(tdb);
tg->canPack = FALSE;
tg->customPt = ct;
ct->wigFile = ctFileName;
tg->mapItemName = ctMapItemName;
tg->nextItemButtonable = FALSE;
}
else if (sameString(type, "bed"))
{
tg = trackFromTrackDb(tdb);
if (ct->fieldCount < 8)
{
@@ -3097,30 +3118,32 @@
tg->nextItemButtonable = TRUE;
tg->customPt = ct;
}
else if (sameString(type, "encodePeak"))
{
tg = trackFromTrackDb(tdb);
encodePeakMethodsCt(tg);
tg->nextItemButtonable = TRUE;
tg->customPt = ct;
}
else if (sameString(type, "bam"))
{
tg = trackFromTrackDb(tdb);
tg->customPt = ct;
bamMethods(tg);
+ if (trackShouldUseAjaxRetrieval(tg))
+ tg->loadItems = dontLoadItems;
tg->mapItemName = ctMapItemName;
hashAdd(tdb->settingsHash, BASE_COLOR_USE_SEQUENCE, cloneString("lfExtra"));
hashAdd(tdb->settingsHash, BASE_COLOR_DEFAULT, cloneString("diffBases"));
hashAdd(tdb->settingsHash, SHOW_DIFF_BASES_ALL_SCALES, cloneString("."));
hashAdd(tdb->settingsHash, INDEL_DOUBLE_INSERT, cloneString("on"));
hashAdd(tdb->settingsHash, INDEL_QUERY_INSERT, cloneString("on"));
hashAdd(tdb->settingsHash, INDEL_POLY_A, cloneString("on"));
hashAdd(tdb->settingsHash, "showDiffBasesMaxZoom", cloneString("100"));
}
else if (sameString(type, "makeItems"))
{
tg = trackFromTrackDb(tdb);
makeItemsMethods(tg);
tg->nextItemButtonable = TRUE;
tg->customPt = ct;
@@ -4153,35 +4176,30 @@
int xOff, int yOff, int width, MgFont *font, Color color,
enum trackVisibility vis)
/* This is a stub drawItems handler to be swapped in for the usual drawItems when the window
* size is larger than the threshold specified by trackDb setting maxWindowToDraw. */
{
int maxWinToDraw = getMaxWindowToDraw(tg->tdb);
char commafied[256];
sprintLongWithCommas(commafied, maxWinToDraw);
char message[512];
safef(message, sizeof(message), "zoom in to <= %s bases to view items", commafied);
Color yellow = hvGfxFindRgb(hvg, &undefinedYellowColor);
hvGfxBox(hvg, xOff, yOff, width, tg->heightPer, yellow);
hvGfxTextCentered(hvg, xOff, yOff, width, tg->heightPer, MG_BLACK, font, message);
}
-static void dontLoadItems(struct track *tg)
-/* No-op loadItems when we aren't going to try. */
-{
-}
-
static void checkMaxWindowToDraw(struct track *tg)
/* If (winEnd - winStart) > trackDb setting maxWindowToDraw, force track to a dense line
* that will ask the user to zoom in closer to see track items and return TRUE so caller
* can skip loading items. */
{
int maxWinToDraw = getMaxWindowToDraw(tg->tdb);
if (tdbIsComposite(tg->tdb))
{
struct track *subtrack;
for (subtrack = tg->subtracks; subtrack != NULL; subtrack = subtrack->next)
{
if (!isSubtrackVisible(subtrack))
continue;
maxWinToDraw = getMaxWindowToDraw(subtrack->tdb);
if (maxWinToDraw > 1 && (winEnd - winStart) > maxWinToDraw)
@@ -4218,31 +4236,30 @@
hPrintf( "}\n");
hPrintf("\n");
}
void jsCommandDispatch(char *command, struct track *trackList)
/* Dispatch a command sent to us from some javaScript event.
* This gets executed after the track list is built, but before
* the track->loadItems methods are called. */
{
if (startsWithWord("makeItems", command))
makeItemsJsCommand(command, trackList, trackHash);
else
warn("Unrecognized jsCommand %s", command);
}
-#ifdef SUBTRACKS_HAVE_VIS
void parentChildCartCleanup(struct track *trackList,struct cart *newCart,struct hash *oldVars)
/* When composite/view settings changes, remove subtrack specific vis
When superTrackChild is found and selected, shape superTrack to match. */
{
struct track *track = trackList;
for (;track != NULL; track = track->next)
{
boolean shapedByubtrackOverride = FALSE;
boolean cleanedByContainerSettings = FALSE;
if (tdbIsContainer(track->tdb))
{
shapedByubtrackOverride = cartTdbTreeMatchSubtrackVis(cart,track->tdb);
if(shapedByubtrackOverride)
track->visibility = tdbVisLimitedByAncestors(cart,track->tdb,TRUE,TRUE);
@@ -4255,31 +4272,30 @@
{ // Need to update track visibility
// Unfortunately, since supertracks are not in trackList, this occurs on superChildren,
// So now we need to find the supertrack and take changed cart values of its children
struct slRef *childRef;
for(childRef = track->tdb->parent->children;childRef != NULL;childRef = childRef->next)
{
struct trackDb * childTdb = childRef->val;
struct track *child = hashFindVal(trackHash, childTdb->track);
char *cartVis = cartOptionalString(cart,child->track);
if (cartVis)
child->visibility = hTvFromString(cartVis);
}
}
}
}
-#endif///def SUBTRACKS_HAVE_VIS
void doTrackForm(char *psOutput, struct tempName *ideoTn)
/* Make the tracks display form with the zoom/scroll buttons and the active
* image. If the ideoTn parameter is not NULL, it is filled in if the
* ideogram is created. */
{
struct group *group;
struct track *track;
char *freezeName = NULL;
boolean hideAll = cgiVarExists("hgt.hideAll");
boolean defaultTracks = cgiVarExists("hgt.reset");
boolean showedRuler = FALSE;
boolean showTrackControls = cartUsualBoolean(cart, "trackControlsOnMain", TRUE);
long thisTime = 0, lastTime = 0;
char *clearButtonJavascript;
@@ -4318,33 +4334,31 @@
uglyTime("Time before getTrackList");
trackList = getTrackList(&groupList, defaultTracks ? -1 : -2);
makeGlobalTrackHash(trackList);
#ifdef SOON
if (measureTiming)
uglyTime("getTrackList");
#endif /* SOON */
// honor defaultImgOrder
if(cgiVarExists("hgt.defaultImgOrder"))
{
char wildCard[32];
safef(wildCard,sizeof(wildCard),"*_%s",IMG_ORDER_VAR);
cartRemoveLike(cart, wildCard);
}
-#ifdef SUBTRACKS_HAVE_VIS
parentChildCartCleanup(trackList,cart,oldVars); // Subtrack settings must be removed when composite/view settings are updated
-#endif///def SUBTRACKS_HAVE_VIS
/* Honor hideAll and visAll variables */
if (hideAll || defaultTracks)
{
int vis = (hideAll ? tvHide : -1);
changeTrackVis(groupList, NULL, vis);
}
/* Before loading items, deal with the next/prev item arrow buttons if pressed. */
if (cgiVarExists("hgt.nextItem"))
doNextPrevItem(TRUE, cgiUsualString("hgt.nextItem", NULL));
else if (cgiVarExists("hgt.prevItem"))
doNextPrevItem(FALSE, cgiUsualString("hgt.prevItem", NULL));