Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1127)

Unified Diff: chrome/browser/resources/settings/device_page/display_layout.js

Issue 2097763004: MD Settings: Display: Add snapping and collisions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@issue_547080_display_settings8a_drag
Patch Set: Rebase + More Feedback Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 f3a5220787d49fc84e622bea0489fef27d65bf0d..c37f9cb548a7da77d73d6f00505fe7af17e04b15 100644
--- a/chrome/browser/resources/settings/device_page/display_layout.js
+++ b/chrome/browser/resources/settings/device_page/display_layout.js
@@ -18,6 +18,7 @@ Polymer({
behaviors: [
Polymer.IronResizableBehavior,
DragBehavior,
+ LayoutBehavior,
],
properties: {
@@ -28,12 +29,6 @@ Polymer({
displays: Array,
/**
- * Array of display layouts.
- * @type {!Array<!chrome.system.display.DisplayLayout>}
- */
- layouts: Array,
-
- /**
* Whether or not mirroring is enabled.
* @type {boolean}
*/
@@ -49,18 +44,6 @@ Polymer({
visualScale: 1,
},
- /** @private {!Object<chrome.system.display.Bounds>} */
- displayBoundsMap_: {},
-
- /** @private {!Object<chrome.system.display.DisplayLayout>} */
- layoutMap_: {},
-
- /**
- * 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},
@@ -78,9 +61,7 @@ Polymer({
},
/** @override */
- detached: function() {
- this.initializeDrag(false);
- },
+ detached: function() { this.initializeDrag(false); },
/**
* Called explicitly when |this.displays| and their associated |this.layouts|
@@ -94,17 +75,7 @@ Polymer({
this.mirroring = displays.length > 0 && !!displays[0].mirroringSourceId;
- this.displayBoundsMap_ = {};
- for (let display of this.displays)
- this.displayBoundsMap_[display.id] = display.bounds;
-
- this.layoutMap_ = {};
- for (let layout of this.layouts)
- this.layoutMap_[layout.id] = layout;
-
- this.calculatedBoundsMap_ = {};
- for (let display of this.displays)
- this.calculateBounds_(display.id, display.bounds);
+ this.initializeDisplayLayout(displays, layouts);
this.calculateVisualScale_();
@@ -127,8 +98,8 @@ Polymer({
}
var display = this.displays[0];
- var bounds = this.calculatedBoundsMap_[display.id];
- var displayInfoBoundingBox = {
+ var bounds = this.getCalculatedDisplayBounds(display.id);
+ var boundsBoundingBox = {
left: bounds.left,
right: bounds.left + bounds.width,
top: bounds.top,
@@ -138,34 +109,36 @@ Polymer({
var maxHeight = bounds.height;
for (let i = 1; i < this.displays.length; ++i) {
display = this.displays[i];
- bounds = this.calculatedBoundsMap_[display.id];
- displayInfoBoundingBox.left =
- Math.min(displayInfoBoundingBox.left, bounds.left);
- displayInfoBoundingBox.right =
- Math.max(displayInfoBoundingBox.right, bounds.left + bounds.width);
- displayInfoBoundingBox.top =
- Math.min(displayInfoBoundingBox.top, bounds.top);
- displayInfoBoundingBox.bottom =
- Math.max(displayInfoBoundingBox.bottom, bounds.top + bounds.height);
+ bounds = this.getCalculatedDisplayBounds(display.id);
+ boundsBoundingBox.left = Math.min(boundsBoundingBox.left, bounds.left);
+ boundsBoundingBox.right =
+ Math.max(boundsBoundingBox.right, bounds.left + bounds.width);
+ boundsBoundingBox.top = Math.min(boundsBoundingBox.top, bounds.top);
+ boundsBoundingBox.bottom =
+ Math.max(boundsBoundingBox.bottom, bounds.top + bounds.height);
maxWidth = Math.max(maxWidth, bounds.width);
maxHeight = Math.max(maxHeight, bounds.height);
}
// Create a margin around the bounding box equal to the size of the
// largest displays.
- var displayInfoBoundsWidth = displayInfoBoundingBox.right -
- displayInfoBoundingBox.left + maxWidth * 2;
- var displayInfoBoundsHeight = displayInfoBoundingBox.bottom -
- displayInfoBoundingBox.top + maxHeight * 2;
+ var boundsWidth = boundsBoundingBox.right - boundsBoundingBox.left;
+ var boundsHeight = boundsBoundingBox.bottom - boundsBoundingBox.top;
// Calculate the scale.
- var horizontalScale = displayAreaDiv.offsetWidth / displayInfoBoundsWidth;
- var verticalScale = displayAreaDiv.offsetHeight / displayInfoBoundsHeight;
+ var horizontalScale =
+ displayAreaDiv.offsetWidth / (boundsWidth + maxWidth * 2);
+ var verticalScale =
+ displayAreaDiv.offsetHeight / (boundsHeight + maxHeight * 2);
var scale = Math.min(horizontalScale, verticalScale);
// Calculate the offset.
- this.visualOffset_.left = (-displayInfoBoundingBox.left + maxWidth) * scale;
- this.visualOffset_.top = (-displayInfoBoundingBox.top + maxHeight) * scale;
+ this.visualOffset_.left =
+ ((displayAreaDiv.offsetWidth - (boundsWidth * scale)) / 2) -
+ boundsBoundingBox.left * scale;
+ this.visualOffset_.top =
+ ((displayAreaDiv.offsetHeight - (boundsHeight * scale)) / 2) -
+ boundsBoundingBox.top * scale;
// Update the scale which will trigger calls to getDivStyle_.
this.visualScale = Math.max(MIN_VISUAL_SCALE, scale);
@@ -183,7 +156,7 @@ Polymer({
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.calculatedBoundsMap_[id];
+ var bounds = this.getCalculatedDisplayBounds(id);
var height = Math.round(bounds.height * this.visualScale) - BORDER * 2;
var width = Math.round(bounds.width * this.visualScale) - BORDER * 2;
var left =
@@ -205,60 +178,14 @@ Polymer({
},
/**
- * @param {!{model: !{index: number}}} e
+ * @param {!{model: !{item: !chrome.system.display.DisplayUnitInfo},
+ * target: !PaperButtonElement}} e
* @private
*/
onSelectDisplayTap_: function(e) {
- this.fire('select-display', e.model.index);
- },
-
- /**
- * Recursively calculate the bounds of a display relative to its parents.
- * 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 {string} id
- * @param {!chrome.system.display.Bounds} bounds
- * @private
- */
- calculateBounds_: function(id, bounds) {
- if (id in this.calculatedBoundsMap_)
- return; // Already calculated (i.e. a parent of a previous display)
- var left, top;
- var layout = this.layoutMap_[id];
- if (!layout || !layout.parentId) {
- left = -bounds.width / 2;
- top = -bounds.height / 2;
- } else {
- var parentDisplayBounds = this.displayBoundsMap_[layout.parentId];
- var parentBounds;
- 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 -= bounds.height;
- break;
- case chrome.system.display.LayoutPosition.RIGHT:
- left += parentBounds.width;
- break;
- case chrome.system.display.LayoutPosition.BOTTOM:
- top += parentBounds.height;
- break;
- case chrome.system.display.LayoutPosition.LEFT:
- left -= bounds.height;
- break;
- }
- }
- var result = {
- left: left,
- top: top,
- width: bounds.width,
- height: bounds.height
- };
- this.calculatedBoundsMap_[id] = result;
+ this.fire('select-display', e.model.item.id);
+ // Force active in case the selected display was clicked.
+ e.target.active = true;
},
/**
@@ -270,20 +197,20 @@ Polymer({
var newBounds;
if (!amount) {
- // TODO(stevenjb): Resolve layout and send update.
- newBounds = this.calculatedBoundsMap_[id];
+ this.finishUpdateDisplayBounds(id);
+ newBounds = this.getCalculatedDisplayBounds(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];
+ var calculatedBounds = this.getCalculatedDisplayBounds(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.
+ newBounds = this.updateDisplayBounds(id, newBounds);
}
var left =
this.visualOffset_.left + Math.round(newBounds.left * this.visualScale);

Powered by Google App Engine
This is Rietveld 408576698