| /** |
| * @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); |