annotate src/app/analysis-item/analysis-item.component.ts @ 350:524f5cd75737

Split AnalysisItem out into individual types for root audio items and features. This is messy as is, these need revising and should perhaps be actual concrete types with methods.
author Lucas Thompson <dev@lucas.im>
date Fri, 26 May 2017 12:59:41 +0100
parents d17d5038b11a
children e108249fc2ff
rev   line source
dev@170 1 /**
dev@170 2 * Created by lucast on 21/03/2017.
dev@170 3 */
dev@231 4 import {
dev@231 5 ChangeDetectionStrategy,
dev@231 6 Component,
dev@231 7 Input,
dev@231 8 OnInit
dev@236 9 } from '@angular/core';
dev@348 10 import {naivePagingMapper} from '../visualisations/WavesJunk';
dev@348 11 import {OnSeekHandler, TimePixelMapper} from '../playhead/PlayHeadHelpers';
dev@350 12 import {HigherLevelFeatureShape} from '../visualisations/FeatureUtilities';
dev@170 13
dev@350 14 export interface Item {
dev@350 15 id: string;
dev@200 16 hasSharedTimeline: boolean;
dev@200 17 title?: string;
dev@200 18 description?: string;
dev@224 19 progress?: number;
dev@350 20 }
dev@350 21
dev@350 22 export interface PendingRootAudioItem extends Item {
dev@350 23 uri: string;
dev@350 24 }
dev@350 25 export interface RootAudioItem extends PendingRootAudioItem{
dev@350 26 audioData: AudioBuffer;
dev@350 27 }
dev@350 28
dev@350 29 export interface PendingAnalysisItem extends Item {
dev@350 30 parent: RootAudioItem;
dev@350 31 extractorKey: string;
dev@350 32 }
dev@350 33
dev@350 34 export interface AnalysisItem extends PendingAnalysisItem {
dev@350 35 kind: HigherLevelFeatureShape;
dev@350 36 }
dev@350 37
dev@350 38 export function isPendingRootAudioItem(item: Item): item is PendingRootAudioItem {
dev@350 39 return typeof (item as RootAudioItem).uri === 'string';
dev@350 40 }
dev@350 41
dev@350 42 export function isRootAudioItem(item: Item): item is RootAudioItem {
dev@350 43 return isPendingRootAudioItem(item) &&
dev@350 44 typeof (item as RootAudioItem).uri === 'string';
dev@350 45 }
dev@350 46
dev@350 47 export function isPendingAnalysisItem(item: Item): item is AnalysisItem {
dev@350 48 const downcast = (item as AnalysisItem);
dev@350 49 return isRootAudioItem(downcast.parent)
dev@350 50 && typeof downcast.extractorKey === 'string';
dev@350 51 }
dev@350 52
dev@350 53 export function isAnalysisItem(item: Item): item is AnalysisItem {
dev@350 54 const downcast = (item as AnalysisItem);
dev@350 55 return isPendingAnalysisItem(item) && downcast.kind != null;
dev@350 56 }
dev@350 57
dev@350 58 // these should probably be actual concrete types with their own getUri methods
dev@350 59 export function getRootUri(item: Item): string {
dev@350 60 if (isPendingRootAudioItem(item)) {
dev@350 61 return item.uri;
dev@350 62 }
dev@350 63 if (isPendingAnalysisItem(item)) {
dev@350 64 return item.parent.uri;
dev@350 65 }
dev@350 66 throw new Error('Invalid item: No URI property set.');
dev@170 67 }
dev@170 68
dev@170 69 @Component({
dev@170 70 selector: 'ugly-analysis-item',
dev@170 71 templateUrl: './analysis-item.component.html',
dev@231 72 styleUrls: ['./analysis-item.component.css'],
dev@231 73 changeDetection: ChangeDetectionStrategy.OnPush
dev@170 74 })
dev@224 75 export class AnalysisItemComponent implements OnInit {
dev@224 76
dev@350 77 @Input() timeline: Timeline; // TODO should be TimelineTimeContext?
dev@200 78 @Input() isActive: boolean;
dev@350 79 @Input() item: Item;
dev@285 80 @Input() contentWidth: number;
dev@348 81 @Input() onSeek: OnSeekHandler;
dev@224 82 private hasProgressOnInit = false;
dev@224 83
dev@348 84
dev@348 85 // TODO move
dev@348 86 private DOES_NOT_BELONG_HERE: TimePixelMapper;
dev@348 87
dev@224 88 ngOnInit(): void {
dev@231 89 this.hasProgressOnInit = this.item.progress != null;
dev@348 90 this.DOES_NOT_BELONG_HERE = naivePagingMapper(this.timeline);
dev@224 91 }
dev@224 92
dev@224 93 isLoading(): boolean {
dev@231 94 return this.hasProgressOnInit && this.item.progress < 100;
dev@224 95 }
dev@348 96
dev@348 97 isAudioItem(): boolean {
dev@350 98 console.warn('is root?', isRootAudioItem(this.item), this.item);
dev@350 99 return isRootAudioItem(this.item);
dev@348 100 }
dev@170 101 }