9e9fdcd37b60aa4186eeea2b2c61df277dbfeb5a
kate
  Thu Oct 22 15:48:16 2020 -0700
Add multi-region button to position line and lighten highlights on alternating regions. Part of improving multi-region features for sparse track use. refs #26385

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index d541c7d..41c6f8c 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -5364,31 +5364,31 @@
         }
 
     if (!exists)
         {
 
         hvGfxSetClip(bgImg, fullInsideX, 0, fullInsideWidth, pixHeight);
         y = gfxBorder;
 
 	if (virtMode)
 	    {
 	    // vertical windows separators
 
 	    if (emAltHighlight)
 		{
 		// light blue alternating backgrounds
-		Color lightBlue = hvGfxFindRgb(bgImg, &guidelineColor);
+		Color lightBlue = hvGfxFindRgb(bgImg, &lightGuidelineColor);
 		for (window=windows; window; window=window->next) // background under every other window
 		    {
 		    if (window->regionOdd)
 			hvGfxBox(bgImg, window->insideX, 0, window->insideWidth, pixHeight, lightBlue);
 		    }
 		}
 	    else
 		{
 		// red vertical lines
 		Color lightRed = hvGfxFindRgb(bgImg, &vertWindowSeparatorColor);
 		for (window=windows->next; window; window=window->next) // skip first window, not needed
 		    hvGfxBox(bgImg, window->insideX, 0, 1, pixHeight, lightRed);
 		}
 	    }
 	else
@@ -8598,30 +8598,44 @@
 	}
 
 
     /* Make line that says position. */
 	{
 	char buf[256];
 	char *survey = cfgOptionEnv("HGDB_SURVEY", "survey");
 	char *surveyLabel = cfgOptionEnv("HGDB_SURVEY_LABEL", "surveyLabel");
 	    char *javascript = "document.location = '/cgi-bin/hgTracks?db=' + document.TrackForm.db.options[document.TrackForm.db.selectedIndex].value;";
 	    if (containsStringNoCase(database, "zoo"))
 		{
 		hPuts("Organism ");
 		printAssemblyListHtmlExtra(database, "change", javascript);
 		}
 
+        /* Multi-region button on position line */
+        if (sameString(virtModeType, "default"))
+            {
+            hButtonMaybePressed("hgTracksConfigMultiRegionPage", "multi-region",
+                    "Configure view in multi-region display mode",
+                    "popUpHgt.hgTracks('multi-region config'); return false;", FALSE);
+            }
+        else
+            {
+            hButtonWithMsg("hgt.exitMultiRegion", "exit multi-region", 
+                                "Exit multi-region display mode");
+            }
+        hPrintf(" ");
+
 	if (virtualSingleChrom()) // DISGUISE VMODE
 	    safef(buf, sizeof buf, "%s", windowsSpanPosition());
 	else
 	    safef(buf, sizeof buf, "%s:%ld-%ld", virtChromName, virtWinStart+1, virtWinEnd);
 	
 	position = cloneString(buf);
         char *pressedClass = "", *showVirtRegions = "";
         if (differentString(virtModeType, "default"))
             {
             pressedClass = "pressed";
             showVirtRegions = "show multi-region position ranges and ";
             }
 	hPrintf("<span class='positionDisplay %s' id='positionDisplay' "
                 "title='click to %s copy position to input box'>%s</span>", 
                         pressedClass, showVirtRegions, addCommasToPos(database, position));
@@ -9461,30 +9475,37 @@
 	}
     }
 
 
 if (sameString(position, ""))
     {
     hUserAbort("Please go back and enter a coordinate range or a search term in the \"search term\" field.<br>For example: chr22:20100000-20200000.\n");
     }
 
 if (!positionIsVirt)
     {
     if (! resolvePosition(&position))
         return;
     }
 
+if  (cgiVarExists("hgt.exitMultiRegion"))
+    {
+    cartRemove(cart, "hgt.exitMultiRegion");
+    cartSetString(cart, "virtModeType", "default");
+    cartSetBoolean(cart, "virtMode", FALSE);
+    }
+
 virtMode = cartUsualBoolean(cart, "virtMode", FALSE);
 
 /* Figure out basic dimensions of display.  This
  * needs to be done early for the sake of the
  * zooming and dinking routines. */
 setLayoutGlobals();
 
 virtModeType = cartUsualString(cart, "virtModeType", virtModeType);
 
 if (positionIsVirt && virtualSingleChrom())
     {
     // we need chromName to be set before initRegionList() gets called.
     position = cartUsualString(cart, "nonVirtPosition", "");
     if (!sameString(position,""))
 	parseNonVirtPosition(position);