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..b5a7193c24c673496b28ac8e812274973a4a37c2 100644 |
| --- a/Source/devtools/front_end/SplitView.js |
| +++ b/Source/devtools/front_end/SplitView.js |
| @@ -134,7 +134,7 @@ WebInspector.SplitView.prototype = { |
| this._restoreAndApplyShowModeFromSettings(); |
| this._updateShowHideSidebarButton(); |
| this._updateResizersClass(); |
| - this.invalidateMinimumSize(); |
| + this.invalidateConstraints(); |
| }, |
| /** |
| @@ -380,19 +380,20 @@ WebInspector.SplitView.prototype = { |
| this._saveShowModeToSettings(); |
| this._updateShowHideSidebarButton(); |
| this.dispatchEventToListeners(WebInspector.SplitView.Events.ShowModeChanged, showMode); |
| - this.invalidateMinimumSize(); |
| + this.invalidateConstraints(); |
| }, |
| /** |
| * @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 constraints = this._sidebarView.constraints(); |
|
pfeldman
2014/03/31 12:10:39
This logic definitely needs a test.
dgozman
2014/03/31 13:23:57
Done.
|
| + var minSidebarSize = this.isVertical() ? constraints.minimum.width : constraints.minimum.height; |
| + if (!minSidebarSize) |
| + minSidebarSize = WebInspector.SplitView.MinPadding; |
| - size = this._mainView.minimumSize(); |
| - var minMainSize = this.isVertical() ? size.width : size.height; |
| + var preferredSidebarSize = this.isVertical() ? constraints.preferred.width : constraints.preferred.height; |
| + 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); |
| + |
| + constraints = this._mainView.constraints(); |
| + var minMainSize = this.isVertical() ? constraints.minimum.width : constraints.minimum.height; |
| if (!minMainSize) |
| minMainSize = WebInspector.SplitView.MinPadding; |
| - var to = totalSize - minMainSize; |
| - if (from <= to) |
| - return Number.constrain(sidebarSize, from, to); |
| + var preferredMainSize = this.isVertical() ? constraints.preferred.width : constraints.preferred.height; |
| + 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 (minMainSize + minSidebarSize <= totalSize) { |
| + 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() |
| @@ -563,22 +590,27 @@ WebInspector.SplitView.prototype = { |
| }, |
| /** |
| - * @return {!Size} |
| + * @return {!Constraints} |
| */ |
| - calculateMinimumSize: function() |
| + calculateConstraints: function() |
| { |
| if (this._showMode === WebInspector.SplitView.ShowMode.OnlyMain) |
| - return this._mainView.minimumSize(); |
| + return this._mainView.constraints(); |
| if (this._showMode === WebInspector.SplitView.ShowMode.OnlySidebar) |
| - return this._sidebarView.minimumSize(); |
| + return this._sidebarView.constraints(); |
| - var mainSize = this._mainView.minimumSize(); |
| - var sidebarSize = this._sidebarView.minimumSize(); |
| + var mainConstraints = this._mainView.constraints(); |
| + var sidebarConstraints = this._sidebarView.constraints(); |
| 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) { |
| + mainConstraints = mainConstraints.widthToMax(new Constraints(new Size(min, 0))); |
|
pfeldman
2014/03/31 12:10:39
Creating Constraints and Size seems like an overki
dgozman
2014/03/31 13:23:57
Done.
|
| + sidebarConstraints = sidebarConstraints.widthToMax(new Constraints(new Size(min, 0))); |
| + return mainConstraints.addWidth(sidebarConstraints).heightToMax(sidebarConstraints); |
| + } else { |
| + mainConstraints = mainConstraints.heightToMax(new Constraints(new Size(0, min))); |
| + sidebarConstraints = sidebarConstraints.heightToMax(new Constraints(new Size(0, min))); |
| + return mainConstraints.widthToMax(sidebarConstraints).addHeight(sidebarConstraints); |
| + } |
| }, |
| /** |
| @@ -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(); |
| }, |