<!DOCTYPE html>
<!--
Copyright (c) 2015 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<link rel="import" href="/base/ui.html">
<link rel="import" href="/core/event_presenter.html">
<link rel="import" href="/core/tracks/letter_dot_track.html">
<link rel="import" href="/base/ui/color_scheme.html">

<script>
'use strict';

tr.exportTo('tr.c.tracks', function() {
  var palette = tr.b.ui.getColorPalette();

  var startCompare = function(x, y) { return x.start - y.start; }

  /**
   * Track enabling quick selection of frame slices/events.
   * @constructor
   */
  var FrameTrack = tr.b.ui.define(
      'frame-track', tr.c.tracks.LetterDotTrack);

  FrameTrack.prototype = {
    __proto__: tr.c.tracks.LetterDotTrack.prototype,

    decorate: function(viewport) {
      tr.c.tracks.LetterDotTrack.prototype.decorate.call(this, viewport);
      this.heading = 'Frames';

      this.frames_ = undefined;
      this.items = undefined;
    },

    get frames() {
      return this.frames_;
    },

    set frames(frames) {
      this.frames_ = frames;
      if (frames === undefined)
        return;

      this.frames_ = this.frames_.slice();
      this.frames_.sort(startCompare);

      // letter dots
      this.items = this.frames_.map(function(frame) {
        return new FrameDot(frame);
      });
    }
  };

  /**
   * @constructor
   * @extends {LetterDot}
   */
  function FrameDot(frame) {
    tr.c.tracks.LetterDot.call(this, frame, 'F', frame.colorId, frame.start);
  }

  FrameDot.prototype = {
    __proto__: tr.c.tracks.LetterDot.prototype
  };

  return {
    FrameTrack: FrameTrack
  };
});
</script>
