diff 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
line wrap: on
line diff
--- a/src/app/analysis-item/analysis-item.component.ts	Thu May 25 17:57:03 2017 +0100
+++ b/src/app/analysis-item/analysis-item.component.ts	Fri May 26 12:59:41 2017 +0100
@@ -9,17 +9,61 @@
 } from '@angular/core';
 import {naivePagingMapper} from '../visualisations/WavesJunk';
 import {OnSeekHandler, TimePixelMapper} from '../playhead/PlayHeadHelpers';
+import {HigherLevelFeatureShape} from '../visualisations/FeatureUtilities';
 
-export interface AnalysisItem {
-  rootAudioUri: string;
+export interface Item {
+  id: string;
   hasSharedTimeline: boolean;
-  isRoot: boolean;
-  extractorKey: string;
   title?: string;
   description?: string;
-  id?: string;
   progress?: number;
-  audioData?: AudioBuffer;
+}
+
+export interface PendingRootAudioItem extends Item {
+  uri: string;
+}
+export interface RootAudioItem extends PendingRootAudioItem{
+  audioData: AudioBuffer;
+}
+
+export interface PendingAnalysisItem extends Item {
+  parent: RootAudioItem;
+  extractorKey: string;
+}
+
+export interface AnalysisItem extends PendingAnalysisItem {
+  kind: HigherLevelFeatureShape;
+}
+
+export function isPendingRootAudioItem(item: Item): item is PendingRootAudioItem {
+  return typeof (item as RootAudioItem).uri === 'string';
+}
+
+export function isRootAudioItem(item: Item): item is RootAudioItem {
+  return isPendingRootAudioItem(item) &&
+    typeof (item as RootAudioItem).uri === 'string';
+}
+
+export function isPendingAnalysisItem(item: Item): item is AnalysisItem {
+  const downcast = (item as AnalysisItem);
+  return isRootAudioItem(downcast.parent)
+    && typeof downcast.extractorKey === 'string';
+}
+
+export function isAnalysisItem(item: Item): item is AnalysisItem {
+  const downcast = (item as AnalysisItem);
+  return isPendingAnalysisItem(item) && downcast.kind != null;
+}
+
+// these should probably be actual concrete types with their own getUri methods
+export function getRootUri(item: Item): string {
+  if (isPendingRootAudioItem(item)) {
+    return item.uri;
+  }
+  if (isPendingAnalysisItem(item)) {
+    return item.parent.uri;
+  }
+  throw new Error('Invalid item: No URI property set.');
 }
 
 @Component({
@@ -30,9 +74,9 @@
 })
 export class AnalysisItemComponent implements OnInit {
 
-  @Input() timeline: Timeline;
+  @Input() timeline: Timeline; // TODO should be TimelineTimeContext?
   @Input() isActive: boolean;
-  @Input() item: AnalysisItem;
+  @Input() item: Item;
   @Input() contentWidth: number;
   @Input() onSeek: OnSeekHandler;
   private hasProgressOnInit = false;
@@ -51,8 +95,7 @@
   }
 
   isAudioItem(): boolean {
-    return this.item &&
-      this.item.isRoot &&
-      this.item.audioData instanceof AudioBuffer;
+    console.warn('is root?', isRootAudioItem(this.item), this.item);
+    return isRootAudioItem(this.item);
   }
 }