Index: chrome/browser/resources/settings/device_page/display_layout.js |
diff --git a/chrome/browser/resources/settings/device_page/display_layout.js b/chrome/browser/resources/settings/device_page/display_layout.js |
index 5004a5db05345dd6436165912e10d3e70ea133d0..f3a5220787d49fc84e622bea0489fef27d65bf0d 100644 |
--- a/chrome/browser/resources/settings/device_page/display_layout.js |
+++ b/chrome/browser/resources/settings/device_page/display_layout.js |
@@ -17,6 +17,7 @@ Polymer({ |
behaviors: [ |
Polymer.IronResizableBehavior, |
+ DragBehavior, |
], |
properties: { |
@@ -32,6 +33,12 @@ Polymer({ |
*/ |
layouts: Array, |
+ /** |
+ * Whether or not mirroring is enabled. |
+ * @type {boolean} |
+ */ |
+ mirroring: false, |
+ |
/** @type {!chrome.system.display.DisplayUnitInfo|undefined} */ |
selectedDisplay: Object, |
@@ -42,14 +49,17 @@ Polymer({ |
visualScale: 1, |
}, |
- /** @private {!Object<chrome.system.display.DisplayUnitInfo>} */ |
- displayMap_: {}, |
+ /** @private {!Object<chrome.system.display.Bounds>} */ |
+ displayBoundsMap_: {}, |
/** @private {!Object<chrome.system.display.DisplayLayout>} */ |
layoutMap_: {}, |
- /** @private {!Object<chrome.system.display.Bounds>} */ |
- boundsMap_: {}, |
+ /** |
+ * The calculated bounds used for generating the div bounds. |
+ * @private {!Object<chrome.system.display.Bounds>} |
+ */ |
+ calculatedBoundsMap_: {}, |
/** @private {!{left: number, top: number}} */ |
visualOffset_: {left: 0, top: 0}, |
@@ -67,6 +77,11 @@ Polymer({ |
tryCalcVisualScale(); |
}, |
+ /** @override */ |
+ detached: function() { |
+ this.initializeDrag(false); |
+ }, |
+ |
/** |
* Called explicitly when |this.displays| and their associated |this.layouts| |
* have been fetched from chrome. |
@@ -77,19 +92,24 @@ Polymer({ |
this.displays = displays; |
this.layouts = layouts; |
- this.displayMap_ = {}; |
+ this.mirroring = displays.length > 0 && !!displays[0].mirroringSourceId; |
+ |
+ this.displayBoundsMap_ = {}; |
for (let display of this.displays) |
- this.displayMap_[display.id] = display; |
+ this.displayBoundsMap_[display.id] = display.bounds; |
this.layoutMap_ = {}; |
for (let layout of this.layouts) |
this.layoutMap_[layout.id] = layout; |
- this.boundsMap_ = {}; |
+ this.calculatedBoundsMap_ = {}; |
for (let display of this.displays) |
- this.calcDisplayBounds_(display); |
+ this.calculateBounds_(display.id, display.bounds); |
this.calculateVisualScale_(); |
+ |
+ this.initializeDrag( |
+ !this.mirroring, this.$.displayArea, this.onDrag_.bind(this)); |
}, |
/** |
@@ -107,7 +127,7 @@ Polymer({ |
} |
var display = this.displays[0]; |
- var bounds = this.boundsMap_[display.id]; |
+ var bounds = this.calculatedBoundsMap_[display.id]; |
var displayInfoBoundingBox = { |
left: bounds.left, |
right: bounds.left + bounds.width, |
@@ -118,7 +138,7 @@ Polymer({ |
var maxHeight = bounds.height; |
for (let i = 1; i < this.displays.length; ++i) { |
display = this.displays[i]; |
- bounds = this.boundsMap_[display.id]; |
+ bounds = this.calculatedBoundsMap_[display.id]; |
displayInfoBoundingBox.left = |
Math.min(displayInfoBoundingBox.left, bounds.left); |
displayInfoBoundingBox.right = |
@@ -154,15 +174,16 @@ Polymer({ |
}, |
/** |
- * @param {!chrome.system.display.DisplayUnitInfo} display |
+ * @param {string} id |
+ * @param {!chrome.system.display.Bounds} displayBounds |
* @param {number} visualScale |
* @return {string} The style string for the div. |
* @private |
*/ |
- getDivStyle_: function(display, visualScale) { |
+ getDivStyle_: function(id, displayBounds, visualScale) { |
// This matches the size of the box-shadow or border in CSS. |
/** @const {number} */ var BORDER = 2; |
- var bounds = this.boundsMap_[display.id]; |
+ var bounds = this.calculatedBoundsMap_[id]; |
var height = Math.round(bounds.height * this.visualScale) - BORDER * 2; |
var width = Math.round(bounds.width * this.visualScale) - BORDER * 2; |
var left = |
@@ -196,29 +217,29 @@ Polymer({ |
* Caches the display bounds so that parent bounds are only calculated once. |
* TODO(stevenjb): Move this function and the maps it requires to a separate |
* behavior which will include snapping and collisions. |
- * @param {!chrome.system.display.DisplayUnitInfo} display |
+ * @param {string} id |
+ * @param {!chrome.system.display.Bounds} bounds |
* @private |
*/ |
- calcDisplayBounds_: function(display) { |
- if (display.id in this.boundsMap_) |
+ calculateBounds_: function(id, bounds) { |
+ if (id in this.calculatedBoundsMap_) |
return; // Already calculated (i.e. a parent of a previous display) |
var left, top; |
- if (display.isPrimary) { |
- left = -display.bounds.width / 2; |
- top = -display.bounds.height / 2; |
+ var layout = this.layoutMap_[id]; |
+ if (!layout || !layout.parentId) { |
+ left = -bounds.width / 2; |
+ top = -bounds.height / 2; |
} else { |
- var layout = this.layoutMap_[display.id]; |
- assert(layout.parentId); |
- var parentDisplay = this.displayMap_[layout.parentId]; |
+ var parentDisplayBounds = this.displayBoundsMap_[layout.parentId]; |
var parentBounds; |
- if (!(parentDisplay.id in this.boundsMap_)) |
- this.calcDisplayBounds_(parentDisplay); |
- parentBounds = this.boundsMap_[parentDisplay.id]; |
+ if (!(layout.parentId in this.calculatedBoundsMap_)) |
+ this.calculateBounds_(layout.parentId, parentDisplayBounds); |
+ parentBounds = this.calculatedBoundsMap_[layout.parentId]; |
left = parentBounds.left; |
top = parentBounds.top; |
switch (layout.position) { |
case chrome.system.display.LayoutPosition.TOP: |
- top -= display.bounds.height; |
+ top -= bounds.height; |
break; |
case chrome.system.display.LayoutPosition.RIGHT: |
left += parentBounds.width; |
@@ -227,18 +248,52 @@ Polymer({ |
top += parentBounds.height; |
break; |
case chrome.system.display.LayoutPosition.LEFT: |
- left -= display.bounds.height; |
+ left -= bounds.height; |
break; |
} |
} |
var result = { |
left: left, |
top: top, |
- width: display.bounds.width, |
- height: display.bounds.height |
+ width: bounds.width, |
+ height: bounds.height |
}; |
- this.boundsMap_[display.id] = result; |
- } |
+ this.calculatedBoundsMap_[id] = result; |
+ }, |
+ |
+ /** |
+ * @param {string} id |
+ * @param {?DragPosition} amount |
+ */ |
+ onDrag_(id, amount) { |
+ id = id.substr(1); // Skip prefix |
+ |
+ var newBounds; |
+ if (!amount) { |
+ // TODO(stevenjb): Resolve layout and send update. |
+ newBounds = this.calculatedBoundsMap_[id]; |
+ } else { |
+ // Make sure the dragged display is also selected. |
+ if (id != this.selectedDisplay.id) |
+ this.fire('select-display', id); |
+ |
+ var calculatedBounds = this.calculatedBoundsMap_[id]; |
+ newBounds = |
+ /** @type {chrome.system.display.Bounds} */ ( |
+ Object.assign({}, calculatedBounds)); |
+ newBounds.left += Math.round(amount.x / this.visualScale); |
+ newBounds.top += Math.round(amount.y / this.visualScale); |
+ // TODO(stevenjb): Update layout. |
+ } |
+ var left = |
+ this.visualOffset_.left + Math.round(newBounds.left * this.visualScale); |
+ var top = |
+ this.visualOffset_.top + Math.round(newBounds.top * this.visualScale); |
+ var div = this.$$('#_' + id); |
+ div.style.left = '' + left + 'px'; |
+ div.style.top = '' + top + 'px'; |
+ }, |
+ |
}); |
})(); |