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 }
|