fecc0bfffd30dccc9998aa0c2e5a6064d487bbb1
chmalee
  Fri Apr 10 15:39:54 2020 -0700
Initial work on merging multiple bigBed items that span the window, refs #25133

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index eb1c78a..34e7913 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -4513,31 +4513,34 @@
 
 // composite/view must pass in example subtrack
 // NOTE: if subtrack types vary then there shouldn't be cfg at composite/view level!
 while (tdb->subtracks)
 tdb = tdb->subtracks;
 
 switch(cType)
     {
     case cfgBedScore:
 			{
 			char *scoreMax = trackDbSettingClosestToHome(tdb, SCORE_FILTER _MAX);
 			int maxScore = (scoreMax ? sqlUnsigned(scoreMax):1000);
 			scoreCfgUi(db, cart,tdb,prefix,title,maxScore,boxed);
 
             if(startsWith("bigBed", tdb->type))
+                {
                 labelCfgUi(db, cart, tdb, prefix);
+                mergeSpanCfgUi(cart, tdb, prefix);
+                }
 			}
 			break;
     case cfgPeak:
 			encodePeakCfgUi(cart,tdb,prefix,title,boxed);
 			break;
     case cfgWig:        wigCfgUi(cart,tdb,prefix,title,boxed);
 			break;
     case cfgWigMaf:     wigMafCfgUi(cart,tdb,prefix,title,boxed, db);
 			break;
     case cfgGenePred:   genePredCfgUi(db, cart,tdb,prefix,title,boxed);
 			break;
     case cfgChain:      chainCfgUi(db,cart,tdb,prefix,title,boxed, NULL);
 			break;
     case cfgNetAlign:   netAlignCfgUi(db,cart,tdb,prefix,title,boxed);
 			break;
@@ -6578,30 +6581,48 @@
         isDefault = (slPairFind(defaultLabelList, thisLabel->name) != NULL);
 
     boolean option = cartUsualBoolean(cart, varName, isDefault);
     cgiMakeCheckBox(varName, option);
 
     // find comment for the column listed
     struct asColumn *col = as->columnList;
     unsigned num = ptToInt(thisLabel->val);
     for(; col && num--; col = col->next)
         ;
     assert(col);
     printf(" %s   ", col->comment);
     }
 }
 
+void mergeSpanCfgUi(struct cart *cart, struct trackDb *tdb, char *prefix)
+/* If this track offers a merge spanned items option, put up the cfg for it, which
+ * is just a checkbox with a small explanation. Comparing tdb->track to prefix
+ * ensures we don't offer this control at the composite level, as this is a
+ * subtrack only config */
+{
+if (trackDbSettingOn(tdb, MERGESPAN_TDB_SETTING) && sameString(tdb->track, prefix))
+    {
+    boolean curOpt = trackDbSettingOn(tdb, "mergeSpannedItems");
+    char mergeSetting[256];
+    safef(mergeSetting, sizeof(mergeSetting), "%s.%s", tdb->track, MERGESPAN_CART_SETTING);
+    if (cartVarExists(cart, mergeSetting))
+        curOpt = cartBoolean(cart, mergeSetting);
+    printf("<b>Merge items that span the current region</b>:");
+    cgiMakeCheckBox(mergeSetting, curOpt);
+    }
+}
+
 void pslCfgUi(char *db, struct cart *cart, struct trackDb *tdb, char *name, char *title,
               boolean boxed)
 /* Put up UI for psl tracks */
 {
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 
 char *typeLine = cloneString(tdb->type);
 char *words[8];
 int wordCount = wordCount = chopLine(typeLine, words);
 if (sameString(tdb->type, "bigPsl"))
     labelCfgUi(db, cart, tdb, name);
 if (wordCount == 3 && sameWord(words[1], "xeno"))
     crossSpeciesCfgUi(cart,tdb);
 baseColorDropLists(cart, tdb, name);
 indelShowOptionsWithName(cart, tdb, name);