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); +} +