<!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="/ui/base/event_presenter.html">
<link rel="import" href="/ui/tracks/letter_dot_track.html">
<link rel="import" href="/ui/base/color_scheme.html">
<link rel="import" href="/ui/base/ui.html">

<script>
'use strict';

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

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

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

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

    decorate: function(viewport) {
      tr.ui.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.ui.tracks.LetterDot.call(this, frame, 'F', frame.colorId, frame.start);
  }

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

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