21bf4f713e944af4e8810544d68c441510ea85a3
kate
  Wed Jul 26 16:31:01 2017 -0700
Add support for maxHeightPixels in trackDb and UI of barChart type tracks. refs #19872

diff --git src/hg/lib/barChartUi.c src/hg/lib/barChartUi.c
index b5cfcbe..3903721 100644
--- src/hg/lib/barChartUi.c
+++ src/hg/lib/barChartUi.c
@@ -144,30 +144,45 @@
 cgiMakeCheckBoxWithId(cartVar, isAutoScale, cartVar);
 jsOnEventByIdF("change", cartVar, "barChartTransformChanged(event);");
 
 boolean isViewLimits = !isAutoScale && !isLogTransform;
 safef(buf, sizeof buf, "%sViewLimitsMaxLabel %s", track, !isViewLimits ? "disabled" : "");
 puts("  ");
 printf("<span class='%s'><b>View limits maximum:</b></span>\n", buf);
 safef(cartVar, sizeof(cartVar), "%s.%s", track, BAR_CHART_MAX_VIEW_LIMIT);
 int viewMax = cartCgiUsualInt(cart, cartVar, BAR_CHART_MAX_VIEW_LIMIT_DEFAULT);
 cgiMakeIntVarWithExtra(cartVar, viewMax, 4, !isViewLimits ? "disabled" : "");
 char *unit = trackDbSettingClosestToHomeOrDefault(tdb, BAR_CHART_UNIT, "");
 printf("<span class='%s'> %s (range 0-%d)</span>\n", buf, unit, 
                                 round(barChartUiMaxMedianScore(tdb)));
 }
 
+void barChartUiMaxHeight(struct cart *cart, char *track, struct trackDb *tdb)
+/* Input to change maximum track height */
+{
+int min = BAR_CHART_MAX_HEIGHT_MIN;
+int deflt = BAR_CHART_MAX_HEIGHT_DEFAULT;
+int max = BAR_CHART_MAX_HEIGHT_MAX;
+int settingsDefault;
+wigFetchMinMaxPlusPixelsWithCart(cart, tdb, track, &min, &max, &deflt, &settingsDefault);
+puts("<b>Track height maximum:</b>\n");
+char cartVar[1024];
+safef(cartVar, sizeof(cartVar), "%s.%s", track, HEIGHTPER);
+cgiMakeIntVarWithLimits(cartVar, deflt, "Track height maximum", 0, min, max);
+printf("pixels&nbsp;(range: %d to %d, default: %d)", min, max, settingsDefault);
+}
+
 struct barChartCategory *barChartUiGetCategories(char *database, struct trackDb *tdb)
 /* Get category colors and descriptions.  Use barChartColors setting if present.
    If not, if there is a barChartBars setting, assign rainbow colors.
  * O/w look for a table naed track+Category, and use labels and colors there 
  */
 {
 struct barChartCategory *categs = NULL;
 char *words[BAR_CHART_MAX_CATEGORIES];
 char *colorWords[BAR_CHART_MAX_CATEGORIES];
 char *labels = trackDbSettingClosestToHome(tdb, BAR_CHART_CATEGORY_LABELS);
 char *colors = trackDbSettingClosestToHome(tdb, BAR_CHART_CATEGORY_COLORS);
 struct barChartCategory *categ = NULL;
 
 if (labels == NULL)
     {
@@ -240,53 +255,53 @@
 struct barChartCategory *categ = barChartUiGetCategoryById(id, database, tdb);
 if (categ == NULL)
     return "Unknown";
 return categ->label;
 }
 
 void barChartCfgUi(char *database, struct cart *cart, struct trackDb *tdb, char *track, 
                         char *title, boolean boxed)
 /* Bar chart track type */
 {
 if (cartVarExists(cart, "ajax"))
     isPopup = TRUE;
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 if (startsWith("big", tdb->type))
     labelCfgUi(database, cart, tdb);
-printf("\n<table id=barChartControls style='font-size:%d%%' %s>\n<tr><td>", 
-        isPopup ? 75 : 100, boxed ?" width='100%'":"");
-
-char cartVar[1024];
 
 /* Data transform (log, autoscale or viewlimits) */
-puts("<div>");
+char cartVar[1024];
+puts("<p>");
 barChartUiViewTransform(cart, track, tdb);
-puts("</div>");
+puts("</p>");
+
+/* Maximum track height */
+puts("<p>");
+barChartUiMaxHeight(cart, track, tdb);
+puts("</p>");
 
 /* Category filter */
 printf("<br>");
 char *categoryLabel =  trackDbSettingClosestToHomeOrDefault(tdb, 
                     BAR_CHART_CATEGORY_LABEL, BAR_CHART_CATEGORY_LABEL_DEFAULT);
 char *db = cartString(cart, "db");
 struct barChartCategory *categs = barChartUiGetCategories(db, tdb);
 printf("<div><b>%s:</b>\n", categoryLabel);
 safef(cartVar, sizeof(cartVar), "%s.%s", track, BAR_CHART_CATEGORY_SELECT);
 if (isPopup)
     {
     printf("<a href='%s?g=%s'><button type='button'>Change</button><a>", 
                 hTrackUiForTrack(track), track);
     }
 else
     {
     jsMakeCheckboxGroupSetClearButton(cartVar, TRUE);
     puts("&nbsp;");
     jsMakeCheckboxGroupSetClearButton(cartVar, FALSE);
     }
 printf("</div>");
 struct slName *selectedValues = NULL;
 if (cartListVarExistsAnyLevel(cart, tdb, FALSE, BAR_CHART_CATEGORY_SELECT))
     selectedValues = cartOptionalSlNameListClosestToHome(cart, tdb, FALSE, BAR_CHART_CATEGORY_SELECT);
 makeCategoryCheckboxes(cartVar, categs, selectedValues);
-
-puts("\n</table>\n");
 cfgEndBox(boxed);
 }