f1065efe3aadb9b2f83c1a3a0a48afd9a47d9153 braney Mon Mar 1 15:57:17 2021 -0800 implement wiggleWindow that forces a track into density coverage mode when the window exceeds a specified width diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c index 56b7f8e..07d9b09 100644 --- src/hg/hgTracks/simpleTracks.c +++ src/hg/hgTracks/simpleTracks.c @@ -350,40 +350,54 @@ /* Temporary function until all composite tracks point to their own children */ { return (tdbIsComposite(track->tdb) && track->subtracks != NULL); } Color slightlyLighterColor(struct hvGfx *hvg, Color color) /* Get slightly lighter shade of a color - closer to gray actually */ { struct rgbColor rgbColor = hvGfxColorIxToRgb(hvg, color); rgbColor.r = (rgbColor.r+128)/2; rgbColor.g = (rgbColor.g+128)/2; rgbColor.b = (rgbColor.b+128)/2; return hvGfxFindColorIx(hvg, rgbColor.r, rgbColor.g, rgbColor.b); } -void checkIfWiggling(struct cart *cart, struct track *tg) -/* Check to see if a linkedFeatures track should be drawing as a wiggle. */ +boolean checkIfWiggling(struct cart *cart, struct track *tg) +/* Check to see if a track should be drawing as a wiggle. */ { boolean doWiggle = cartOrTdbBoolean(cart, tg->tdb, "doWiggle" , FALSE); + +if (!doWiggle) + { + char *setting = trackDbSetting(tg->tdb, "wiggleWindow" ); + if (setting) + { + unsigned size = sqlUnsigned(setting); + if ((size > 0) && ((winEnd - winStart) > size)) + doWiggle = TRUE; + } + } + if (doWiggle) { tg->drawLeftLabels = wigLeftLabels; tg->colorShades = shadesOfGray; tg->mapsSelf = TRUE; } + +return doWiggle; } struct sameItemNode /* sameItem node */ { struct sameItemNode *next; /* next node */ struct window *window; /* in which window - can use to detect duplicate keys */ void *item; struct spaceSaver *ss; bool done; /* have we (reversed the list and) processed it yet? */ }; struct spaceSaver *findSpaceSaver(struct track *tg, enum trackVisibility vis) /* Find SpaceSaver in list. Return spaceSaver found or NULL. */ @@ -724,31 +738,31 @@ { int answer = maxItemsToUseOverflowDefault; char *maxItemsString = trackDbSetting(tg->tdb, "maxItemsToOverflow"); if (maxItemsString != NULL) answer = sqlUnsigned(maxItemsString); return answer; } int tgFixedTotalHeightOptionalOverflow(struct track *tg, enum trackVisibility vis, int lineHeight, int heightPer, boolean allowOverflow) /* Most fixed height track groups will use this to figure out the height * they use. */ { -boolean doWiggle = cartOrTdbBoolean(cart, tg->tdb, "doWiggle" , FALSE); +boolean doWiggle = checkIfWiggling(cart, tg); if (doWiggle) { struct wigCartOptions *wigCart = tg->wigCartData; if (tg->wigCartData == NULL) { // fake the trackDb range for this auto-wiggle int wordCount = 3; char *words[3]; words[0] = "bedGraph"; wigCart = wigCartOptionsNew(cart, tg->tdb, wordCount, words ); tg->wigCartData = (void *) wigCart; } return wigTotalHeight(tg, vis); } @@ -4740,31 +4754,31 @@ } } void genericDrawItems(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis) /* Draw generic item list. Features must be fixed height * and tg->drawItemAt has to be filled in. */ { withIndividualLabels = TRUE; // set this back to default just in case someone left it false (I'm looking at you pgSnp) if (tg->mapItem == NULL) tg->mapItem = genericMapItem; if (vis != tvDense && baseColorCanDraw(tg)) baseColorInitTrack(hvg, tg); -boolean doWiggle = cartOrTdbBoolean(cart, tg->tdb, "doWiggle" , FALSE); +boolean doWiggle = checkIfWiggling(cart, tg); if (doWiggle) { genericDrawItemsWiggle(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis); } else if (vis == tvPack || vis == tvSquish || (vis == tvFull && isTypeBedLike(tg))) { genericDrawItemsPackSquish(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis); } else genericDrawItemsFullDense(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis); }