dev@170: /** dev@170: * Created by lucast on 21/03/2017. dev@170: */ dev@231: import { dev@231: ChangeDetectionStrategy, dev@231: Component, dev@231: Input, dev@231: OnInit dev@236: } from '@angular/core'; dev@348: import {naivePagingMapper} from '../visualisations/WavesJunk'; dev@348: import {OnSeekHandler, TimePixelMapper} from '../playhead/PlayHeadHelpers'; dev@350: import {HigherLevelFeatureShape} from '../visualisations/FeatureUtilities'; dev@170: dev@350: export interface Item { dev@350: id: string; dev@200: hasSharedTimeline: boolean; dev@200: title?: string; dev@200: description?: string; dev@224: progress?: number; dev@350: } dev@350: dev@350: export interface PendingRootAudioItem extends Item { dev@350: uri: string; dev@350: } dev@350: export interface RootAudioItem extends PendingRootAudioItem{ dev@350: audioData: AudioBuffer; dev@350: } dev@350: dev@350: export interface PendingAnalysisItem extends Item { dev@350: parent: RootAudioItem; dev@350: extractorKey: string; dev@350: } dev@350: dev@350: export interface AnalysisItem extends PendingAnalysisItem { dev@350: kind: HigherLevelFeatureShape; dev@350: } dev@350: dev@350: export function isPendingRootAudioItem(item: Item): item is PendingRootAudioItem { dev@350: return typeof (item as RootAudioItem).uri === 'string'; dev@350: } dev@350: dev@350: export function isRootAudioItem(item: Item): item is RootAudioItem { dev@350: return isPendingRootAudioItem(item) && dev@350: typeof (item as RootAudioItem).uri === 'string'; dev@350: } dev@350: dev@350: export function isPendingAnalysisItem(item: Item): item is AnalysisItem { dev@350: const downcast = (item as AnalysisItem); dev@350: return isRootAudioItem(downcast.parent) dev@350: && typeof downcast.extractorKey === 'string'; dev@350: } dev@350: dev@350: export function isAnalysisItem(item: Item): item is AnalysisItem { dev@350: const downcast = (item as AnalysisItem); dev@350: return isPendingAnalysisItem(item) && downcast.kind != null; dev@350: } dev@350: dev@350: // these should probably be actual concrete types with their own getUri methods dev@350: export function getRootUri(item: Item): string { dev@350: if (isPendingRootAudioItem(item)) { dev@350: return item.uri; dev@350: } dev@350: if (isPendingAnalysisItem(item)) { dev@350: return item.parent.uri; dev@350: } dev@350: throw new Error('Invalid item: No URI property set.'); dev@170: } dev@170: dev@170: @Component({ dev@170: selector: 'ugly-analysis-item', dev@170: templateUrl: './analysis-item.component.html', dev@231: styleUrls: ['./analysis-item.component.css'], dev@231: changeDetection: ChangeDetectionStrategy.OnPush dev@170: }) dev@224: export class AnalysisItemComponent implements OnInit { dev@224: dev@350: @Input() timeline: Timeline; // TODO should be TimelineTimeContext? dev@200: @Input() isActive: boolean; dev@350: @Input() item: Item; dev@285: @Input() contentWidth: number; dev@348: @Input() onSeek: OnSeekHandler; dev@224: private hasProgressOnInit = false; dev@224: dev@348: dev@348: // TODO move dev@348: private DOES_NOT_BELONG_HERE: TimePixelMapper; dev@348: dev@224: ngOnInit(): void { dev@231: this.hasProgressOnInit = this.item.progress != null; dev@348: this.DOES_NOT_BELONG_HERE = naivePagingMapper(this.timeline); dev@224: } dev@224: dev@224: isLoading(): boolean { dev@231: return this.hasProgressOnInit && this.item.progress < 100; dev@224: } dev@348: dev@348: isAudioItem(): boolean { dev@350: console.warn('is root?', isRootAudioItem(this.item), this.item); dev@350: return isRootAudioItem(this.item); dev@348: } dev@170: }