Chromium Code Reviews| Index: chrome/browser/resources/options/chromeos/display_options.js |
| diff --git a/chrome/browser/resources/options/chromeos/display_options.js b/chrome/browser/resources/options/chromeos/display_options.js |
| index 4e762ca13b46912ea05dbc84a67c8162659c2ceb..961fc9d5aa6814a0143a0766468aaf1f5ad3c202 100644 |
| --- a/chrome/browser/resources/options/chromeos/display_options.js |
| +++ b/chrome/browser/resources/options/chromeos/display_options.js |
| @@ -89,6 +89,7 @@ options.DisplayInfo; |
| * div: ?HTMLElement, |
| * id: string, |
| * isPrimary: boolean, |
| + * layoutType: options.DisplayLayoutType, |
| * name: string, |
| * originalPosition: !options.DisplayPosition |
| * }} |
| @@ -106,7 +107,7 @@ cr.define('options', function() { |
| /** @const */ var MIN_OFFSET_OVERLAP = 5; |
| /** |
| - * Gets the position of |point| to |rect|, left, right, top, or bottom. |
| + * Gets the layout type of |point| relative to |rect|. |
| * @param {!options.DisplayBounds} rect The base rectangle. |
| * @param {!options.DisplayPosition} point The point to check the position. |
| * @return {options.DisplayLayoutType} The position of the calculated point. |
|
xiyuan
2016/01/26 17:35:33
nit: update the comment here as well.
stevenjb
2016/01/26 18:18:10
Done in the next CL
|
| @@ -132,6 +133,33 @@ cr.define('options', function() { |
| } |
| /** |
| + * Snaps the region [point, width] to [basePoint, baseWidth] if |
| + * the [point, width] is close enough to the base's edge. |
| + * @param {number} point The starting point of the region. |
| + * @param {number} width The width of the region. |
| + * @param {number} basePoint The starting point of the base region. |
| + * @param {number} baseWidth The width of the base region. |
| + * @return {number} The moved point. Returns the point itself if it doesn't |
| + * need to snap to the edge. |
| + * @private |
| + */ |
| + function snapToEdge(point, width, basePoint, baseWidth) { |
| + // If the edge of the region is smaller than this, it will snap to the |
| + // base's edge. |
| + /** @const */ var SNAP_DISTANCE_PX = 16; |
| + |
| + var startDiff = Math.abs(point - basePoint); |
| + var endDiff = Math.abs(point + width - (basePoint + baseWidth)); |
| + // Prefer the closer one if both edges are close enough. |
| + if (startDiff < SNAP_DISTANCE_PX && startDiff < endDiff) |
| + return basePoint; |
| + else if (endDiff < SNAP_DISTANCE_PX) |
| + return basePoint + baseWidth - width; |
| + |
| + return point; |
| + } |
| + |
| + /** |
| * Encapsulated handling of the 'Display' page. |
| * @constructor |
| * @extends {cr.ui.pageManager.Page} |
| @@ -169,13 +197,6 @@ cr.define('options', function() { |
| showUnifiedDesktopOption_: false, |
| /** |
| - * The current secondary display layout. |
| - * @type {options.DisplayLayoutType} |
| - * @private |
| - */ |
| - layoutType_: options.DisplayLayoutType.RIGHT, |
| - |
| - /** |
| * The array of current output displays. It also contains the display |
| * rectangles currently rendered on screen. |
| * @type {!Array<!options.DisplayInfo>} |
| @@ -425,43 +446,16 @@ cr.define('options', function() { |
| // Offset is calculated from top or left edge. |
| var primary = this.displayLayoutMap_[this.primaryDisplayId_]; |
| var secondary = this.displayLayoutMap_[this.secondaryDisplayId_]; |
| + var layoutType = secondary.layoutType; |
| var offset; |
| - if (this.layoutType_ == options.DisplayLayoutType.LEFT || |
| - this.layoutType_ == options.DisplayLayoutType.RIGHT) { |
| + if (layoutType == options.DisplayLayoutType.LEFT || |
| + layoutType == options.DisplayLayoutType.RIGHT) { |
| offset = secondary.div.offsetTop - primary.div.offsetTop; |
| } else { |
| offset = secondary.div.offsetLeft - primary.div.offsetLeft; |
| } |
| offset = Math.floor(offset / this.visualScale_); |
| - chrome.send( |
| - 'setDisplayLayout', [secondary.id, this.layoutType_, offset]); |
| - }, |
| - |
| - /** |
| - * Snaps the region [point, width] to [basePoint, baseWidth] if |
| - * the [point, width] is close enough to the base's edge. |
| - * @param {number} point The starting point of the region. |
| - * @param {number} width The width of the region. |
| - * @param {number} basePoint The starting point of the base region. |
| - * @param {number} baseWidth The width of the base region. |
| - * @return {number} The moved point. Returns point itself if it doesn't |
| - * need to snap to the edge. |
| - * @private |
| - */ |
| - snapToEdge_: function(point, width, basePoint, baseWidth) { |
| - // If the edge of the regions is smaller than this, it will snap to the |
| - // base's edge. |
| - /** @const */ var SNAP_DISTANCE_PX = 16; |
| - |
| - var startDiff = Math.abs(point - basePoint); |
| - var endDiff = Math.abs(point + width - (basePoint + baseWidth)); |
| - // Prefer the closer one if both edges are close enough. |
| - if (startDiff < SNAP_DISTANCE_PX && startDiff < endDiff) |
| - return basePoint; |
| - else if (endDiff < SNAP_DISTANCE_PX) |
| - return basePoint + baseWidth - width; |
| - |
| - return point; |
| + chrome.send('setDisplayLayout', [secondary.id, layoutType, offset]); |
| }, |
| /** |
| @@ -481,7 +475,6 @@ cr.define('options', function() { |
| // if there are >=3 displays. This is our assumption for M21. |
| // TODO(mukai): Fix the code to allow >=3 displays. |
| var dragInfo = this.dragInfo_; |
| - var dragLayout = this.displayLayoutMap_[dragInfo.displayId]; |
| /** @type {options.DisplayPosition} */ var newPosition = { |
| x: dragInfo.originalLocation.x + |
| (eventLocation.x - dragInfo.eventLocation.x), |
| @@ -489,15 +482,20 @@ cr.define('options', function() { |
| (eventLocation.y - dragInfo.eventLocation.y) |
| }; |
| + var dragLayout = this.displayLayoutMap_[dragInfo.displayId]; |
| + var draggingDiv = dragLayout.div; |
| + |
| var baseDisplayId = dragLayout.isPrimary ? this.secondaryDisplayId_ : |
| this.primaryDisplayId_; |
| - var baseDiv = this.displayLayoutMap_[baseDisplayId].div; |
| - var draggingDiv = dragLayout.div; |
| + var baseLayout = this.displayLayoutMap_[baseDisplayId]; |
| + var baseDiv = baseLayout.div; |
| - newPosition.x = this.snapToEdge_(newPosition.x, draggingDiv.offsetWidth, |
| - baseDiv.offsetLeft, baseDiv.offsetWidth); |
| - newPosition.y = this.snapToEdge_(newPosition.y, draggingDiv.offsetHeight, |
| - baseDiv.offsetTop, baseDiv.offsetHeight); |
| + newPosition.x = snapToEdge( |
| + newPosition.x, draggingDiv.offsetWidth, baseDiv.offsetLeft, |
| + baseDiv.offsetWidth); |
| + newPosition.y = snapToEdge( |
| + newPosition.y, draggingDiv.offsetHeight, baseDiv.offsetTop, |
| + baseDiv.offsetHeight); |
| /** @type {!options.DisplayPosition} */ var newCenter = { |
| x: newPosition.x + draggingDiv.offsetWidth / 2, |
| @@ -512,7 +510,9 @@ cr.define('options', function() { |
| }; |
| var isPrimary = dragLayout.isPrimary; |
| - var layoutType = this.layoutType_; |
| + // layoutType is always stored in the secondary layout. |
| + var layoutType = |
| + isPrimary ? baseLayout.layoutType : dragLayout.layoutType; |
| switch (getPositionToRectangle(baseBounds, newCenter)) { |
| case options.DisplayLayoutType.RIGHT: |
| @@ -550,12 +550,12 @@ cr.define('options', function() { |
| options.DisplayLayoutType.LEFT; |
| } |
| - this.layoutType_ = layoutType; |
| - |
| var layoutToBase; |
| if (!isPrimary) { |
| + dragLayout.layoutType = layoutType; |
| layoutToBase = layoutType; |
| } else { |
| + baseLayout.layoutType = layoutType; |
| switch (layoutType) { |
| case options.DisplayLayoutType.RIGHT: |
| layoutToBase = options.DisplayLayoutType.LEFT; |
| @@ -660,10 +660,17 @@ cr.define('options', function() { |
| var dragLayout = this.displayLayoutMap_[this.dragInfo_.displayId]; |
| var baseDisplayId = dragLayout.isPrimary ? this.secondaryDisplayId_ : |
| this.primaryDisplayId_; |
| - var baseDiv = this.displayLayoutMap_[baseDisplayId].div; |
| + |
| + var baseLayout = this.displayLayoutMap_[baseDisplayId]; |
| + var baseDiv = baseLayout.div; |
| var draggingDiv = dragLayout.div; |
| - if (this.layoutType_ == options.DisplayLayoutType.LEFT || |
| - this.layoutType_ == options.DisplayLayoutType.RIGHT) { |
| + |
| + // layoutType is always stored in the secondary layout. |
| + var layoutType = |
| + dragLayout.isPrimary ? baseLayout.layoutType : dragLayout.layoutType; |
| + |
| + if (layoutType == options.DisplayLayoutType.LEFT || |
| + layoutType == options.DisplayLayoutType.RIGHT) { |
| var top = Math.max( |
| draggingDiv.offsetTop, |
| baseDiv.offsetTop - draggingDiv.offsetHeight + MIN_OFFSET_OVERLAP); |
| @@ -890,28 +897,26 @@ cr.define('options', function() { |
| if (i != numDisplays - 1) |
| div.classList.add('display-mirrored'); |
| this.displaysView_.appendChild(div); |
| - |
| - // Not currently used but set for consistency / debugging. |
| - this.displayLayoutMap_[this.displays_[i].id].div = div; |
| } |
| }, |
| /** |
| * Creates a DisplayLayout object representing the display. |
| * @param {!options.DisplayInfo} display |
| + * @param {!options.DisplayLayoutType} layoutType |
| * @return {!options.DisplayLayout} |
| * @private |
| */ |
| - createDisplayLayout_: function(display) { |
| - /** @type {options.DisplayLayout} */ var displayLayout = { |
| + createDisplayLayout_: function(display, layoutType) { |
| + return { |
| bounds: display.bounds, |
| div: null, |
| id: display.id, |
| isPrimary: display.isPrimary, |
| + layoutType: layoutType, |
| name: display.name, |
| originalPosition: {x: 0, y: 0} |
| }; |
| - return displayLayout; |
| }, |
| /** |
| @@ -1071,7 +1076,8 @@ cr.define('options', function() { |
| this.displayLayoutMap_ = {}; |
| for (var i = 0; i < displays.length; i++) { |
| var display = displays[i]; |
| - this.displayLayoutMap_[display.id] = this.createDisplayLayout_(display); |
| + this.displayLayoutMap_[display.id] = |
| + this.createDisplayLayout_(display, layoutType); |
| } |
| var mirroring = mode == options.MultiDisplayMode.MIRRORING; |