blob: 9505575e885a5ad04d26bc0aebeba5f9eb7fb188 [file] [log] [blame]
// Copyright (c) 2015 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
* @extends {WebInspector.StylesSidebarPane.BaseToolbarPaneWidget}
*/
WebInspector.AnimationControlPane = function(toolbarItem)
{
WebInspector.StylesSidebarPane.BaseToolbarPaneWidget.call(this, toolbarItem);
this._animationsPaused = false;
this._animationsPlaybackRate = 1;
this.element.className = "styles-animations-controls-pane";
this.element.createChild("div").createTextChild("Animations");
var container = this.element.createChild("div", "animations-controls");
var toolbar = new WebInspector.Toolbar();
this._animationsPauseButton = new WebInspector.ToolbarButton("", "pause-toolbar-item");
toolbar.appendToolbarItem(this._animationsPauseButton);
this._animationsPauseButton.addEventListener("click", this._pauseButtonHandler.bind(this));
container.appendChild(toolbar.element);
this._animationsPlaybackSlider = container.createChild("input");
this._animationsPlaybackSlider.type = "range";
this._animationsPlaybackSlider.min = 0;
this._animationsPlaybackSlider.max = WebInspector.AnimationTimeline.GlobalPlaybackRates.length - 1;
this._animationsPlaybackSlider.value = this._animationsPlaybackSlider.max;
this._animationsPlaybackSlider.addEventListener("input", this._playbackSliderInputHandler.bind(this));
this._animationsPlaybackLabel = container.createChild("div", "playback-label");
this._animationsPlaybackLabel.createTextChild("1x");
}
WebInspector.AnimationControlPane.prototype = {
/**
* @param {!Event} event
*/
_playbackSliderInputHandler: function (event)
{
this._animationsPlaybackRate = WebInspector.AnimationTimeline.GlobalPlaybackRates[event.target.value];
WebInspector.AnimationModel.fromTarget(this._target).setPlaybackRate(this._animationsPaused ? 0 : this._animationsPlaybackRate);
this._animationsPlaybackLabel.textContent = this._animationsPlaybackRate + "x";
WebInspector.userMetrics.AnimationsPlaybackRateChanged.record();
},
_pauseButtonHandler: function ()
{
this._animationsPaused = !this._animationsPaused;
WebInspector.AnimationModel.fromTarget(this._target).setPlaybackRate(this._animationsPaused ? 0 : this._animationsPlaybackRate);
WebInspector.userMetrics.AnimationsPlaybackRateChanged.record();
this._animationsPauseButton.element.classList.toggle("pause-toolbar-item");
this._animationsPauseButton.element.classList.toggle("play-toolbar-item");
},
/**
* @param {!WebInspector.Event=} event
*/
_updateAnimationsPlaybackRate: function(event)
{
/**
* @param {?Protocol.Error} error
* @param {number} playbackRate
* @this {WebInspector.AnimationControlPane}
*/
function setPlaybackRate(error, playbackRate)
{
this._animationsPlaybackSlider.value = WebInspector.AnimationTimeline.GlobalPlaybackRates.indexOf(playbackRate);
this._animationsPlaybackLabel.textContent = playbackRate + "x";
}
if (this._target)
this._target.animationAgent().getPlaybackRate(setPlaybackRate.bind(this));
},
/**
* @override
* @param {?WebInspector.DOMNode} node
*/
onNodeChanged: function(node)
{
if (!node)
return;
if (this._target)
this._target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._updateAnimationsPlaybackRate, this);
this._target = node.target();
this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._updateAnimationsPlaybackRate, this);
this._updateAnimationsPlaybackRate();
},
__proto__: WebInspector.StylesSidebarPane.BaseToolbarPaneWidget.prototype
}
/**
* @constructor
* @implements {WebInspector.ToolbarItem.Provider}
*/
WebInspector.AnimationControlPane.ButtonProvider = function()
{
this._button = new WebInspector.ToolbarButton(WebInspector.UIString("Animations Controls"), "animation-toolbar-item");
this._button.addEventListener("click", this._clicked, this);
WebInspector.context.addFlavorChangeListener(WebInspector.DOMNode, this._nodeChanged, this);
this._nodeChanged();
}
WebInspector.AnimationControlPane.ButtonProvider.prototype = {
/**
* @param {boolean} toggleOn
*/
_toggleAnimationTimelineMode: function(toggleOn)
{
if (!this._animationTimeline)
this._animationTimeline = new WebInspector.AnimationTimeline();
this._button.setToggled(toggleOn);
var elementsPanel = WebInspector.ElementsPanel.instance();
elementsPanel.setWidgetBelowDOM(toggleOn ? this._animationTimeline : null);
},
/**
* @param {boolean} toggleOn
*/
_toggleAnimationControlPaneMode: function(toggleOn)
{
if (!this._animationsControlPane)
this._animationsControlPane = new WebInspector.AnimationControlPane(this.item());
var stylesSidebarPane = WebInspector.ElementsPanel.instance().sidebarPanes.styles;
stylesSidebarPane.showToolbarPane(toggleOn ? this._animationsControlPane : null);
},
_clicked: function()
{
if (Runtime.experiments.isEnabled("animationInspection"))
this._toggleAnimationTimelineMode(!this._button.toggled());
else
this._toggleAnimationControlPaneMode(!this._button.toggled());
},
_nodeChanged: function()
{
var node = WebInspector.context.flavor(WebInspector.DOMNode);
if (Runtime.experiments.isEnabled("animationInspection")) {
if (this._animationTimeline)
this._animationTimeline.setNode(node);
} else {
this._button.setEnabled(!!node);
if (!node)
this._toggleAnimationControlPaneMode(false);
}
},
/**
* @override
* @return {!WebInspector.ToolbarItem}
*/
item: function()
{
return this._button;
}
}