Home | History | Annotate | Download | only in frontend
      1 // Copyright (C) 2018 The Android Open Source Project
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //      http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 import {TrackState} from '../common/state';
     16 import {globals} from './globals';
     17 
     18 /**
     19  * This interface forces track implementations to have some static properties.
     20  * Typescript does not have abstract static members, which is why this needs to
     21  * be in a seperate interface.
     22  */
     23 export interface TrackCreator {
     24   // Store the kind explicitly as a string as opposed to using class.kind in
     25   // case we ever minify our code.
     26   readonly kind: string;
     27 
     28   // We need the |create| method because the stored value in the registry is an
     29   // abstract class, and we cannot call 'new' on an abstract class.
     30   create(TrackState: TrackState): Track;
     31 }
     32 
     33 /**
     34  * The abstract class that needs to be implemented by all tracks.
     35  */
     36 export abstract class Track<Config = {}, Data = {}> {
     37   constructor(protected trackState: TrackState) {}
     38   abstract renderCanvas(ctx: CanvasRenderingContext2D): void;
     39 
     40   get config(): Config {
     41     return this.trackState.config as Config;
     42   }
     43 
     44   data(): Data|undefined {
     45     return globals.trackDataStore.get(this.trackState.id) as Data;
     46   }
     47 
     48   getHeight(): number {
     49     return 40;
     50   }
     51 
     52   onMouseMove(_position: {x: number, y: number}) {}
     53 
     54   /**
     55    * Returns whether the mouse click has selected something.
     56    * Used to prevent further propagation if necessary.
     57    */
     58   onMouseClick(_position: {x: number, y: number}): boolean {
     59     return false;
     60   }
     61 
     62   onMouseOut() {}
     63 }
     64