src/hg/hgTracks/hgTracks.c 1.1607

1.1607 2009/11/13 00:17:58 tdreszer
Changes to fix no leftLabel bug and changes to support separate button slice (needed for subtracks with separate imgTracks)
Index: src/hg/hgTracks/hgTracks.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/hgTracks.c,v
retrieving revision 1.1606
retrieving revision 1.1607
diff -b -B -U 4 -r1.1606 -r1.1607
--- src/hg/hgTracks/hgTracks.c	11 Nov 2009 21:13:13 -0000	1.1606
+++ src/hg/hgTracks/hgTracks.c	13 Nov 2009 00:17:58 -0000	1.1607
@@ -1581,26 +1581,15 @@
 //struct imgTrack *curImgTrack = NULL; // Make this global for now to avoid huge rewrite
 struct imgSlice *curSlice    = NULL; // No need to be global, only the map needs to be global
 struct mapSet   *curMap      = NULL; // Make this global for now to avoid huge rewrite
 // Set up imgBox dimensions
-int sideSliceWidth  = 0;   // Just being explicit
-int dataSliceWidth  = 0;
-int sideSliceOffsetX = 0;
-int dataSliceOffsetX = 0;
+int sliceWidth[isMaxSliceTypes]; // Just being explicit
+int sliceOffsetX[isMaxSliceTypes];
 int sliceHeight  = 0;
 int sliceOffsetY = 0;
 char *rulerTtl = NULL;
-// theImgBox is a global for now to avoid huge rewrite of hgTracks.  It is started prior to this in doTrackForm()
-//theImgBox = imgBoxStart(database,chromName,winStart,winEnd,(!revCmplDisp),sideSliceWidth,pixWidth);
-if(theImgBox)
-    {
-    if (withLeftLabels)
+if(theImgBox)  // theImgBox is a global for now to avoid huge rewrite of hgTracks.  It is started prior to this in doTrackForm()
         {
-        sideSliceWidth   = leftLabelWidth + 2;
-        sideSliceOffsetX = (revCmplDisp?(tl.picWidth - sideSliceWidth): 0);
-        }
-    dataSliceOffsetX = (revCmplDisp?0:sideSliceWidth);
-
     rulerTtl = (dragZooming?"drag select or click to zoom":"click to zoom 3x");//"click or drag mouse in base position track to zoom in" : NULL);
     hPrintf("<input type='hidden' name='db' value='%s'>\n", database);
     hPrintf("<input type='hidden' name='c' value='%s'>\n", chromName);
     hPrintf("<input type='hidden' name='l' value='%d'>\n", winStart);
@@ -1612,13 +1601,21 @@
         {
         pixWidth = tl.picWidth;
         winBaseCount = winEnd - winStart;
         insideWidth = tl.picWidth-gfxBorder-insideX;
-        if (withLeftLabels)
-            sideSliceOffsetX = (revCmplDisp?(tl.picWidth - sideSliceWidth): 0);
         }
     #endif//def IMAGEv2_DRAG_SCROLL
-    dataSliceWidth   = tl.picWidth - sideSliceWidth;
+    memset((char *)sliceWidth,  0,sizeof(sliceWidth));
+    memset((char *)sliceOffsetX,0,sizeof(sliceOffsetX));
+    if (withLeftLabels)
+        {
+        sliceWidth[isButton]   = trackTabWidth + 1;
+        sliceWidth[isSide]     = leftLabelWidth - sliceWidth[isButton] + 2;
+        sliceOffsetX[isSide]   = (revCmplDisp? (tl.picWidth - sliceWidth[isSide] - sliceWidth[isButton]) : sliceWidth[isButton]);
+        sliceOffsetX[isButton] = (revCmplDisp? (tl.picWidth - sliceWidth[isButton]) : 0);
+        }
+    sliceOffsetX[isData] = (revCmplDisp?0:sliceWidth[isSide] + sliceWidth[isButton]);
+    sliceWidth[isData]   = tl.picWidth - (sliceWidth[isSide] + sliceWidth[isButton]);
     }
 
 if (rulerMode != tvFull)
     {
@@ -1747,8 +1744,11 @@
 
 /* Find colors to draw in. */
 findTrackColors(hvg, trackList);
 
+// TODO: Prior to image, make all imgTracks, including one for each visible subtrack
+//       Then dragReorder can work per subtrack!!!
+
 /* Draw mini-buttons. */
 if (withLeftLabels && psOutput == NULL)
     {
     int butOff;
@@ -1766,9 +1766,9 @@
             // Mini-buttons (side label slice) for ruler
             sliceHeight      = height + 1;
             sliceOffsetY     = 0;
             curImgTrack = imgBoxTrackFindOrAdd(theImgBox,NULL,RULER_TRACK_NAME,rulerMode,FALSE,IMG_FIXEDPOS); // No tdb, no centerlabel, not reorderable
-            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isButton,theOneImg,NULL,sliceWidth[isButton],sliceHeight,sliceOffsetX[isButton],sliceOffsetY);
             curMap      = sliceMapFindOrStart(curSlice,RULER_TRACK_NAME,NULL); // No common linkRoot
             }
         drawGrayButtonBox(hvg, trackTabX, y, trackTabWidth, height, TRUE);
         mapBoxTrackUi(hvg, trackTabX, y, trackTabWidth, height,
@@ -1801,9 +1801,9 @@
                     // Mini-buttons (side label slice) for tracks
                     sliceHeight      = h;
                     sliceOffsetY     = yStart;
                     curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),IMG_ANYORDER);
-                    curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+                    curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isButton,theOneImg,NULL,sliceWidth[isButton],sliceHeight,sliceOffsetX[isButton],sliceOffsetY);
                     curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
                     }
                 mapBoxTrackUi(hvg, trackTabX, yStart, trackTabWidth, h,
 			      track->mapName, track->shortLabel);
@@ -1829,9 +1829,9 @@
             // side label slice for ruler
             sliceHeight      = basePositionHeight + (rulerCds ? rulerTranslationHeight : 0) + 1;
             sliceOffsetY     = 0;
             curImgTrack = imgBoxTrackFindOrAdd(theImgBox,NULL,RULER_TRACK_NAME,rulerMode,FALSE,IMG_FIXEDPOS); // No tdb, no centerlabel,not reorderable
-            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sliceWidth[isSide],sliceHeight,sliceOffsetX[isSide],sliceOffsetY);
             curMap      = sliceMapFindOrStart(curSlice,RULER_TRACK_NAME,NULL); // No common linkRoot
             }
         if (baseTitle)
             {
@@ -1898,9 +1898,9 @@
             // 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),IMG_ANYORDER);
-            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sliceWidth[isSide],sliceHeight,sliceOffsetX[isSide],sliceOffsetY);
             curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
             }
         if (trackIsCompositeWithSubtracks(track))  //TODO: Change when tracks->subtracks are always set for composite
             {
@@ -1955,9 +1955,9 @@
         // data slice for ruler
         sliceHeight      = basePositionHeight + (rulerCds ? rulerTranslationHeight : 0) + 1;
         sliceOffsetY     = 0;
         curImgTrack = imgBoxTrackFindOrAdd(theImgBox,NULL,RULER_TRACK_NAME,rulerMode,FALSE,IMG_FIXEDPOS); // No tdb, no centerlabel,not reorderable
-        curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,rulerTtl,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+        curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,rulerTtl,sliceWidth[isData],sliceHeight,sliceOffsetX[isData],sliceOffsetY);
         curMap      = sliceMapFindOrStart(curSlice,RULER_TRACK_NAME,NULL); // No common linkRoot
         }
     struct dnaSeq *seq = NULL;
     int rulerClickY = 0;
@@ -2185,9 +2185,9 @@
             // 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),IMG_ANYORDER);
-            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isCenter,theOneImg,NULL,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isCenter,theOneImg,NULL,sliceWidth[isData],sliceHeight,sliceOffsetX[isData],sliceOffsetY);
             curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
             }
         if (trackIsCompositeWithSubtracks(track))  //TODO: Change when tracks->subtracks are always set for composite
             {
@@ -2199,9 +2199,9 @@
                 // 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);
+                curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,NULL,sliceWidth[isData],sliceHeight,sliceOffsetX[isData],sliceOffsetY);
                 curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
                 }
             for (subtrack = track->subtracks; subtrack != NULL; subtrack = subtrack->next)
                 {
@@ -2243,9 +2243,9 @@
             int order = cartUsualInt(cart, var,IMG_ANYORDER);
             curImgTrack = imgBoxTrackUpdateOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),order);
             if(sliceHeight > 0)
                 {
-                curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,NULL,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+                curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,NULL,sliceWidth[isData],sliceHeight,sliceOffsetX[isData],sliceOffsetY);
                 curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
                 }
             }
         if (trackIsCompositeWithSubtracks(track))  //TODO: Change when tracks->subtracks are always set for composite
@@ -2281,36 +2281,33 @@
         // 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),IMG_ANYORDER);
-        curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sliceWidth[isSide],sliceHeight,sliceOffsetX[isSide],sliceOffsetY);
         curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
         }
     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))
 		    {
 		    if (subtrack->drawLeftLabels != NULL)
 			y = doOwnLeftLabels(subtrack, hvg, font, y);
 		    else
 			y += trackPlusLabelHeight(subtrack, fontHeight);
 		    }
 	    }
+            }
         else if (track->drawLeftLabels != NULL)
-	    {
 	    y = doOwnLeftLabels(track, hvg, font, y);
-	    }
         else
-            {
 	    y += trackPlusLabelHeight(track, fontHeight);
             }
         }
-    }
 
 
 /* Make map background. */
 y = yAfterRuler;
@@ -2319,14 +2316,15 @@
     if (track->limitedVis != tvHide)
         {
         if(theImgBox)
             {
-            // Seems there are some left over side labels which need to be added here!
+            // Set imgTrack in case any map items will be set
             sliceHeight      = trackPlusLabelHeight(track, fontHeight);
             sliceOffsetY     = y;
             curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),IMG_ANYORDER);
-            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
-            curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+            // It is possible that some side label heights need adjusting (but I doubt it)...
+            //if (withLeftLabels)
+            //    curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sliceWidth[isSide],sliceHeight,sliceOffsetX[isSide],sliceOffsetY);
             }
         y = doTrackMap(track, hvg, y, fontHeight, trackPastTabX, trackPastTabWidth);
         }
     }