a79ca8843be0fbe1b0c59167db1aa9e4b487a07e
kate
  Wed Aug 9 12:45:32 2017 -0700
Fixes to maxHeightPixels support in barChart UI. refs #19872

diff --git src/hg/lib/cart.c src/hg/lib/cart.c
index 6b3e44b..21eca3c 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -2943,15 +2943,121 @@
 if (pLastDbPosCart)
     *pLastDbPosCart = lastDbPosCart;
 
 return position;
 }
 
 void cartSetDbPosition(struct cart *cart, char *database, struct cart *lastDbPosCart)
 /* Set the 'position.db' variable in the cart.*/
 {
 char dbPosKey[256];
 safef(dbPosKey, sizeof dbPosKey, "position.%s", database);
 struct dyString *dbPosValue = newDyString(4096);
 cartEncodeState(lastDbPosCart, dbPosValue);
 cartSetString(cart, dbPosKey, dbPosValue->string);
 }
+
+void cartTdbFetchMinMaxPixels(struct cart *theCart, struct trackDb *tdb,
+                                int defaultMin, int defaultMax, int defaultVal,
+                                int *retMin, int *retMax, int *retDefault, int *retCurrent)
+/* Configure maximum track height for variable height tracks (e.g. wiggle, barchart)
+ *      Initial height and limits may be defined in trackDb with the maxHeightPixels string,
+ *	Or user requested limits are defined in the cart. */
+{
+boolean parentLevel = isNameAtParentLevel(tdb, tdb->track);
+char *heightPer = NULL; /*	string from cart	*/
+int minHeightPixels = defaultMin;
+int maxHeightPixels = defaultMax;
+int defaultHeightPixels = defaultVal;
+int defaultHeight;      /*      truncated by limits     */
+char defaultDefault[16];
+safef(defaultDefault, sizeof defaultDefault, "%d", defaultVal);
+char *tdbDefault = cloneString(
+    trackDbSettingClosestToHomeOrDefault(tdb, MAXHEIGHTPIXELS, defaultDefault));
+
+if (sameWord(defaultDefault, tdbDefault))
+    {
+    struct hashEl *hel;
+    /*	no maxHeightPixels from trackDb, maybe it is in tdb->settings
+     *	(custom tracks keep settings here)
+     */
+    if ((tdb->settings != (char *)NULL) &&
+	(tdb->settingsHash != (struct hash *)NULL))
+	{
+	if ((hel = hashLookup(tdb->settingsHash, MAXHEIGHTPIXELS)) != NULL)
+	    {
+	    freeMem(tdbDefault);
+	    tdbDefault = cloneString((char *)hel->val);
+	    }
+	}
+    }
+
+/*      the maxHeightPixels string can be one, two, or three words
+ *      separated by :
+ *      All three would be:     max:default:min
+ *      When only two:          max:default
+ *      When only one:          max
+ *      (this works too:        min:default:max)
+ *      Where min is minimum allowed, default is initial default setting
+ *      and max is the maximum allowed
+ *	If it isn't available, these three have already been set
+ *	in their declarations above
+ */
+if (differentWord(defaultDefault, tdbDefault))
+    {
+    char *words[3];
+    char *sep = ":";
+    int wordCount;
+    wordCount=chopString(tdbDefault,sep,words,ArraySize(words));
+    switch (wordCount)
+	{
+	case 3:
+	    minHeightPixels = atoi(words[2]);
+	    defaultHeightPixels = atoi(words[1]);
+	    maxHeightPixels = atoi(words[0]);
+
+            // flip max and min if min>max
+            if (maxHeightPixels < minHeightPixels)
+                {
+                int pixels;
+                pixels = maxHeightPixels;
+                maxHeightPixels = minHeightPixels;
+                minHeightPixels = pixels;
+                }
+
+	    if (defaultHeightPixels > maxHeightPixels)
+		defaultHeightPixels = maxHeightPixels;
+	    if (minHeightPixels > defaultHeightPixels)
+		minHeightPixels = defaultHeightPixels;
+	    break;
+	case 2:
+	    defaultHeightPixels = atoi(words[1]);
+	    maxHeightPixels = atoi(words[0]);
+	    if (defaultHeightPixels > maxHeightPixels)
+		defaultHeightPixels = maxHeightPixels;
+	    if (minHeightPixels > defaultHeightPixels)
+		minHeightPixels = defaultHeightPixels;
+	    break;
+	case 1:
+	    maxHeightPixels = atoi(words[0]);
+	    defaultHeightPixels = maxHeightPixels;
+	    if (minHeightPixels > defaultHeightPixels)
+		minHeightPixels = defaultHeightPixels;
+	    break;
+	default:
+	    break;
+	}
+    }
+heightPer = cartOptionalStringClosestToHome(theCart, tdb, parentLevel, HEIGHTPER);
+/*      Clip the cart value to range [minHeightPixels:maxHeightPixels] */
+if (heightPer) defaultHeight = min( maxHeightPixels, atoi(heightPer));
+else defaultHeight = defaultHeightPixels;
+defaultHeight = max(minHeightPixels, defaultHeight);
+
+*retMin = minHeightPixels;
+*retMax = maxHeightPixels;
+*retDefault = defaultHeightPixels;
+*retCurrent = defaultHeight;
+
+freeMem(tdbDefault);
+} 
+