src/hg/hgTracks/hgTracks.c 1.1622
1.1622 2010/02/09 00:11:34 tdreszer
Changes that I have been sitting on awhile. More info on unexpected errors. Fixes to dragReorder. Support for simpler navigation links.
Index: src/hg/hgTracks/hgTracks.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/hgTracks.c,v
retrieving revision 1.1621
retrieving revision 1.1622
diff -b -B -U 4 -r1.1621 -r1.1622
--- src/hg/hgTracks/hgTracks.c 3 Feb 2010 18:43:38 -0000 1.1621
+++ src/hg/hgTracks/hgTracks.c 9 Feb 2010 00:11:34 -0000 1.1622
@@ -64,9 +64,11 @@
boolean hasCustomTracks = FALSE; /* whether any custom tracks are for this db*/
struct slName *browserLines = NULL; /* Custom track "browser" lines. */
boolean withNextItemArrows = FALSE; /* Display next feature (gene) navigation buttons near center labels? */
+#ifndef IMAGEv2_DRAG_REORDER
boolean withPriorityOverride = FALSE; /* Display priority for each track to allow reordering */
+#endif//ndef IMAGEv2_DRAG_REORDER
int gfxBorder = hgDefaultGfxBorder; /* Width of graphics border. */
int guidelineSpacing = 12; /* Pixels between guidelines. */
@@ -215,25 +217,29 @@
if (tdbIsSuperTrackChild(tdb) || tdbIsCompositeChild(tdb))
{
assert(tdb->parent != NULL && tdb->parent->tableName);
cartRemove(cart, tdb->parent->tableName);
+ #ifndef IMAGEv2_DRAG_REORDER
if (withPriorityOverride)
{
safef(pname, sizeof(pname), "%s.priority",tdb->parent->tableName);
cartRemove(cart, pname);
}
+ #endif//ndef IMAGEv2_DRAG_REORDER
}
track->visibility = tdb->visibility;
cartRemove(cart, track->mapName);
/* set the track priority back to the default value */
+ #ifndef IMAGEv2_DRAG_REORDER
if (withPriorityOverride)
{
safef(pname, sizeof(pname), "%s.priority",track->mapName);
cartRemove(cart, pname);
track->priority = track->defaultPriority;
}
+ #endif//ndef IMAGEv2_DRAG_REORDER
}
else
{
/* change to specified visibility */
@@ -295,8 +301,9 @@
char title[256];
safef(title,sizeof(title),"%s controls", shortLabel);
struct imgSlice *curSlice = imgTrackSliceGetByType(curImgTrack,stButton);
+ if(curSlice)
sliceAddLink(curSlice,link,title);
}
else
{
@@ -2212,11 +2219,8 @@
continue;
if(theImgBox)
{
// side label slice for tracks
- // 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 = imgBoxTrackFind(theImgBox,track->tdb,NULL);
curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,stSide,theOneImg,NULL,sliceWidth[stSide],sliceHeight,sliceOffsetX[stSide],sliceOffsetY);
@@ -2315,11 +2319,8 @@
if(theImgBox)
{
//if (isWithCenterLabels(track)) // NOTE: Since track may not have centerlabel but subtrack may (How?), then must always make this slice!
// center label slice of tracks
- // 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 = imgBoxTrackFind(theImgBox,track->tdb,NULL);
curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,stCenter,theOneImg,NULL,sliceWidth[stData],sliceHeight,sliceOffsetX[stData],sliceOffsetY);
@@ -2332,10 +2333,8 @@
y = doCenterLabels(track, track, hvg, font, y) - track->height; /* subtrack heights tallied below: */
if(theImgBox)
{
// Special case: data slice of tracks
- // 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,stData,theOneImg,NULL,sliceWidth[stData],sliceHeight,sliceOffsetX[stData],sliceOffsetY);
curMap = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
@@ -2381,11 +2380,8 @@
int yEnd = y + trackPlusLabelHeight(track, fontHeight);
if(theImgBox)
{
// data slice of tracks
- // 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.
sliceOffsetY = yStart;
sliceHeight = yEnd - yStart - 1;
curImgTrack = imgBoxTrackFind(theImgBox,track->tdb,NULL);
if(sliceHeight > 0)
@@ -2438,11 +2434,8 @@
continue;
if(theImgBox)
{
// side label slice of tracks
- // 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 = imgBoxTrackFind(theImgBox,track->tdb,NULL);
curSlice = imgTrackSliceUpdateOrAdd(curImgTrack,stSide,theOneImg,NULL,sliceWidth[stSide],sliceHeight,sliceOffsetX[stSide],sliceOffsetY);
@@ -3663,23 +3656,25 @@
struct track *track;
struct trackRef *tr;
struct grp* grps = hLoadGrps(database);
struct grp *grp;
-char cartVar[512];
/* build group objects from database. */
for (grp = grps; grp != NULL; grp = grp->next)
{
/* deal with group reordering */
float priority = grp->priority;
+ #ifndef IMAGEv2_DRAG_REORDER
if (withPriorityOverride)
{
+ char cartVar[512];
safef(cartVar, sizeof(cartVar), "%s.priority",grp->name);
if (vis != -1)
priority = (float)cartUsualDouble(cart, cartVar, grp->priority);
if (priority == grp->priority)
cartRemove(cart, cartVar);
}
+ #endif//ndef IMAGEv2_DRAG_REORDER
/* create group object; add to list and hash */
AllocVar(group);
group->name = cloneString(grp->name);
group->label = cloneString(grp->label);
@@ -3694,8 +3689,9 @@
/* Loop through tracks and fill in their groups.
* If necessary make up an unknown group. */
for (track = *pTrackList; track != NULL; track = track->next)
{
+#ifndef IMAGEv2_DRAG_REORDER
/* handle track reordering feature -- change group assigned to track */
if (withPriorityOverride)
{
char *groupName = NULL;
@@ -3744,8 +3740,9 @@
cartRemove(cart, cartVar);
*/
track->priority = priority;
}
+#endif//ndef IMAGEv2_DRAG_REORDER
/* assign group object to track */
if (track->groupName == NULL)
group = NULL;
@@ -4336,8 +4333,9 @@
/* This is a clear submit button that browsers will use by default when enter is pressed in position box. */
hPrintf("<INPUT TYPE=IMAGE BORDER=0 NAME=\"hgt.dummyEnterButton\" src=\"../images/DOT.gif\">");
/* Put up scroll and zoom controls. */
+#ifndef USE_NAVIGATION_LINKS
hWrites("move ");
hButtonWithMsg("hgt.left3", "<<<", "move 95% to the left");
hButtonWithMsg("hgt.left2", " <<", "move 47.5% to the left");
hButtonWithMsg("hgt.left1", " < ", "move 10% to the left");
@@ -4354,8 +4352,9 @@
topButton("hgt.out1", ZOOM_1PT5X);
topButton("hgt.out2", ZOOM_3X);
topButton("hgt.out3", ZOOM_10X);
hWrites("<BR>\n");
+#endif//ndef USE_NAVIGATION_LINKS
if (showTrackControls)
{
/* Break into a second form so that zooming and scrolling
@@ -4418,8 +4417,44 @@
/* Make chromsome ideogram gif and map. */
makeChromIdeoImage(&trackList, psOutput, ideoTn);
+#ifdef USE_NAVIGATION_LINKS
+ hPrintf("<table style='font-size:small;width:%dpx'><tr align='center'>",min(tl.picWidth, 800));
+ #ifndef IMAGEv2_DRAG_SCROLL
+ //if(!advancedJavascriptFeaturesEnabled(cart))
+ {
+ hPrintf("<td width='60'><a href='?hgt.left3=1' title='move 95% to the left'><<<</a>\n");
+ hPrintf("<td width='50'><a href='?hgt.left2=1' title='move 47.5% to the left'><<</a>\n");
+ hPrintf("<td width='40'><a href='?hgt.left1=1' title='move 10% to the left'><</a>\n");
+ hPrintf("<td width='50'> </td>\n");
+ }
+ #endif//ndef IMAGEv2_DRAG_SCROLL
+ if(!advancedJavascriptFeaturesEnabled(cart))
+ {
+ hPrintf("<td width='60' ><a href='?hgt.in1=1' title='zoom out 1.5x'>> <</a>\n");
+ hPrintf("<td width='80' ><a href='?hgt.in2=1' title='zoom out 3x'>>> <<</a>\n");
+ hPrintf("<td width='100'><a href='?hgt.in3=1' title='zoom out 10x'>>>> <<<</a>\n");
+ hPrintf("<td width='50'> \n");
+ hPrintf("<td width='50'><a href='?hgt.inBase=1' title='zoom in to base range'>ACGT</a>\n");
+ hPrintf("<td width='50'> \n");
+ }
+ hPrintf("<td width='60' ><a href='?hgt.out1=1' title='zoom out 1.5x'>< ></a>\n");
+ hPrintf("<td width='80' ><a href='?hgt.out2=1' title='zoom out 3x'><< >></a>\n");
+ hPrintf("<td width='100'><a href='?hgt.out3=1' title='zoom out 10x'><<< >>></a>\n");
+ hPrintf("<td width='50'> \n");
+ #ifndef IMAGEv2_DRAG_SCROLL
+ //if(!advancedJavascriptFeaturesEnabled(cart))
+ {
+ hPrintf("<td width='40'><a href='?hgt.right1=1' title='move 10% to the right'>></a>\n");
+ hPrintf("<td width='50'><a href='?hgt.right2=1' title='move 47.5% to the right'>>></a>\n");
+ hPrintf("<td width='60'><a href='?hgt.right3=1' title='move 95% to the right'>>>></a>\n");
+ }
+ #endif//ndef IMAGEv2_DRAG_SCROLL
+ /* use button maker that determines padding, so we can share constants */
+ hPrintf("</tr></table>\n");
+#endif//def USE_NAVIGATION_LINKS
+
/* Make clickable image and map. */
makeActiveImage(trackList, psOutput);
fflush(stdout);
@@ -4434,16 +4469,16 @@
/* note a trick of WIDTH=27 going on here. The 6,15,6 widths following
* go along with this trick */
hPrintf("<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=1 WIDTH=%d COLS=%d><TR>\n",
tl.picWidth, 27);
-#ifndef IMAGEv2_DRAG_SCROLL
+#if !defined(IMAGEv2_DRAG_SCROLL) && !defined(USE_NAVIGATION_LINKS)
hPrintf("<TD COLSPAN=6 ALIGN=CENTER NOWRAP>");
hPrintf("move start<BR>");
hButton("hgt.dinkLL", " < ");
hTextVar("dinkL", cartUsualString(cart, "dinkL", "2.0"), 3);
hButton("hgt.dinkLR", " > ");
hPrintf("</TD>");
-#endif//ndef IMAGEv2_DRAG_SCROLL
+#endif//ndef !defined(IMAGEv2_DRAG_SCROLL) && !defined(USE_NAVIGATION_LINKS)
hPrintf("<TD COLSPAN=15 style=\"white-space:normal\">"); // allow this text to wrap
hWrites("Click on a feature for details. ");
hWrites(dragZooming ? "Click or drag in the base position track to zoom in. " : "Click on base position to zoom in around cursor. ");
#ifdef IMAGEv2_DRAG_REORDER
@@ -4453,15 +4488,16 @@
hWrites("Click gray/blue bars on left for track options and descriptions. ");
#endif//ndef IMAGEv2_DRAG_REORDER
#ifdef IMAGEv2_DRAG_SCROLL
hWrites("Drag tracks left or right to new position. ");
-#else//ifndef IMAGEv2_DRAG_SCROLL
+#endif//def IMAGEv2_DRAG_SCROLL
+#if !defined(IMAGEv2_DRAG_SCROLL) && !defined(USE_NAVIGATION_LINKS)
hPrintf("</TD><TD COLSPAN=6 ALIGN=CENTER NOWRAP>");
hPrintf("move end<BR>");
hButton("hgt.dinkRL", " < ");
hTextVar("dinkR", cartUsualString(cart, "dinkR", "2.0"), 3);
hButton("hgt.dinkRR", " > ");
-#endif//ndef IMAGEv2_DRAG_SCROLL
+#endif//ndef !defined(IMAGEv2_DRAG_SCROLL) && !defined(USE_NAVIGATION_LINKS)
hPrintf("</TD></TR></TABLE>\n");
// smallBreak();
/* Display bottom control panel. */
@@ -4976,9 +5012,11 @@
if (!hIsGsidServer())
{
revCmplDisp = cartUsualBooleanDb(cart, database, REV_CMPL_DISP, FALSE);
}
+#ifndef IMAGEv2_DRAG_REORDER
withPriorityOverride = cartUsualBoolean(cart, configPriorityOverride, FALSE);
+#endif//ndef IMAGEv2_DRAG_REORDER
insideX = trackOffsetX();
insideWidth = tl.picWidth-gfxBorder-insideX;