src/hg/hgTracks/hgTracks.c 1.1577
1.1577 2009/06/26 20:24:57 tdreszer
Inital checkin of imageV2, but ifdef'd out.
Index: src/hg/hgTracks/hgTracks.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/hgTracks.c,v
retrieving revision 1.1576
retrieving revision 1.1577
diff -b -B -U 4 -r1.1576 -r1.1577
--- src/hg/hgTracks/hgTracks.c 26 Jun 2009 14:49:43 -0000 1.1576
+++ src/hg/hgTracks/hgTracks.c 26 Jun 2009 20:24:57 -0000 1.1577
@@ -42,8 +42,10 @@
#include "mafTrack.h"
#include "hgConfig.h"
#include "encode.h"
#include "agpFrag.h"
+#include "imageV2.h"
+
static char const rcsid[] = "$Id$";
/* These variables persist from one incarnation of this program to the
@@ -282,13 +284,26 @@
{
x = hvGfxAdjXW(hvg, x, width);
char *encodedName = cgiEncode(name);
+#ifdef IMAGEv2_UI
+if(curMap != NULL)
+ {
+ char link[512];
+ safef(link,sizeof(link),"%s?%s=%u&c=%s&g=%s",
+ hgTrackUiName(), cartSessionVarName(),cartSessionId(cart), chromName, encodedName);
+ char title[128];
+ safef(title,sizeof(title),"%s controls", shortLabel);
+ // Add map item to currnent map (TODO: pass in map)
+ mapSetItemAdd(curMap,link,title,x, y, x+width, y+height);
+ }
+#else//ifndef IMAGEv2_UI
hPrintf("<AREA SHAPE=RECT COORDS=\"%d,%d,%d,%d\" ", x, y, x+width, y+height);
hPrintf("HREF=\"%s?%s=%u&c=%s&g=%s\"", hgTrackUiName(), cartSessionVarName(),
cartSessionId(cart), chromName, encodedName);
mapStatusMessage("%s controls", shortLabel);
hPrintf(">\n");
+#endif//ndef IMAGEv2_UI
freeMem(encodedName);
}
static void mapBoxToggleComplement(struct hvGfx *hvg, int x, int y, int width, int height,
@@ -298,16 +313,27 @@
* "complement" to complement the DNA bases at the top by the ruler*/
{
struct dyString *ui = uiStateUrlPart(toggleGroup);
x = hvGfxAdjXW(hvg, x, width);
+#ifdef IMAGEv2_UI
+if(curMap != NULL)
+ {
+ char link[512];
+ safef(link,sizeof(link),"%s?complement_%s=%d&%s",
+ hgTracksName(), database, !cartUsualBooleanDb(cart, database, COMPLEMENT_BASES_VAR, FALSE),ui->string);
+ // Add map item to currnent map (TODO: pass in map)
+ mapSetItemAdd(curMap,link,(char *)(message != NULL?message:NULL),x, y, x+width, y+height);
+ }
+#else//ifndef IMAGEv2_UI
hPrintf("<AREA SHAPE=RECT COORDS=\"%d,%d,%d,%d\" ", x, y, x+width, y+height);
hPrintf("HREF=\"%s?complement_%s=%d",
hgTracksName(), database, !cartUsualBooleanDb(cart, database, COMPLEMENT_BASES_VAR, FALSE));
hPrintf("&%s\"", ui->string);
freeDyString(&ui);
if (message != NULL)
mapStatusMessage("%s", message);
hPrintf(">\n");
+#endif//ndef IMAGEv2_UI
}
void smallBreak()
/* Draw small horizontal break */
@@ -1514,9 +1540,9 @@
int trackPastTabX = (withLeftLabels ? trackTabWidth : 0);
int trackTabX = gfxBorder;
int trackPastTabWidth = tl.picWidth - trackPastTabX;
int pixWidth, pixHeight;
-int y;
+int y=0;
int titleHeight = fontHeight;
int scaleBarPad = 2;
int scaleBarHeight = fontHeight;
int scaleBarTotalHeight = fontHeight + 2 * scaleBarPad;
@@ -1537,8 +1563,19 @@
trackHash = newHash(8);
/* Figure out dimensions and allocate drawing space. */
pixWidth = tl.picWidth;
+#ifdef IMAGEv2_UI
+// Start an imagebox (temproarily global in order to avoid massive changes)
+theImgBox = imgBoxStart(database,chromName,winStart,winEnd,(!revCmplDisp),withLeftLabels,pixWidth);
+int sideSliceWidth = 0; // Just being explicit
+int dataSliceWidth = 0;
+int sideSliceOffsetX = 0;
+int dataSliceOffsetX = 0;
+int sliceHeight = 0;
+int sliceOffsetY = 0;
+#endif//def IMAGEv2_UI
+
if (rulerMode != tvFull)
{
rulerCds = FALSE;
}
@@ -1645,8 +1682,15 @@
else
{
trashDirFile(&gifTn, "hgt", "hgt", ".gif");
hvg = hvGfxOpenGif(pixWidth, pixHeight, gifTn.forCgi);
+ #ifdef IMAGEv2_UI
+ // Adds one single image for all tracks (TODO: build the track by track images)
+ theOneImg = imgBoxImageAdd(theImgBox,gifTn.forHtml,
+ (char *)(dragZooming?"click or drag mouse in base position track to zoom in" : NULL),
+ pixWidth, pixHeight,FALSE);
+ //curMap = imgMapStart(theOneImg,"theOne",NULL); // No common linkRoot (TODO: Drop image map in favor of slice maps)
+ #endif//def IMAGEv2_UI
}
hvg->rc = revCmplDisp;
initColors(hvg);
@@ -1658,8 +1702,18 @@
leftLabelX = gfxBorder;
leftLabelWidth = insideX - gfxBorder*3;
+#ifdef IMAGEv2_UI
+if (withLeftLabels)
+ {
+ sideSliceWidth = leftLabelWidth + 2; // Just being explicit
+ sideSliceOffsetX = 0; // FIXME: Reverse?
+ }
+dataSliceWidth = tl.picWidth - sideSliceWidth;
+dataSliceOffsetX = sideSliceWidth; // FIXME: Reverse?
+#endif//def IMAGEv2_UI
+
/* Draw mini-buttons. */
if (withLeftLabels && psOutput == NULL)
{
int butOff;
@@ -1671,8 +1725,18 @@
/* draw button for Base Position pseudo-track */
int height = basePositionHeight;
if (rulerCds)
height += rulerTranslationHeight;
+ #ifdef IMAGEv2_UI
+ {
+ // Start Track, Add slice and start mapping the slice
+ sliceHeight = height + 1;
+ sliceOffsetY = 0;
+ curImgTrack = imgBoxTrackFindOrAdd(theImgBox,NULL,RULER_TRACK_NAME,rulerMode,FALSE,FALSE); // No tdb, no centerlabel, not reorderable
+ curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+ curMap = sliceMapFindOrStart(curSlice,RULER_TRACK_NAME,NULL); // No common linkRoot
+ }
+ #endif//def IMAGEv2_UI
drawGrayButtonBox(hvg, trackTabX, y, trackTabWidth, height, TRUE);
mapBoxTrackUi(hvg, trackTabX, y, trackTabWidth, height,
RULER_TRACK_NAME, RULER_TRACK_LABEL);
y += height + 1;
@@ -1696,12 +1760,22 @@
else
drawBlueButtonBox(hvg, trackTabX, yStart, trackTabWidth,
h, track->hasUi);
if (track->hasUi)
+ {
+ #ifdef IMAGEv2_UI
+ // Start Track, Add slice and start mapping the slice
+ sliceHeight = h;
+ sliceOffsetY = yStart;
+ curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),TRUE);
+ curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+ curMap = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+ #endif//def IMAGEv2_UI
mapBoxTrackUi(hvg, trackTabX, yStart, trackTabWidth, h,
track->mapName, track->shortLabel);
}
}
+ }
butOff = trackTabX + trackTabWidth;
leftLabelX += butOff;
leftLabelWidth -= butOff;
}
@@ -1714,8 +1788,18 @@
gfxBorder, pixHeight, lightRed);
y = gfxBorder;
if (rulerMode != tvHide)
{
+ #ifdef IMAGEv2_UI
+ {
+ // Start Track, Add slice and start mapping the slice
+ sliceHeight = basePositionHeight + (rulerCds ? rulerTranslationHeight : 0) + 1;
+ sliceOffsetY = 0;
+ curImgTrack = imgBoxTrackFindOrAdd(theImgBox,NULL,RULER_TRACK_NAME,rulerMode,FALSE,FALSE); // No tdb, no centerlabel,not reorderable
+ curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+ curMap = sliceMapFindOrStart(curSlice,RULER_TRACK_NAME,NULL); // No common linkRoot
+ }
+ #endif//def IMAGEv2_UI
if (baseTitle)
{
hvGfxTextRight(hvg, leftLabelX, y, leftLabelWidth-1, titleHeight,
MG_BLACK, font, WIN_TITLE_LABEL);
@@ -1771,8 +1855,20 @@
for (track = trackList; track != NULL; track = track->next)
{
if (track->limitedVis == tvHide)
continue;
+ #ifdef IMAGEv2_UI
+ {
+ // FIXME: Notice I am treating all subtracks as indivisible from their composite
+ // This will need to change to allow drag and drop. Until then the subtrack center labels will drag scroll while the composte will not.
+ // But as soon as subtracks are individual image tracks: problems with buttons, left labels, center labels, drag and drop, etc.
+ sliceHeight = trackPlusLabelHeight(track, fontHeight);
+ sliceOffsetY = y;
+ curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),TRUE);
+ curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+ curMap = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+ }
+ #endif//def IMAGEv2_UI
if (trackIsCompositeWithSubtracks(track)) //TODO: Change when tracks->subtracks are always set for composite
{
struct track *subtrack;
if (isWithCenterLabels(track))
@@ -1797,8 +1893,16 @@
/* Draw guidelines. */
if (withGuidelines)
{
+ #ifdef IMAGEv2_UI
+ // TODO: We should be making transparent data images and a separate background img for guidelines.
+ // This will allow the guidelines to dragscroll while the center labels are static.
+ // NOTE: The background image could easily be a reusable file, based upon zoom level and width. Height could propbaby easily be stretched.
+ // struct image *bgImg = imgBoxImageAdd(theImgBox,gifBg.forHtml,
+ // (char *)(dragZooming?"click or drag mouse in base position track to zoom in" : NULL),
+ // pixWidth, pixHeight,FALSE);
+ #endif//def IMAGEv2_UI
int height = pixHeight - 2*gfxBorder;
int x;
Color lightBlue = hvGfxFindRgb(hvg, &guidelineColor);
@@ -1812,8 +1916,17 @@
/* Show ruler at top. */
if (rulerMode != tvHide)
{
+ #ifdef IMAGEv2_UI
+ {
+ sliceHeight = basePositionHeight + (rulerCds ? rulerTranslationHeight : 0) + 1;
+ sliceOffsetY = 0;
+ curImgTrack = imgBoxTrackFindOrAdd(theImgBox,NULL,RULER_TRACK_NAME,rulerMode,FALSE,FALSE); // No tdb, no centerlabel,not reorderable
+ curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,NULL,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+ curMap = sliceMapFindOrStart(curSlice,RULER_TRACK_NAME,NULL); // No common linkRoot
+ }
+ #endif//def IMAGEv2_UI
struct dnaSeq *seq = NULL;
int rulerClickY = 0;
rulerClickHeight = rulerHeight;
@@ -2029,22 +2142,44 @@
{
struct track *subtrack;
if (track->limitedVis == tvHide)
continue;
+ #ifdef IMAGEv2_UI
+ //if (isWithCenterLabels(track)) // NOTE: Since track may not have centerlabel but subtrack may (How?), then must always make this slice!
+ {
+ // FIXME: Notice I am treating all subtracks as indivisible from their composite
+ // This will need to change to allow drag and drop. Until then the subtrack center labels will drag scroll while the composte will not.
+ // But as soon as subtracks are individual image tracks: problems with buttons, left labels, center labels, drag and drop, etc.
+ sliceHeight = fontHeight;
+ sliceOffsetY = y;
+ curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),TRUE);
+ curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,isCenter,theOneImg,NULL,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+ curMap = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+ }
+ #endif//def IMAGEv2_UI
if (trackIsCompositeWithSubtracks(track)) //TODO: Change when tracks->subtracks are always set for composite
{
if (isWithCenterLabels(track))
- y = doCenterLabels(track, track, hvg, font, y)
- - track->height; /* subtrack heights tallied below: */
- for (subtrack = track->subtracks; subtrack != NULL;
- subtrack = subtrack->next)
+ y = doCenterLabels(track, track, hvg, font, y) - track->height; /* subtrack heights tallied below: */
+ #ifdef IMAGEv2_UI
+ {
+ // FIXME: This special case allows the subtrack center label map items to be put into the data slice
+ // When subtracks are carved up into individual imgTracks, then this will not be necessary
+ sliceHeight = trackPlusLabelHeight(track, fontHeight) - fontHeight;
+ sliceOffsetY = y;
+ curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,NULL,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+ curMap = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+ }
+ #endif//def IMAGEv2_UI
+ for (subtrack = track->subtracks; subtrack != NULL; subtrack = subtrack->next)
+ {
if (isSubtrackVisible(subtrack))
{
if (isWithCenterLabels(subtrack))
y = doCenterLabels(subtrack, track, hvg, font, y);
else
- y += subtrack->totalHeight(subtrack,
- subtrack->limitedVis);
+ y += subtrack->totalHeight(subtrack,subtrack->limitedVis);
+ }
}
}
else
y = doCenterLabels(track, track, hvg, font, y);
@@ -2061,18 +2196,31 @@
for (track = trackList; track != NULL; track = track->next)
{
if (track->limitedVis == tvHide)
continue;
+ #ifdef IMAGEv2_UI
+ {
+ // FIXME: Notice I am treating all subtracks as indivisible from their composite
+ // This will need to change to allow drag and drop. Until then the subtrack center labels will drag scroll while the composte will not.
+ // But as soon as subtracks are individual image tracks: problems with buttons, left labels, center labels, drag and drop, etc.
+ sliceHeight = trackPlusLabelHeight(track, fontHeight) - (isWithCenterLabels(track) ? fontHeight : 0);
+ sliceOffsetY = y + (isWithCenterLabels(track) ? fontHeight : 0);
+ curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),TRUE);
+ curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,NULL,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+ curMap = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+ }
+ #endif//def IMAGEv2_UI
if (trackIsCompositeWithSubtracks(track)) //TODO: Change when tracks->subtracks are always set for composite
{
struct track *subtrack;
if (isWithCenterLabels(track))
y += fontHeight;
- for (subtrack = track->subtracks; subtrack != NULL;
- subtrack = subtrack->next)
+ for (subtrack = track->subtracks; subtrack != NULL;subtrack = subtrack->next)
+ {
if (isSubtrackVisible(subtrack))
y = doDrawItems(subtrack, hvg, font, y, &lastTime);
}
+ }
else
y = doDrawItems(track, hvg, font, y, &lastTime);
}
}
@@ -2085,8 +2233,20 @@
for (track = trackList; track != NULL; track = track->next)
{
if (track->limitedVis == tvHide)
continue;
+ #ifdef IMAGEv2_UI
+ {
+ // FIXME: Notice I am treating all subtracks as indivisible from their composite
+ // This will need to change to allow drag and drop. Until then the subtrack center labels will drag scroll while the composte will not.
+ // But as soon as subtracks are individual image tracks: problems with buttons, left labels, center labels, drag and drop, etc.
+ sliceHeight = trackPlusLabelHeight(track, fontHeight);
+ sliceOffsetY = y;
+ curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),TRUE);
+ curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+ curMap = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+ }
+ #endif//def IMAGEv2_UI
if (trackIsCompositeWithSubtracks(track)) //TODO: Change when tracks->subtracks are always set for composite
{
struct track *subtrack;
if (isWithCenterLabels(track))
@@ -2135,15 +2295,19 @@
}
/* Save out picture and tell html file about it. */
hvGfxClose(&hvg);
+#ifdef IMAGEv2_UI
+imageBoxDraw(theImgBox);
+imgBoxFree(&theImgBox);
+#else//ifndef IMAGEv2_UI
char *titleAttr = dragZooming ? "title='click or drag mouse in base position track to zoom in'" : "";
hPrintf("<IMG SRC = \"%s\" BORDER=1 WIDTH=%d HEIGHT=%d USEMAP=#%s %s id='trackMap'",
gifTn.forHtml, pixWidth, pixHeight, mapName, titleAttr);
hPrintf("><BR>\n");
+#endif//ndef IMAGEv2_UI
}
-
static void printEnsemblAnchor(char *database, char* archive,
char *chrName, int start, int end)
/* Print anchor to Ensembl display on same window. */
{