src/hg/hgTracks/multiWig.c 1.4
1.4 2010/05/14 21:35:37 kent
Making click on multi-wig bring up trackUi page.
Index: src/hg/hgTracks/multiWig.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/multiWig.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -b -B -U 1000000 -r1.3 -r1.4
--- src/hg/hgTracks/multiWig.c 13 May 2010 21:42:02 -0000 1.3
+++ src/hg/hgTracks/multiWig.c 14 May 2010 21:35:37 -0000 1.4
@@ -1,138 +1,150 @@
/* A container for multiple wiggles. */
#include "common.h"
#include "hash.h"
#include "linefile.h"
#include "jksql.h"
+#include "dystring.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))
{
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;
- }
+ y += height + 1;
hvGfxUnclip(hvg);
}
}
+char *url = trackUrl(tg->track, chromName);
+mapBoxHgcOrHgGene(hvg, seqStart, seqEnd, xOff, y, width, tg->height, tg->track, tg->track, NULL,
+ url, TRUE, NULL);
}
static int multiWigTotalHeight(struct track *tg, enum trackVisibility vis)
/* Return total height of container. */
{
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))
{
int oneHeight = subtrack->totalHeight(subtrack, vis);
if (!overlay)
{
if (totalHeight != 0)
totalHeight += 1;
totalHeight += oneHeight;
}
}
}
+tg->height = totalHeight;
return totalHeight;
}
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)
*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. */
{
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;
+ y += height+1;
}
}
}
}
+void multiWigLoadItems(struct track *track)
+{
+containerLoadItems(track);
+struct track *subtrack;
+for (subtrack = track->subtracks; subtrack != NULL; subtrack = subtrack->next)
+ {
+ subtrack->mapsSelf = FALSE; /* Round about way to tell wig not to do own mapping. */
+ }
+}
+
void multiWigContainerMethods(struct track *track)
/* Override general container methods for multiWig. */
{
+track->loadItems = multiWigLoadItems;
track->totalHeight = multiWigTotalHeight;
track->drawItems = multiWigDraw;
track->drawLeftLabels = multiWigLeftLabels;
}