8b3716c714d5129845b0f3323cb3596c13d58d1c aamp Mon Feb 7 16:04:03 2011 -0800 Fixed bug to do with next/prev exon mouseover messages not showing the correct number of exons on reverse-strand genes. diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c index ec8582b..defe097 100644 --- src/hg/hgTracks/simpleTracks.c +++ src/hg/hgTracks/simpleTracks.c @@ -1737,68 +1737,75 @@ /* It seems like lf->components isn't necessarily sorted. */ { refAdd(&exonList, exon); exon = exon->next; } /* Now sort it. */ if (next) slSort(&exonList, exonSlRefCmp); else slSort(&exonList, exonSlRefReverseCmp); numExons = slCount(exonList); for (ref = exonList; ref != NULL; ref = ref->next, exonIx++) { char mouseOverText[256]; boolean bigExon = FALSE; + boolean revStrand = (lf->orientation == -1); exon = ref->val; if ((exon->end - exon->start) > (newWinSize - (2 * bufferToEdge))) bigExon = TRUE; if (next && (exon->end > winEnd)) + /* right overhang (but left side of screen in reserve-strand-display) */ { if (exon->start < winEnd) { /* not an intron hanging over edge. */ if ((lf->tallEnd > winEnd) && (lf->tallEnd < exon->end) && (lf->tallEnd > exon->start)) linkedFeaturesMoveWinEnd(lf->tallEnd, bufferToEdge, newWinSize, &newWinStart, &newWinEnd); else linkedFeaturesMoveWinEnd(exon->end, bufferToEdge, newWinSize, &newWinStart, &newWinEnd); } else if (bigExon) linkedFeaturesMoveWinStart(exon->start, bufferToEdge, newWinSize, &newWinStart, &newWinEnd); else linkedFeaturesMoveWinEnd(exon->end, bufferToEdge, newWinSize, &newWinStart, &newWinEnd); - safef(mouseOverText, sizeof(mouseOverText), "%s Feature (%d/%d)", - (revCmplDisp ? "Prev" : "Next"), exonIx+1, numExons); + if (!revStrand) + safef(mouseOverText, sizeof(mouseOverText), "Next Exon (%d/%d)", exonIx+1, numExons); + else + safef(mouseOverText, sizeof(mouseOverText), "Prev Exon (%d/%d)", numExons-exonIx, numExons); mapBoxJumpTo(hvg, x, y, w, h, tg, chromName, newWinStart, newWinEnd, mouseOverText); break; } else if (!next && (exon->start < winStart)) + /* left overhang */ { if (exon->end > winStart) { /* not an inron hanging over the edge. */ if ((lf->tallStart < winStart) && (lf->tallStart > exon->start) && (lf->tallStart < exon->end)) linkedFeaturesMoveWinStart(lf->tallStart, bufferToEdge, newWinSize, &newWinStart, &newWinEnd); else linkedFeaturesMoveWinStart(exon->start, bufferToEdge, newWinSize, &newWinStart, &newWinEnd); } else if (bigExon) linkedFeaturesMoveWinEnd(exon->end, bufferToEdge, newWinSize, &newWinStart, &newWinEnd); else linkedFeaturesMoveWinStart(exon->start, bufferToEdge, newWinSize, &newWinStart, &newWinEnd); - safef(mouseOverText, sizeof(mouseOverText), "%s Feature (%d/%d)", - (revCmplDisp ? "Next" : "Prev"), numExons-exonIx, numExons); + if (!revStrand) + safef(mouseOverText, sizeof(mouseOverText), "Prev Exon (%d/%d)", numExons-exonIx, numExons); + else + safef(mouseOverText, sizeof(mouseOverText), "Next Exon (%d/%d)", exonIx+1, numExons); mapBoxJumpTo(hvg, x, y, w, h, tg, chromName, newWinStart, newWinEnd, mouseOverText); break; } } slFreeList(&exonList); } void linkedFeaturesLabelNextPrevItem(struct track *tg, boolean next) /* Default next-gene function for linkedFeatures. Changes winStart/winEnd * and updates position in cart. */ { int start = winStart; int end = winEnd; int size = winBaseCount; int sizeWanted = size;