cannam@480: /** cannam@480: * Created by lucast on 31/05/2017. cannam@480: */ cannam@480: import { cannam@480: InspectableVerticallyBoundedComponent, cannam@480: VerticallyBounded, cannam@480: VerticalScaleRenderer, cannam@480: VerticalValueInspectorRenderer, cannam@480: WavesComponent cannam@480: } from '../waves-base.component'; cannam@480: import { cannam@480: ChangeDetectionStrategy, cannam@480: Component, cannam@480: Input, cannam@480: } from '@angular/core'; cannam@480: import {Region} from '../FeatureUtilities'; cannam@480: import Waves from 'waves-ui-piper'; cannam@480: cannam@480: @Component({ cannam@480: selector: 'ugly-regions', cannam@480: templateUrl: '../waves-template.html', cannam@480: styleUrls: ['../waves-template.css'], cannam@480: changeDetection: ChangeDetectionStrategy.OnPush, cannam@480: providers: [ cannam@480: { provide: VerticallyBounded, useExisting: RegionsComponent }, cannam@480: { provide: VerticalScaleRenderer, useExisting: RegionsComponent }, cannam@480: {provide: VerticalValueInspectorRenderer, useExisting: RegionsComponent }, cannam@480: {provide: WavesComponent, useExisting: RegionsComponent} cannam@480: ] cannam@480: }) cannam@480: export class RegionsComponent extends InspectableVerticallyBoundedComponent { cannam@480: private currentVerticalRange: [number, number]; cannam@480: cannam@480: get range(): [number, number] { cannam@480: return this.currentVerticalRange; cannam@480: } cannam@480: cannam@480: @Input() set regions(regions: Region[]) { cannam@480: this.feature = regions; cannam@480: } cannam@480: cannam@480: protected get featureLayers(): Layer[] { cannam@480: this.currentVerticalRange = findVerticalRange(this.feature); cannam@480: return [ cannam@480: new Waves.helpers.PianoRollLayer( cannam@480: this.feature, cannam@480: { cannam@480: height: this.height, cannam@480: color: this.colour, cannam@480: yDomain: this.currentVerticalRange cannam@480: } cannam@480: ) cannam@480: ]; cannam@480: } cannam@480: } cannam@480: cannam@480: // TODO there might be scope to create a generic utility function like this cannam@480: function findVerticalRange(regions: Region[]): [number, number] { cannam@480: let [min, max] = regions.reduce((acc, region) => { cannam@480: const [min, max] = acc; cannam@480: return [Math.min (min, region.value), Math.max (max, region.value)]; cannam@480: }, [Infinity, -Infinity]); cannam@480: if (min === Infinity) { cannam@480: min = 0; cannam@480: max = 1; cannam@480: } cannam@480: return [ min, max ]; cannam@480: }