blob: ffea9aea96f764b7fe3ec9fa13e2d885e767f4bb [file] [log] [blame]
<!-- The <play-sk> custom element declaration.
Allows moving through a series of operations, i.e. play, pause, step, etc.
Attributes:
size - The number of operations to be played.
Events will be indexed from [0, size-1].
item - The index of the current operation.
mode - Either "play" or "pause".
Events:
moveto - The index of the operation to be executed is available
in detail.item.
mode-changed-manually - Event generated when the mode changes by the
user pressing a button. The new mode is in e.detail.
Methods:
movedTo(item) - Called when the action has moved to item.
Should be called in response to the control generating
a 'moveto' event. Important so that if the play-sk
control is in 'play' mode it can generate a new event
to moveto the next item.
prePlayCallback(cb) - A callback function to be called immediately
after the user presses "play". If the cb returns false then play
does not proceed.
-->
<link rel=import href="/res/imp/bower_components/paper-icon-button/paper-icon-button.html">
<link rel=import href="/res/imp/bower_components/iron-icons/av-icons.html">
<link rel=import href="/res/imp/bower_components/iron-icons/iron-icons.html">
<dom-module id="play-sk">
<template>
<paper-icon-button title="Go to first" icon="av:skip-previous" id=begin on-tap="_begin"></paper-icon-button>
<paper-icon-button title="Step back one" icon="icons:chevron-left" id=prev on-tap="_prev"></paper-icon-button>
<paper-icon-button title="Play/Pause" icon="av:play-arrow" id=playpause on-tap="_togglePlay"></paper-icon-button>
<paper-icon-button title="Step forward one" icon="icons:chevron-right" id=next on-tap="_next"></paper-icon-button>
<paper-icon-button title="Go to last" icon="av:skip-next" id=end on-tap="_end"></paper-icon-button>
</template>
</dom-module>
<script>
(function () {
var modeToIcon = {
"pause": "av:play-arrow",
"play": "av:pause",
};
Polymer({
is: "play-sk",
properties: {
mode: {
type: String,
value: "pause",
reflectToAttribute: true,
observer: "_modeChange",
},
item: {
type: Number,
value: 0,
reflectToAttribute: true,
},
size: {
type: Number,
value: 0,
reflectToAttribute: true,
},
},
ready: function() {
this._cb = null;
},
prePlayCallback: function(cb) {
this._cb = cb;
},
_togglePlay: function() {
if (this._cb && !this._cb()) {
return;
}
this.mode = (this.mode == "play") ? "pause" : "play";
this.dispatchEvent(new CustomEvent('mode-changed-manually', { mode: this.mode, bubbles: true }));
},
_modeChange: function() {
this.$.playpause.icon = modeToIcon[this.mode];
if (this.mode == "play") {
this._triggerNext();
}
this._setDisabled(this.mode == "play");
},
_setDisabled: function(b) {
this.$.begin.disabled = b;
this.$.end.disabled = b;
this.$.next.disabled = b;
this.$.prev.disabled = b;
},
_triggerEvent: function() {
this.dispatchEvent(new CustomEvent('moveto', {detail: {item: this.item}}));
},
_triggerNext: function() {
this.item = (this.item+1) % this.size;
this._triggerEvent();
},
_begin: function() {
this.item = 0;
this._triggerEvent();
},
_end: function() {
this.item = this.size-1;
this._triggerEvent();
},
_prev: function() {
this.item -= 1;
if (this.item < 0) {
this.item += this.size;
}
this._triggerEvent();
},
_next: function() {
this._triggerNext();
},
movedTo: function(item) {
this.item = item;
if (this.mode == "play") {
this._triggerNext();
}
},
});
})();
</script>