Web Inspector: Popover should animate its frame to display its refreshed content
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Feb 2014 17:27:16 +0000 (17:27 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Feb 2014 17:27:16 +0000 (17:27 +0000)
commitb675c14901cd98cb13fecd23d886e7295d6f8c90
treea388b2ccfa3b826f6ea400bf966ea2bca78c4198
parent772c63d0a3107868c1b581c38547fc2a8d50a740
Web Inspector: Popover should animate its frame to display its refreshed content
https://bugs.webkit.org/show_bug.cgi?id=129088

Reviewed by Timothy Hatcher.

When calling .update(), we now check whether we can animate the change of frame provided the
new computed frame to best fit the current content still matches the edge the popover uses
to attach to the target frame. If we find that we can do so, we animate the background frame
of the popover while ensuring the anchor point remains stable during the animation such that
only the popover's frame seems to animate.

* UserInterface/Geometry.js:
(WebInspector.Rect.prototype.round):
Returns a new Rect with rounded values, using a floor for the position and a ceil for the size.

* UserInterface/Main.html:
Link to the new UnitBezier.js source file.

* UserInterface/Popover.js:
(WebInspector.Popover):
Make ._anchorPoint an ivar such that we don't need to pass a reference to the anchorPoint into
the various calls leading to an update of the popover's background drawing.

(WebInspector.Popover.prototype.set frame):
We no longer round the values of the frame here, instead calling the new .round() method on Rect
in places where we compute a new frame.

(WebInspector.Popover.prototype.set content):
(WebInspector.Popover.prototype.update):
Update the calls to ._update() to set the new shouldAnimate flag to true in situations where the
popover is already visible.

(WebInspector.Popover.prototype._update):
In the situation where there is a preference to animate the frame, as set by the new shouldAnimate
parameter, check that we can indeed animate by ensuring that the edge the popover uses to attach to
the target frame remains the same upon computing the new best metrics for the new content size. If
we can indeed animate, call _animateFrame(), otherwise set the new frame, anchor point and frame
drawing discretely like we used to.

(WebInspector.Popover.prototype._setAnchorPoint):
New method to ensure we floor the position of the anchor point to ensure, when animating, that the
anchor point remains stationary.

(WebInspector.Popover.prototype._animateFrame):
Using the new UnitBezier class, animate the popover frame from its previous value to its newly computed
value while ensuring the anchor point remains, at all times, the same absolute position such that it
remains stationary during the animation. The spline used to animate the frame is the same that a CSS
transition set with an "ease" timing-function (default value) would use.

(WebInspector.Popover.prototype._drawBackground):
(WebInspector.Popover.prototype._drawFrame):
Adopt new ._edge and ._anchorPoint ivars.

* UserInterface/UnitBezier.js: Added.
New class used to perform animations using a timing function specified with a cubic B├ęzier curve. The code
is directly adapted from the Source/WebCore/platform/graphics/UnitBezier.h file.

(WebInspector.UnitBezier):
(WebInspector.UnitBezier.prototype.solve):
(WebInspector.UnitBezier.prototype._sampleCurveX):
(WebInspector.UnitBezier.prototype._sampleCurveY):
(WebInspector.UnitBezier.prototype._sampleCurveDerivativeX):
(WebInspector.UnitBezier.prototype._solveCurveX):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@164432 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/WebInspectorUI/ChangeLog
Source/WebInspectorUI/UserInterface/Geometry.js
Source/WebInspectorUI/UserInterface/Main.html
Source/WebInspectorUI/UserInterface/Popover.js
Source/WebInspectorUI/UserInterface/UnitBezier.js [new file with mode: 0644]