Chromium Code Reviews| Index: Source/devtools/front_end/elements/AnimationSection.js |
| diff --git a/Source/devtools/front_end/elements/AnimationSection.js b/Source/devtools/front_end/elements/AnimationSection.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7ee8b6e480ac5abb7e6bca3758f2abd6fccab7dc |
| --- /dev/null |
| +++ b/Source/devtools/front_end/elements/AnimationSection.js |
| @@ -0,0 +1,156 @@ |
| +// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +/** |
| + * @constructor |
| + * @param {?WebInspector.DOMModel.AnimationPlayer} animationPlayer |
| + */ |
| +WebInspector.AnimationSection = function(animationPlayer) |
| +{ |
| + this.propertiesSection = document.createElement("div"); |
| + this.setAnimationPlayer(animationPlayer); |
| + |
| + this.element = document.createElement("div"); |
| + this.element.className = "styles-section"; |
| + |
| + this.element.appendChild(this._createAnimationControls()); |
| + this.element.appendChild(this.propertiesSection); |
| +} |
| + |
| +WebInspector.AnimationSection.prototype = { |
| + /** |
| + * @private |
| + */ |
| + _updateCurrentTime: function() |
| + { |
| + /** |
| + * @param {number} currentTime |
| + * @param {boolean} isRunning |
| + * @this {WebInspector.AnimationSection} |
| + */ |
| + function updateSliderCallback(currentTime, isRunning) |
| + { |
| + this.currentTimeSlider.value = this.player.animation().iterationCount() == null ? currentTime % this.player.animation().duration() : currentTime; |
| + if (isRunning) |
| + requestAnimationFrame(this._updateCurrentTime.bind(this)); |
|
vsevik
2014/10/06 16:00:54
I think polling this on each animation frame creat
samli
2014/10/07 05:25:43
Done.
|
| + } |
| + this.player.getCurrentState(updateSliderCallback.bind(this)); |
| + }, |
| + |
| + /** |
| + * @return {!Element} |
| + * @private |
| + */ |
| + _createCurrentTimeSlider: function() |
| + { |
| + /** |
| + * @param {!Event} e |
| + * @this {WebInspector.AnimationSection} |
| + */ |
| + function sliderInputHandler(e) |
| + { |
| + this.player.setCurrentTime(parseFloat(e.target.value), this.setAnimationPlayer.bind(this)); |
| + } |
| + var iterationDuration = this.player.animation().duration(); |
| + var iterationCount = this.player.animation().iterationCount(); |
| + var slider = document.createElement("input"); |
| + slider.type = "range"; |
| + slider.min = 0; |
| + slider.step = 0.01; |
| + |
| + if (!iterationCount) { |
| + // Infinite iterations |
| + slider.max = iterationDuration; |
| + slider.value = this.player.currentTime() % iterationDuration; |
| + } else { |
| + slider.max = iterationCount * iterationDuration; |
| + slider.value = this.player.currentTime(); |
| + } |
| + |
| + slider.addEventListener("input", sliderInputHandler.bind(this)); |
| + requestAnimationFrame(this._updateCurrentTime.bind(this)); |
| + return slider; |
| + }, |
| + |
| + /** |
| + * @return {!Element} |
| + * @private |
| + */ |
| + _createAnimationControls: function() |
| + { |
| + /** |
| + * @this {WebInspector.AnimationSection} |
| + */ |
| + function pauseButtonHandler() |
| + { |
| + if (this.player.paused()) { |
| + this.player.play(this.setAnimationPlayer.bind(this)); |
| + updatePauseButton.call(this, false); |
| + } else { |
| + this.player.pause(this.setAnimationPlayer.bind(this)); |
| + updatePauseButton.call(this, true); |
| + } |
| + } |
| + |
| + /** |
| + * @param {boolean} paused |
| + * @this {WebInspector.AnimationSection} |
| + */ |
| + function updatePauseButton(paused) |
| + { |
| + this._pauseButton.state = paused; |
| + if (paused) |
| + this._pauseButton.title = WebInspector.UIString("Play animation"); |
| + else |
| + this._pauseButton.title = WebInspector.UIString("Pause animation"); |
| + } |
| + |
| + this._pauseButton = new WebInspector.StatusBarButton("", "animation-pause"); |
| + updatePauseButton.call(this, this.player.paused()); |
| + this._pauseButton.addEventListener("click", pauseButtonHandler, this); |
| + |
| + this.currentTimeSlider = this._createCurrentTimeSlider(); |
| + |
| + var controls = document.createElement("div"); |
| + controls.appendChild(this._pauseButton.element); |
| + controls.appendChild(this.currentTimeSlider); |
| + |
| + return controls; |
| + }, |
| + |
| + /** |
| + * @param {?WebInspector.DOMModel.AnimationPlayer} p |
| + */ |
| + setAnimationPlayer: function(p) |
|
vsevik
2014/10/06 16:00:55
This should be private (name should start with und
samli
2014/10/07 05:25:43
Done.
|
| + { |
| + if (!p || p === this.player) |
| + return; |
| + |
| + this.player = p; |
| + |
| + if (p instanceof WebInspector.DOMModel.AnimationPlayer) { |
|
vsevik
2014/10/06 16:00:54
Why do you need this check? It seems redundant
samli
2014/10/07 05:25:43
Done.
|
| + this.propertiesSection.removeChildren(); |
| + var animationObject = { |
| + "paused": p.paused(), |
| + "finished": p.finished(), |
| + "start-time": p.startTime(), |
| + "player-playback-rate": p.playbackRate(), |
| + "id": p.id(), |
| + "start-delay": p.animation().startDelay(), |
| + "playback-rate": p.animation().playbackRate(), |
| + "iteration-start": p.animation().iterationStart(), |
| + "iteration-count": p.animation().iterationCount(), |
| + "duration": p.animation().duration(), |
| + "direction": p.animation().direction(), |
| + "fill-mode": p.animation().fillMode(), |
| + "time-fraction": p.animation().timeFraction() |
| + }; |
| + var obj = WebInspector.RemoteObject.fromLocalObject(animationObject); |
| + var section = new WebInspector.ObjectPropertiesSection(obj, WebInspector.UIString("Animation Properties")); |
| + this.propertiesSection.appendChild(section.element); |
| + |
| + requestAnimationFrame(this._updateCurrentTime.bind(this)); |
| + } |
| + } |
| +} |