Mercurial > hg > ugly-duckling
view src/app/notebook-feed/notebook-feed.component.ts @ 285:2d7da410ba46
Introduce width Inputs to analysis items and waveform and observe for Dimension changes in notebook-feed.
author | Lucas Thompson <dev@lucas.im> |
---|---|
date | Thu, 04 May 2017 17:09:48 +0100 |
parents | 5ab9e6132424 |
children | 6a83df5029fe |
line wrap: on
line source
/** * Created by lucast on 21/03/2017. */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, OnDestroy } from '@angular/core'; import Waves from 'waves-ui'; import {AnalysisItem} from '../analysis-item/analysis-item.component'; import {Observable} from 'rxjs/Observable'; import {Dimension} from '../app.module'; import {Subscription} from 'rxjs/Subscription'; @Component({ selector: 'ugly-notebook-feed', templateUrl: './notebook-feed.component.html', styleUrls: ['./notebook-feed.component.css'], changeDetection: ChangeDetectionStrategy.OnPush }) export class NotebookFeedComponent implements OnDestroy { @Input() analyses: AnalysisItem[]; @Input() set rootAudioUri(uri: string) { this._rootAudioUri = uri; } get rootAudioUri(): string { return this._rootAudioUri; } private _rootAudioUri: string; private resizeSubscription: Subscription; private width: number; private lastWidth: number; private timelines: Map<string, Timeline>; constructor( private ref: ChangeDetectorRef, @Inject('DimensionObservable') private onResize: Observable<Dimension> ) { this.timelines = new Map(); this.onResize.subscribe(dim => { this.lastWidth = this.width; this.width = dim.width; }); // the use of requestAnimationFrame here is to leave the dom updates // to a time convenient for the browser, and avoid a cascade / waterfall // of DOM changes for rapid resize events in the event handler above. // ..I'm not convinced this is particularly beneficial here // TODO const triggerChangeDetectionOnResize = () => { requestAnimationFrame(triggerChangeDetectionOnResize); if (this.width !== this.lastWidth) { ref.markForCheck(); // only trigger change detection if width changed } }; requestAnimationFrame(triggerChangeDetectionOnResize); } getOrCreateTimeline(item: AnalysisItem): Timeline | void { if (!item.hasSharedTimeline) { return; } if (this.timelines.has(item.rootAudioUri)) { return this.timelines.get(item.rootAudioUri); } else { const timeline = new Waves.core.Timeline(); this.timelines.set(item.rootAudioUri, timeline); return timeline; } } ngOnDestroy(): void { if (this.resizeSubscription) { this.resizeSubscription.unsubscribe(); } } }