Mercurial > hg > ugly-duckling
view src/app/analysis-item/analysis-item.component.ts @ 399:6fe8ef9687de
Who am I kidding? Graduate the bodge.
author | Lucas Thompson <dev@lucas.im> |
---|---|
date | Fri, 02 Jun 2017 17:24:33 +0100 |
parents | 3eab26a629e1 |
children | f2d43724a578 |
line wrap: on
line source
/** * Created by lucast on 21/03/2017. */ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; import {naivePagingMapper} from '../visualisations/WavesJunk'; import {OnSeekHandler, TimePixelMapper} from '../playhead/PlayHeadHelpers'; import { defaultColourGenerator, HigherLevelFeatureShape, KnownShapedFeature } from '../visualisations/FeatureUtilities'; export interface Item { id: string; hasSharedTimeline: boolean; title?: string; description?: string; progress?: number; } export interface PendingRootAudioItem extends Item { uri: string; } export interface RootAudioItem extends PendingRootAudioItem { audioData: AudioBuffer; } export interface PendingAnalysisItem extends Item { parent: RootAudioItem; extractorKey: string; } export type AnalysisItem = PendingAnalysisItem & KnownShapedFeature & { unit?: string }; export function isItem(item: Item): item is Item { return item.id != null && item.hasSharedTimeline != null; } export function isPendingRootAudioItem(item: Item): item is PendingRootAudioItem { return isItem(item) && typeof (item as RootAudioItem).uri === 'string'; } export function isRootAudioItem(item: Item): item is RootAudioItem { return isPendingRootAudioItem(item) && (item as RootAudioItem).audioData instanceof AudioBuffer; } export function isPendingAnalysisItem(item: Item): item is AnalysisItem { const downcast = (item as AnalysisItem); return isRootAudioItem(downcast.parent) && typeof downcast.extractorKey === 'string'; } export function isAnalysisItem(item: Item): item is AnalysisItem { const downcast = (item as AnalysisItem); return isPendingAnalysisItem(item) && downcast.shape != null && downcast.collected != null; } // these should probably be actual concrete types with their own getUri methods export function getRootUri(item: Item): string { if (isPendingRootAudioItem(item)) { return item.uri; } if (isPendingAnalysisItem(item)) { return item.parent.uri; } throw new Error('Invalid item: No URI property set.'); } @Component({ selector: 'ugly-analysis-item', templateUrl: './analysis-item.component.html', styleUrls: ['./analysis-item.component.css'], changeDetection: ChangeDetectionStrategy.OnPush }) export class AnalysisItemComponent implements OnInit { @Input() timeline: Timeline; // TODO should be TimelineTimeContext? @Input() isActive: boolean; @Input() item: Item; @Input() contentWidth: number; @Input() onSeek: OnSeekHandler; private hasProgressOnInit = false; // TODO move / re-think - naivePagingMapper feels like a big ol' bodge private timeToPixel: TimePixelMapper; ngOnInit(): void { this.hasProgressOnInit = this.item.progress != null; this.timeToPixel = naivePagingMapper(this.timeline); } isLoading(): boolean { return this.hasProgressOnInit && this.item.progress < 100; } isAudioItem(): boolean { return isRootAudioItem(this.item); } getFeatureShape(): HigherLevelFeatureShape | null { return !isPendingRootAudioItem(this.item) && isAnalysisItem(this.item) ? this.item.shape : null; } getNextColour(): string { return defaultColourGenerator.next().value; } }