Index: chrome/browser/resources/options2/chromeos/display_options.js |
diff --git a/chrome/browser/resources/options2/chromeos/display_options.js b/chrome/browser/resources/options2/chromeos/display_options.js |
index 7df934f57e0bfe42bb5adc3f2472d010e696067b..b4e43acc28502f8e53a55617db08cd6f3293d8b0 100644 |
--- a/chrome/browser/resources/options2/chromeos/display_options.js |
+++ b/chrome/browser/resources/options2/chromeos/display_options.js |
@@ -44,15 +44,14 @@ cr.define('options', function() { |
initializePage: function() { |
OptionsPage.prototype.initializePage.call(this); |
- $('display-options-confirm').onclick = function() { |
- OptionsPage.closeOverlay(); |
- }; |
- |
$('display-options-toggle-mirroring').onclick = (function() { |
this.mirroring_ = !this.mirroring_; |
chrome.send('setMirroring', [this.mirroring_]); |
}).bind(this); |
+ $('display-options-apply').onclick = (function() { |
+ chrome.send('setDisplayLayout', [this.layout_]); |
+ }).bind(this); |
chrome.send('getDisplayInfo'); |
}, |
@@ -78,36 +77,36 @@ cr.define('options', function() { |
// Note that current code of moving display-rectangles doesn't work |
// if there are >=3 displays. This is our assumption for M21. |
// TODO(mukai): Fix the code to allow >=3 displays. |
- var mouse_position = { |
+ var mousePosition = { |
x: e.pageX - this.dragging_.offset.x, |
y: e.pageY - this.dragging_.offset.y |
}; |
- var new_position = { |
- x: mouse_position.x - this.dragging_.click_location.x, |
- y: mouse_position.y - this.dragging_.click_location.y |
+ var newPosition = { |
+ x: mousePosition.x - this.dragging_.clickLocation.x, |
+ y: mousePosition.y - this.dragging_.clickLocation.y |
}; |
- var primary_div = this.displays_[0].div; |
+ var primaryDiv = this.displays_[0].div; |
var display = this.dragging_.display; |
// Separate the area into four (LEFT/RIGHT/TOP/BOTTOM) by the diagonals of |
// the primary display, and decide which area the display should reside. |
- var diagonal_slope = primary_div.offsetHeight / primary_div.offsetWidth; |
- var top_down_intercept = |
- primary_div.offsetTop - primary_div.offsetLeft * diagonal_slope; |
- var bottom_up_intercept = primary_div.offsetTop + |
- primary_div.offsetHeight + primary_div.offsetLeft * diagonal_slope; |
- |
- if (mouse_position.y > |
- top_down_intercept + mouse_position.x * diagonal_slope) { |
- if (mouse_position.y > |
- bottom_up_intercept - mouse_position.x * diagonal_slope) |
+ var diagonalSlope = primaryDiv.offsetHeight / primaryDiv.offsetWidth; |
+ var topDownIntercept = |
+ primaryDiv.offsetTop - primaryDiv.offsetLeft * diagonalSlope; |
+ var bottomUpIntercept = primaryDiv.offsetTop + |
+ primaryDiv.offsetHeight + primaryDiv.offsetLeft * diagonalSlope; |
+ |
+ if (mousePosition.y > |
+ topDownIntercept + mousePosition.x * diagonalSlope) { |
+ if (mousePosition.y > |
+ bottomUpIntercept - mousePosition.x * diagonalSlope) |
this.layout_ = SecondaryDisplayLayout.BOTTOM; |
else |
this.layout_ = SecondaryDisplayLayout.LEFT; |
} else { |
- if (mouse_position.y > |
- bottom_up_intercept - mouse_position.x * diagonal_slope) |
+ if (mousePosition.y > |
+ bottomUpIntercept - mousePosition.x * diagonalSlope) |
this.layout_ = SecondaryDisplayLayout.RIGHT; |
else |
this.layout_ = SecondaryDisplayLayout.TOP; |
@@ -115,39 +114,39 @@ cr.define('options', function() { |
if (this.layout_ == SecondaryDisplayLayout.LEFT || |
this.layout_ == SecondaryDisplayLayout.RIGHT) { |
- if (new_position.y > primary_div.offsetTop + primary_div.offsetHeight) |
+ if (newPosition.y > primaryDiv.offsetTop + primaryDiv.offsetHeight) |
this.layout_ = SecondaryDisplayLayout.BOTTOM; |
- else if (new_position.y + display.div.offsetHeight < |
- primary_div.offsetTop) |
+ else if (newPosition.y + display.div.offsetHeight < |
+ primaryDiv.offsetTop) |
this.layout_ = SecondaryDisplayLayout.TOP; |
} else { |
- if (new_position.y > primary_div.offsetLeft + primary_div.offsetWidth) |
+ if (newPosition.y > primaryDiv.offsetLeft + primaryDiv.offsetWidth) |
this.layout_ = SecondaryDisplayLayout.RIGHT; |
- else if (new_position.y + display.div.offsetWidth < |
- primary_div.offstLeft) |
+ else if (newPosition.y + display.div.offsetWidth < |
+ primaryDiv.offstLeft) |
this.layout_ = SecondaryDisplayLayout.LEFT; |
} |
switch (this.layout_) { |
case SecondaryDisplayLayout.RIGHT: |
display.div.style.left = |
- primary_div.offsetLeft + primary_div.offsetWidth + 'px'; |
- display.div.style.top = new_position.y + 'px'; |
+ primaryDiv.offsetLeft + primaryDiv.offsetWidth + 'px'; |
+ display.div.style.top = newPosition.y + 'px'; |
break; |
case SecondaryDisplayLayout.LEFT: |
display.div.style.left = |
- primary_div.offsetLeft - display.div.offsetWidth + 'px'; |
- display.div.style.top = new_position.y + 'px'; |
+ primaryDiv.offsetLeft - display.div.offsetWidth + 'px'; |
+ display.div.style.top = newPosition.y + 'px'; |
break; |
case SecondaryDisplayLayout.TOP: |
display.div.style.top = |
- primary_div.offsetTop - display.div.offsetHeight + 'px'; |
- display.div.style.left = new_position.x + 'px'; |
+ primaryDiv.offsetTop - display.div.offsetHeight + 'px'; |
+ display.div.style.left = newPosition.x + 'px'; |
break; |
case SecondaryDisplayLayout.BOTTOM: |
display.div.style.top = |
- primary_div.offsetTop + primary_div.offsetHeight + 'px'; |
- display.div.style.left = new_position.x + 'px'; |
+ primaryDiv.offsetTop + primaryDiv.offsetHeight + 'px'; |
+ display.div.style.left = newPosition.x + 'px'; |
break; |
} |
@@ -166,30 +165,35 @@ cr.define('options', function() { |
if (e.button != 0) |
return true; |
- if (e.target == this.displays_view_) |
- return true; |
+ this.focusedIndex_ = null; |
+ for (var i = 0; i < this.displays_.length; i++) { |
+ var display = this.displays_[i]; |
+ if (this.displays_[i].div == e.target || |
+ (i == 0 && $('display-launcher') == e.target)) { |
+ this.focusedIndex_ = i; |
+ break; |
+ } |
+ } |
for (var i = 0; i < this.displays_.length; i++) { |
var display = this.displays_[i]; |
- if (display.div == e.target) { |
- // Do not drag the primary monitor. |
- if (i == 0) |
- return true; |
+ display.div.className = 'displays-display'; |
+ if (i != this.focusedIndex_) |
+ continue; |
+ |
+ display.div.classList.add('displays-focused'); |
+ // Do not drag the primary monitor. |
+ if (i == 0) |
+ continue; |
- this.focused_index_ = i; |
- this.dragging_ = { |
+ this.dragging_ = { |
display: display, |
- click_location: {x: e.offsetX, y: e.offsetY}, |
+ clickLocation: {x: e.offsetX, y: e.offsetY}, |
offset: {x: e.pageX - e.offsetX - display.div.offsetLeft, |
y: e.pageY - e.offsetY - display.div.offsetTop} |
- }; |
- if (display.div.className.indexOf('displays-focused') == -1) |
- display.div.className += ' displays-focused'; |
- } else if (display.div.className.indexOf('displays-focused') >= 0) { |
- // We can assume that '-primary' monitor doesn't have '-focused'. |
- this.displays_[i].div.className = 'displays-display'; |
- } |
+ }; |
} |
+ this.updateSelectedDisplayDescription_(); |
return false; |
}, |
@@ -199,26 +203,58 @@ cr.define('options', function() { |
* @param {Event} e The mouse up event. |
*/ |
onMouseUp_: function(e) { |
- if (this.dragging_) { |
+ if (this.dragging_) |
this.dragging_ = null; |
- chrome.send('setDisplayLayout', [this.layout_]); |
- } |
+ this.updateSelectedDisplayDescription_(); |
return false; |
}, |
/** |
+ * Updates the description of the selected display section. |
+ * @private |
+ */ |
+ updateSelectedDisplayDescription_: function() { |
+ if (this.focusedIndex_ == null || |
+ this.displays_[this.focusedIndex_] == null) { |
+ $('selected-display-data-container').hidden = true; |
+ $('display-configuration-arrow').hidden = true; |
+ return; |
+ } |
+ |
+ $('selected-display-data-container').hidden = false; |
+ var display = this.displays_[this.focusedIndex_]; |
+ var nameElement = $('selected-display-name'); |
+ while (nameElement.childNodes.length > 0) |
+ nameElement.removeChild(nameElement.firstChild); |
+ nameElement.appendChild(document.createTextNode(display.name)); |
+ |
+ var resolutionData = display.width + 'x' + display.height; |
+ var resolutionElement = $('selected-display-resolution'); |
+ while (resolutionElement.childNodes.length > 0) |
+ resolutionElement.removeChild(resolutionElement.firstChild); |
+ resolutionElement.appendChild(document.createTextNode(resolutionData)); |
+ |
+ var arrow = $('display-configuration-arrow'); |
+ arrow.hidden = false; |
+ arrow.style.top = |
+ $('display-configurations').offsetTop - arrow.offsetHeight / 2 + 'px'; |
+ arrow.style.left = display.div.offsetLeft + display.div.offsetWidth / 2 - |
+ arrow.offsetWidth / 2 + 'px'; |
+ }, |
+ |
+ /** |
* Clears the drawing area for display rectangles. |
* @private |
*/ |
resetDisplaysView_: function() { |
- var displays_view_host = $('display-options-displays-view-host'); |
- displays_view_host.removeChild(displays_view_host.firstChild); |
- this.displays_view_ = document.createElement('div'); |
- this.displays_view_.id = 'display-options-displays-view'; |
- this.displays_view_.onmousemove = this.onMouseMove_.bind(this); |
- this.displays_view_.onmousedown = this.onMouseDown_.bind(this); |
- this.displays_view_.onmouseup = this.onMouseUp_.bind(this); |
- displays_view_host.appendChild(this.displays_view_); |
+ var displaysViewHost = $('display-options-displays-view-host'); |
+ displaysViewHost.removeChild(displaysViewHost.firstChild); |
+ this.displaysView_ = document.createElement('div'); |
+ this.displaysView_.id = 'display-options-displays-view'; |
+ this.displaysView_.onmousemove = this.onMouseMove_.bind(this); |
+ this.displaysView_.onmousedown = this.onMouseDown_.bind(this); |
+ this.displaysView_.onmouseup = this.onMouseUp_.bind(this); |
+ displaysViewHost.appendChild(this.displaysView_); |
}, |
/** |
@@ -232,27 +268,37 @@ cr.define('options', function() { |
// the display_options is enabled. Don't rely on displays_.length because |
// there is only one display from chrome's perspective in mirror mode. |
/** @const */ var MIN_NUM_DISPLAYS = 2; |
+ /** @const */ var MIRRORING_VERTICAL_MARGIN = 20; |
// The width/height should be same as the primary display: |
var width = this.displays_[0].width * VISUAL_SCALE; |
var height = this.displays_[0].height * VISUAL_SCALE; |
- var num_displays = Math.max(MIN_NUM_DISPLAYS, this.displays_.length); |
+ var numDisplays = Math.max(MIN_NUM_DISPLAYS, this.displays_.length); |
+ |
+ var totalWidth = width + numDisplays * MIRRORING_OFFSET_PIXELS; |
+ var totalHeight = height + numDisplays * MIRRORING_OFFSET_PIXELS; |
+ |
+ this.displaysView_.style.height = totalHeight + 'px'; |
+ this.displaysView_.classList.add( |
+ 'display-options-displays-view-mirroring'); |
- this.displays_view_.style.height = |
- height + num_displays * MIRRORING_OFFSET_PIXELS + 'px'; |
+ // The displays should be centered. |
+ var offsetX = |
+ $('display-options-displays-view').offsetWidth / 2 - totalWidth / 2; |
- for (var i = 0; i < num_displays; i++) { |
+ for (var i = 0; i < numDisplays; i++) { |
var div = document.createElement('div'); |
div.className = 'displays-display'; |
div.style.top = i * MIRRORING_OFFSET_PIXELS + 'px'; |
- div.style.left = i * MIRRORING_OFFSET_PIXELS + 'px'; |
+ div.style.left = i * MIRRORING_OFFSET_PIXELS + offsetX + 'px'; |
div.style.width = width + 'px'; |
div.style.height = height + 'px'; |
div.style.zIndex = i; |
- if (i == num_displays - 1) |
- div.className += ' displays-primary'; |
- this.displays_view_.appendChild(div); |
+ // set 'display-mirrored' class for the background display rectangles. |
+ if (i != numDisplays - 1) |
+ div.classList.add('display-mirrored'); |
+ this.displaysView_.appendChild(div); |
} |
}, |
@@ -261,58 +307,87 @@ cr.define('options', function() { |
* @private |
*/ |
layoutDisplays_: function() { |
- var total_size = {width: 0, height: 0}; |
+ var totalHeight = 0; |
for (var i = 0; i < this.displays_.length; i++) { |
- total_size.width += this.displays_[i].width * VISUAL_SCALE; |
- total_size.height += this.displays_[i].height * VISUAL_SCALE; |
+ totalHeight += this.displays_[i].height * VISUAL_SCALE; |
} |
- this.displays_view_.style.width = total_size.width + 'px'; |
- this.displays_view_.style.height = total_size.height + 'px'; |
- |
- var base_point = {x: 0, y: 0}; |
- if (this.layout_ == SecondaryDisplayLayout.LEFT) |
- base_point.x = total_size.width; |
- else if (this.layout_ == SecondaryDisplayLayout.TOP) |
- base_point.y = total_size.height; |
+ // Prepare enough area for thisplays_view by adding the maximum height. |
+ this.displaysView_.style.height = totalHeight + 'px'; |
+ var basePoint = {x: 0, y: 0}; |
+ var boundingSize = {width: 0, height: 0}; |
for (var i = 0; i < this.displays_.length; i++) { |
var display = this.displays_[i]; |
var div = document.createElement('div'); |
display.div = div; |
div.className = 'displays-display'; |
- if (i == 0) |
- div.className += ' displays-primary'; |
- else if (i == this.focused_index_) |
- div.className += ' displays-focused'; |
+ if (i == this.focusedIndex_) |
+ div.classList.add('displays-focused'); |
div.style.width = display.width * VISUAL_SCALE + 'px'; |
div.style.height = display.height * VISUAL_SCALE + 'px'; |
div.style.lineHeight = div.style.height; |
+ if (i == 0) { |
+ // Assumes that first display is primary and put a grey rectangle to |
+ // denote launcher below. |
+ var launcher = document.createElement('div'); |
+ launcher.id = 'display-launcher'; |
+ launcher.style.width = display.div.style.width; |
+ div.appendChild(launcher); |
+ } |
switch (this.layout_) { |
case SecondaryDisplayLayout.RIGHT: |
display.div.style.top = '0'; |
- display.div.style.left = base_point.x + 'px'; |
- base_point.x += display.width * VISUAL_SCALE; |
+ display.div.style.left = basePoint.x + 'px'; |
+ basePoint.x += display.width * VISUAL_SCALE; |
+ boundingSize.width += display.width * VISUAL_SCALE; |
+ boundingSize.height = Math.max(boundingSize.height, |
+ display.height * VISUAL_SCALE); |
break; |
case SecondaryDisplayLayout.LEFT: |
display.div.style.top = '0'; |
- base_point.x -= display.width * VISUAL_SCALE; |
- display.div.style.left = base_point.x + 'px'; |
+ basePoint.x -= display.width * VISUAL_SCALE; |
+ display.div.style.left = basePoint.x + 'px'; |
+ boundingSize.width += display.width * VISUAL_SCALE; |
+ boundingSize.height = Math.max(boundingSize.height, |
+ display.height * VISUAL_SCALE); |
break; |
case SecondaryDisplayLayout.TOP: |
display.div.style.left = '0'; |
- base_point.y -= display.height * VISUAL_SCALE; |
- display.div.style.top = base_point.y + 'px'; |
+ basePoint.y -= display.height * VISUAL_SCALE; |
+ display.div.style.top = basePoint.y + 'px'; |
+ boundingSize.width = Math.max(boundingSize.width, |
+ display.width * VISUAL_SCALE); |
+ boundingSize.height += display.height * VISUAL_SCALE; |
break; |
case SecondaryDisplayLayout.BOTTOM: |
display.div.style.left = '0'; |
- display.div.style.top = base_point.y + 'px'; |
- base_point.y += display.height * VISUAL_SCALE; |
+ display.div.style.top = basePoint.y + 'px'; |
+ basePoint.y += display.height * VISUAL_SCALE; |
+ boundingSize.width = Math.max(boundingSize.width, |
+ display.width * VISUAL_SCALE); |
+ boundingSize.height += display.height * VISUAL_SCALE; |
break; |
} |
- this.displays_view_.appendChild(div); |
+ div.appendChild(document.createTextNode(display.name)); |
+ |
+ this.displaysView_.appendChild(div); |
+ } |
+ |
+ // Centering the display rectangles. |
+ var offset = {x: $('display-options-displays-view').offsetWidth / 2 - |
+ boundingSize.width / 2, |
+ y: totalHeight / 2 - boundingSize.height / 2}; |
+ if (basePoint.x < 0) |
+ offset.x -= basePoint.x; |
+ if (basePoint.y < 0) |
+ offset.y -= basePoint.y; |
+ for (var i = 0; i < this.displays_.length; i++) { |
+ var div = this.displays_[i].div; |
+ div.style.left = div.offsetLeft + offset.x + 'px'; |
+ div.style.top = div.offsetTop + offset.y + 'px'; |
} |
}, |
@@ -333,8 +408,10 @@ cr.define('options', function() { |
// Focus to the first display next to the primary one when |displays| list |
// is updated. |
- if (this.displays_.length != displays.length) |
- this.focused_index_ = 1; |
+ if (this.mirroring_) |
+ this.focusedIndex_ = null; |
+ else if (this.displays_.length != displays.length) |
+ this.focusedIndex_ = 1; |
this.displays_ = displays; |
@@ -343,6 +420,7 @@ cr.define('options', function() { |
this.layoutMirroringDisplays_(); |
else |
this.layoutDisplays_(); |
+ this.updateSelectedDisplayDescription_(); |
}, |
}; |