blob: 15967105a6e183d3183d67b5f34fb86a1c5aa70d [file] [log] [blame]
/**
* @module modules/timeline-sk
* @description An element for displaying a position in a timeline.
*/
import { define } from 'elements-sk/define';
import { html } from 'lit-html';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
import { PlaySk } from '../play-sk/play-sk';
import '../play-sk';
import {
MoveToEventDetail, MoveFrameEventDetail, MoveFrameEvent, MoveToEvent,
} from '../events';
export class TimelineSk extends ElementSk {
private static template = (ele: TimelineSk) => html`
<div class='horizontal'>
<play-sk .visual=${'simple'}></play-sk>
<div class="outer">
<div class="hallway">
${[...Array(ele._count).keys()].map((i) => html`
<div class="room ${ele._item === i
? 'selected'
: 'not-selected'
}" @click=${() => { ele._roomClick(i); }}>${(i % ele._modulo) === 0
? html`<div class="rel-point">
<span class="label">${i}<span>
</div>`
: ''
}</div>
`)}
</div>
<div class="basement"><div>
</div>
</div>`;
private _count = 50;
private _item = 0;
private _modulo = 5;
// Play submodule
private _playSk: PlaySk | null = null;
set item(i: number) {
this._item = i;
this._render();
// notify debugger-page-sk to change the frame
// TODO(nifong): the timeline element always appears to be one frame late during playback
// this could be fixed by deferring this event with window.setTimeout, but that would break
// pretty much any other code that sets timeline.item, such as the inspect button.
this.dispatchEvent(
new CustomEvent<MoveFrameEventDetail>(
MoveFrameEvent, {
detail: { frame: this._item },
bubbles: true,
},
),
);
}
set count(c: number) {
this._count = c;
this._playSk!.mode = 'pause';
this._playSk!.size = this._count;
const hallway = this.querySelector<HTMLElement>('div.hallway')!;
const strW = window.getComputedStyle(hallway, null).width;
const width = parseFloat(strW.substring(0, strW.length - 2));
const space = 70; // minimum pixels of space to give each label.
this._modulo = Math.ceil((space * this._count) / width);
this._render();
}
get playsk(): PlaySk {
return this._playSk!;
}
constructor() {
super(TimelineSk.template);
}
connectedCallback(): void {
super.connectedCallback();
this._render();
this._playSk = this.querySelector<PlaySk>('play-sk');
this._playSk!.size = this._count;
this._playSk!.addEventListener(MoveToEvent, (e: Event) => {
this.item = (e as CustomEvent<MoveToEventDetail>).detail.item;
});
this._render();
}
private _roomClick(i: number) {
this._playSk!.mode = 'pause';
this.item = i;
}
}
define('timeline-sk', TimelineSk);