src/hg/hgTracks/multiWig.c 1.3
1.3 2010/05/13 21:42:02 kent
Making it so that multi-wigs can draw without overlay as well.
Index: src/hg/hgTracks/multiWig.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/multiWig.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -b -B -U 1000000 -r1.2 -r1.3
--- src/hg/hgTracks/multiWig.c 9 May 2010 17:27:11 -0000 1.2
+++ src/hg/hgTracks/multiWig.c 13 May 2010 21:42:02 -0000 1.3
@@ -1,73 +1,138 @@
/* A container for multiple wiggles. */
#include "common.h"
#include "hash.h"
#include "linefile.h"
#include "jksql.h"
#include "hdb.h"
#include "hgTracks.h"
#include "container.h"
#include "wigCommon.h"
+#include "hui.h"
+
+static boolean isOverlayTypeAggregate(char *aggregate)
+/* Return TRUE if aggregater type is one of the overlay ones. */
+{
+if (aggregate == NULL)
+ return FALSE;
+return differentString(aggregate, WIG_AGGREGATE_NONE);
+}
+
static void multiWigDraw(struct track *tg, int seqStart, int seqEnd,
struct hvGfx *hvg, int xOff, int yOff, int width,
MgFont *font, Color color, enum trackVisibility vis)
/* Draw items in container. */
{
struct track *subtrack;
+char *aggregate = cartOrTdbString(cart, tg->tdb, "aggregate", NULL);
+boolean overlay = isOverlayTypeAggregate(aggregate);
+int y = yOff;
for (subtrack = tg->subtracks; subtrack != NULL; subtrack = subtrack->next)
{
if (isSubtrackVisible(subtrack))
- subtrack->drawItems(subtrack, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis);
+ {
+ int height = subtrack->totalHeight(subtrack, vis);
+ hvGfxSetClip(hvg, xOff, y, width, height);
+ if (overlay)
+ subtrack->lineHeight = tg->lineHeight;
+ subtrack->drawItems(subtrack, seqStart, seqEnd, hvg, xOff, y, width, font, color, vis);
+ if (!overlay)
+ {
+ y += height;
+ y += 1;
+ }
+ hvGfxUnclip(hvg);
+ }
}
}
static int multiWigTotalHeight(struct track *tg, enum trackVisibility vis)
/* Return total height of container. */
{
-int totalHeight = wigTotalHeight(tg, vis);
+char *aggregate = cartOrTdbString(cart, tg->tdb, "aggregate", NULL);
+boolean overlay = isOverlayTypeAggregate(aggregate);
+int totalHeight = 0;
+if (overlay)
+ totalHeight = wigTotalHeight(tg, vis);
struct track *subtrack;
for (subtrack = tg->subtracks; subtrack != NULL; subtrack = subtrack->next)
+ {
if (isSubtrackVisible(subtrack))
- subtrack->totalHeight(subtrack, vis);
+ {
+ int oneHeight = subtrack->totalHeight(subtrack, vis);
+ if (!overlay)
+ {
+ if (totalHeight != 0)
+ totalHeight += 1;
+ totalHeight += oneHeight;
+ }
+ }
+ }
return totalHeight;
}
-static boolean graphLimitsAllSame(struct track *trackList)
+static boolean graphLimitsAllSame(struct track *trackList, struct track **retFirstTrack)
/* Return TRUE if graphUpperLimit and graphLowerLimit same for all tracks. */
{
struct track *firstTrack = NULL;
struct track *track;
for (track = trackList; track != NULL; track = track->next)
{
if (isSubtrackVisible(track))
{
if (firstTrack == NULL)
- firstTrack = track;
+ *retFirstTrack = firstTrack = track;
else if (track->graphUpperLimit != firstTrack->graphUpperLimit
|| track->graphLowerLimit != firstTrack->graphLowerLimit)
return FALSE;
}
}
return firstTrack != NULL;
}
static void multiWigLeftLabels(struct track *tg, int seqStart, int seqEnd,
struct hvGfx *hvg, int xOff, int yOff, int width, int height,
boolean withCenterLabels, MgFont *font, Color color,
enum trackVisibility vis)
/* Draw left labels - by deferring to first subtrack. */
{
-boolean showNumbers = graphLimitsAllSame(tg->subtracks);
-wigLeftAxisLabels(tg, seqStart, seqEnd, hvg, xOff, yOff, width, height, withCenterLabels,
- font, color, vis, tg->shortLabel, tg->subtracks->graphUpperLimit,
- tg->subtracks->graphLowerLimit, showNumbers);
+char *aggregate = cartOrTdbString(cart, tg->tdb, "aggregate", NULL);
+boolean overlay = isOverlayTypeAggregate(aggregate);
+if (overlay)
+ {
+ struct track *firstVisibleSubtrack = NULL;
+ boolean showNumbers = graphLimitsAllSame(tg->subtracks, &firstVisibleSubtrack);
+ struct track *subtrack = (showNumbers ? firstVisibleSubtrack : tg->subtracks);
+ wigLeftAxisLabels(tg, seqStart, seqEnd, hvg, xOff, yOff, width, height, withCenterLabels,
+ font, color, vis, tg->shortLabel, subtrack->graphUpperLimit,
+ subtrack->graphLowerLimit, showNumbers);
+ }
+else
+ {
+ struct track *subtrack;
+ int y = yOff;
+ if (withCenterLabels)
+ y += tl.fontHeight+1;
+ for (subtrack = tg->subtracks; subtrack != NULL; subtrack = subtrack->next)
+ {
+ if (isSubtrackVisible(subtrack))
+ {
+ int height = subtrack->totalHeight(subtrack, vis);
+ wigLeftAxisLabels(subtrack, seqStart, seqEnd, hvg, xOff, y, width, height, withCenterLabels,
+ font, subtrack->ixColor, vis, subtrack->shortLabel, subtrack->graphUpperLimit,
+ subtrack->graphLowerLimit, TRUE);
+ y += height;
+ y += 1;
+ }
+ }
+ }
}
void multiWigContainerMethods(struct track *track)
/* Override general container methods for multiWig. */
{
track->totalHeight = multiWigTotalHeight;
track->drawItems = multiWigDraw;
track->drawLeftLabels = multiWigLeftLabels;
}