annotate src/app/notebook-feed/notebook-feed.component.ts @ 349:bf038a51f7e3

Restore some of the feature related logic from waveform.component into a utilities module. Introduce some additional types for representing reshaped features. A work in progress.
author Lucas Thompson <dev@lucas.im>
date Thu, 25 May 2017 17:57:03 +0100
parents d17d5038b11a
children 524f5cd75737
rev   line source
dev@171 1 /**
dev@171 2 * Created by lucast on 21/03/2017.
dev@171 3 */
dev@232 4 import {
dev@232 5 ChangeDetectionStrategy,
dev@285 6 ChangeDetectorRef,
dev@232 7 Component,
dev@285 8 Inject,
dev@285 9 Input,
dev@285 10 OnDestroy
dev@236 11 } from '@angular/core';
dev@289 12 import Waves from 'waves-ui-piper';
dev@236 13 import {AnalysisItem} from '../analysis-item/analysis-item.component';
dev@285 14 import {Observable} from 'rxjs/Observable';
dev@285 15 import {Dimension} from '../app.module';
dev@285 16 import {Subscription} from 'rxjs/Subscription';
dev@348 17 import {OnSeekHandler} from '../playhead/PlayHeadHelpers';
dev@171 18
dev@171 19 @Component({
dev@171 20 selector: 'ugly-notebook-feed',
dev@171 21 templateUrl: './notebook-feed.component.html',
dev@232 22 styleUrls: ['./notebook-feed.component.css'],
dev@232 23 changeDetection: ChangeDetectionStrategy.OnPush
dev@171 24 })
dev@285 25 export class NotebookFeedComponent implements OnDestroy {
dev@201 26 @Input() analyses: AnalysisItem[];
dev@201 27 @Input() set rootAudioUri(uri: string) {
dev@201 28 this._rootAudioUri = uri;
dev@171 29 }
dev@348 30 @Input() onSeek: OnSeekHandler;
dev@171 31
dev@201 32 get rootAudioUri(): string {
dev@201 33 return this._rootAudioUri;
dev@171 34 }
dev@201 35 private _rootAudioUri: string;
dev@285 36 private resizeSubscription: Subscription;
dev@285 37 private width: number;
dev@285 38 private lastWidth: number;
dev@282 39 private timelines: Map<string, Timeline>;
dev@181 40
dev@285 41 constructor(
dev@285 42 private ref: ChangeDetectorRef,
dev@285 43 @Inject('DimensionObservable') private onResize: Observable<Dimension>
dev@285 44 ) {
dev@282 45 this.timelines = new Map();
dev@285 46 this.onResize.subscribe(dim => {
dev@285 47 this.lastWidth = this.width;
dev@285 48 this.width = dim.width;
dev@285 49 });
dev@285 50
dev@285 51 // the use of requestAnimationFrame here is to leave the dom updates
dev@285 52 // to a time convenient for the browser, and avoid a cascade / waterfall
dev@285 53 // of DOM changes for rapid resize events in the event handler above.
dev@285 54 // ..I'm not convinced this is particularly beneficial here // TODO
dev@285 55 const triggerChangeDetectionOnResize = () => {
dev@285 56 requestAnimationFrame(triggerChangeDetectionOnResize);
dev@285 57 if (this.width !== this.lastWidth) {
dev@285 58 ref.markForCheck(); // only trigger change detection if width changed
dev@285 59 }
dev@285 60 };
dev@285 61 requestAnimationFrame(triggerChangeDetectionOnResize);
dev@282 62 }
dev@282 63
dev@282 64 getOrCreateTimeline(item: AnalysisItem): Timeline | void {
dev@282 65 if (!item.hasSharedTimeline) {
dev@282 66 return;
dev@282 67 }
dev@282 68
dev@282 69 if (this.timelines.has(item.rootAudioUri)) {
dev@282 70 return this.timelines.get(item.rootAudioUri);
dev@282 71 } else {
dev@282 72 const timeline = new Waves.core.Timeline();
dev@282 73 this.timelines.set(item.rootAudioUri, timeline);
dev@282 74 return timeline;
dev@282 75 }
dev@181 76 }
dev@285 77
dev@348 78 isActiveItem(item: AnalysisItem): boolean {
dev@348 79 return this.rootAudioUri === item.rootAudioUri;
dev@348 80 }
dev@348 81
dev@348 82 getOnSeekForItem(item: AnalysisItem): (timeSecounds: number) => any {
dev@348 83 return this.isActiveItem(item) ? this.onSeek : () => {};
dev@348 84 }
dev@348 85
dev@285 86 ngOnDestroy(): void {
dev@285 87 if (this.resizeSubscription) {
dev@285 88 this.resizeSubscription.unsubscribe();
dev@285 89 }
dev@285 90 }
dev@171 91 }