Index: ui/keyboard/resources/main.js |
diff --git a/ui/keyboard/resources/main.js b/ui/keyboard/resources/main.js |
index 2899e8047beb19afa2f229b999f43cdefaf6974e..49974867236eecad712a89c73b2350a5d95f4202 100644 |
--- a/ui/keyboard/resources/main.js |
+++ b/ui/keyboard/resources/main.js |
@@ -294,29 +294,50 @@ |
/** |
* Redistributes the total width amongst the keys in the range provided. |
* @param {Array.<kb-key>} allKeys Ordered list of keys to stretch. |
- * @param {number} pitch The space between two keys. |
+ * @param {AlignmentOptions} params Options for aligning the keyset. |
* @param {number} xOffset The x-coordinate of the key who's index is start. |
* @param {number} width The total extraneous width to distribute. |
* @param {number} keyHeight The height of each key. |
* @param {number} yOffset The y-coordinate of the top edge of the row. |
*/ |
- function redistribute(allKeys, pitch, xOffset, width, keyHeight, yOffset) { |
- var weight = 0; |
+ function redistribute(allKeys, params, xOffset, width, keyHeight, yOffset) { |
+ var availableWidth = width - (allKeys.length - 1) * params.pitchX; |
+ var stretchWeight = 0; |
+ var nStretch = 0; |
for (var i = 0; i < allKeys.length; i++) { |
var key = allKeys[i]; |
- weight += key.weight; |
+ if (key.stretch) { |
+ stretchWeight += key.weight; |
+ nStretch++; |
+ } else if (key.weight == DEFAULT_KEY_WEIGHT_X) { |
+ availableWidth -= params.keyWidth; |
+ } else { |
+ availableWidth -= |
+ Math.floor(key.weight/DEFAULT_KEY_WEIGHT_X * params.keyWidth); |
+ } |
} |
- var availableWidth = width - (allKeys.length - 1) * pitch; |
- var pixelsPerWeight = width / weight; |
+ if (stretchWeight <= 0) |
+ console.error("Cannot stretch row without a stretchable key"); |
+ // Rounding error to distribute. |
+ var pixelsPerWeight = availableWidth / stretchWeight; |
for (var i = 0; i < allKeys.length; i++) { |
- var key = allKeys[i] |
- var keyWidth = Math.floor(key.weight * pixelsPerWeight); |
- if (i == allKeys.length -1) { |
- keyWidth = availableWidth; |
+ var key = allKeys[i]; |
+ var keyWidth = params.keyWidth; |
+ if (key.weight != DEFAULT_KEY_WEIGHT_X) { |
+ keyWidth = |
+ Math.floor(key.weight/DEFAULT_KEY_WEIGHT_X * params.keyWidth); |
} |
- updateKey(allKeys[i], keyWidth, keyHeight, xOffset, yOffset) |
- availableWidth -= keyWidth; |
- xOffset += keyWidth + pitch; |
+ if (key.stretch) { |
+ nStretch--; |
+ if (nStretch > 0) { |
+ keyWidth = Math.floor(key.weight * pixelsPerWeight); |
+ availableWidth -= keyWidth; |
+ } else { |
+ keyWidth = availableWidth; |
+ } |
+ } |
+ updateKey(key, keyWidth, keyHeight, xOffset, yOffset) |
+ xOffset += keyWidth + params.pitchX; |
} |
} |
@@ -325,7 +346,7 @@ |
* it. A precondition is that all keys in this row can be stretched as needed. |
* @param {!kb-row} row The current row to be aligned. |
* @param {!kb-row} prevRow The row above the current row. |
- * @param {!AlignmentOptions} params The parameters used to align the keyset. |
+ * @param {!AlignmentOptions} params Options for aligning the keyset. |
* @param {number} keyHeight The height of the keys in this row. |
* @param {number} heightOffset The height offset caused by the rows above. |
*/ |
@@ -383,7 +404,7 @@ |
var leftWidth = leftEdge - params.offsetLeft - params.pitchX; |
var leftKeys = allKeys.array().slice(0, spaceIndex); |
redistribute(leftKeys, |
- params.pitchX, |
+ params, |
params.offsetLeft, |
leftWidth, |
keyHeight, |
@@ -401,7 +422,7 @@ |
params.availableWidth - (rightEdge - params.offsetLeft + params.pitchX); |
var rightKeys = allKeys.array().slice(spaceIndex + 1); |
redistribute(rightKeys, |
- params.pitchX, |
+ params, |
rightEdge + params.pitchX,//xOffset. |
rightWidth, |
keyHeight, |