Chromium Code Reviews| Index: Source/devtools/front_end/SplitView.js |
| diff --git a/Source/devtools/front_end/SplitView.js b/Source/devtools/front_end/SplitView.js |
| index 7e55d929a2e03eb55d84fc232b737a7789b913b2..a3e33bd0059b5a0913e6100bcbaa3e31499d71a7 100644 |
| --- a/Source/devtools/front_end/SplitView.js |
| +++ b/Source/devtools/front_end/SplitView.js |
| @@ -386,13 +386,14 @@ WebInspector.SplitView.prototype = { |
| /** |
| * @param {number} size |
| * @param {boolean} animate |
| + * @param {boolean=} userAction |
| */ |
| - _innerSetSidebarSize: function(size, animate) |
| + _innerSetSidebarSize: function(size, animate, userAction) |
| { |
| if (this._showMode !== WebInspector.SplitView.ShowMode.Both || !this.isShowing()) |
| return; |
| - size = this._applyConstraints(size); |
| + size = this._applyConstraints(size, userAction); |
| if (this._sidebarSize === size) |
| return; |
| @@ -517,28 +518,54 @@ WebInspector.SplitView.prototype = { |
| /** |
| * @param {number} sidebarSize |
| + * @param {boolean=} userAction |
| * @return {number} |
| */ |
| - _applyConstraints: function(sidebarSize) |
| + _applyConstraints: function(sidebarSize, userAction) |
| { |
| var totalSize = this.totalSize(); |
| var size = this._sidebarView.minimumSize(); |
| - var from = this.isVertical() ? size.width : size.height; |
| - if (!from) |
| - from = WebInspector.SplitView.MinPadding; |
| + var minSidebarSize = this.isVertical() ? size.width : size.height; |
| + if (!minSidebarSize) |
| + minSidebarSize = WebInspector.SplitView.MinPadding; |
| + |
| + var preferredSidebarSize = this.isVertical() ? size.preferredWidth : size.preferredHeight; |
| + if (!preferredSidebarSize) |
| + preferredSidebarSize = WebInspector.SplitView.MinPadding; |
| + // Allow sidebar to be less than preferred by explicit user action. |
| + if (sidebarSize < preferredSidebarSize) |
| + preferredSidebarSize = Math.max(sidebarSize, minSidebarSize); |
| size = this._mainView.minimumSize(); |
| var minMainSize = this.isVertical() ? size.width : size.height; |
| if (!minMainSize) |
| minMainSize = WebInspector.SplitView.MinPadding; |
| - var to = totalSize - minMainSize; |
| - if (from <= to) |
| - return Number.constrain(sidebarSize, from, to); |
| + var preferredMainSize = this.isVertical() ? size.preferredWidth : size.preferredHeight; |
| + if (!preferredMainSize) |
| + preferredMainSize = WebInspector.SplitView.MinPadding; |
| + var savedMainSize = this.isVertical() ? this._savedVerticalMainSize : this._savedHorizontalMainSize; |
| + if (typeof savedMainSize !== "undefined") |
| + preferredMainSize = Math.min(preferredMainSize, savedMainSize); |
| + if (userAction) |
| + preferredMainSize = minMainSize; |
| + |
| + // Enough space for preferred. |
| + var totalPreferred = preferredMainSize + preferredSidebarSize; |
| + if (totalPreferred <= totalSize) |
| + return Number.constrain(sidebarSize, preferredSidebarSize, totalSize - preferredMainSize); |
| + |
| + // Enough space for minimum. |
| + if (totalPreferred > 0 && minMainSize + minSidebarSize <= totalSize) { |
|
vsevik
2014/03/28 16:13:26
How can totalPreferred > 0 be wrong?
dgozman
2014/03/28 18:05:02
Done.
|
| + var delta = totalPreferred - totalSize; |
| + var sidebarDelta = delta * preferredSidebarSize / totalPreferred; |
| + sidebarSize = preferredSidebarSize - sidebarDelta; |
| + return Number.constrain(sidebarSize, minSidebarSize, totalSize - minMainSize); |
| + } |
| - // If we don't have enough space (which is a very rare case), prioritize main view. |
| - return Math.max(0, to); |
| + // Not enough space even for minimum sizes. |
| + return Math.max(0, totalSize - minMainSize); |
| }, |
| wasShown: function() |
| @@ -575,10 +602,15 @@ WebInspector.SplitView.prototype = { |
| var mainSize = this._mainView.minimumSize(); |
| var sidebarSize = this._sidebarView.minimumSize(); |
| var min = WebInspector.SplitView.MinPadding; |
| - if (this._isVertical) |
| - return new Size((mainSize.width || min) + (sidebarSize.width || min), Math.max(mainSize.height, sidebarSize.height)); |
| - else |
| - return new Size(Math.max(mainSize.width, sidebarSize.width), (mainSize.height || min) + (sidebarSize.height || min)); |
| + if (this._isVertical) { |
| + mainSize = mainSize.widthToMax(new Size(min, 0)); |
| + sidebarSize = sidebarSize.widthToMax(new Size(min, 0)); |
| + return mainSize.addWidth(sidebarSize).heightToMax(sidebarSize); |
| + } else { |
| + mainSize = mainSize.heightToMax(new Size(0, min)); |
| + sidebarSize = sidebarSize.heightToMax(new Size(0, min)); |
| + return mainSize.widthToMax(sidebarSize).addHeight(sidebarSize); |
| + } |
| }, |
| /** |
| @@ -603,10 +635,14 @@ WebInspector.SplitView.prototype = { |
| var dipEventPosition = (this._isVertical ? event.pageX : event.pageY) * WebInspector.zoomManager.zoomFactor(); |
| var newOffset = dipEventPosition + this._dragOffset; |
| var newSize = (this._secondIsSidebar ? this.totalSize() - newOffset : newOffset); |
| - var constrainedSize = this._applyConstraints(newSize); |
| + var constrainedSize = this._applyConstraints(newSize, true); |
| this._savedSidebarSize = constrainedSize; |
| this._saveSetting(); |
| - this._innerSetSidebarSize(constrainedSize, false); |
| + this._innerSetSidebarSize(constrainedSize, false, true); |
| + if (this.isVertical()) |
| + this._savedVerticalMainSize = this.totalSize() - this._sidebarSize; |
| + else |
| + this._savedHorizontalMainSize = this.totalSize() - this._sidebarSize; |
| event.preventDefault(); |
| }, |