Home | History | Annotate | Download | only in tracks
      1 <!DOCTYPE html>
      2 <!--
      3 Copyright (c) 2013 The Chromium Authors. All rights reserved.
      4 Use of this source code is governed by a BSD-style license that can be
      5 found in the LICENSE file.
      6 -->
      7 
      8 <link rel="import" href="/base/task.html">
      9 <link rel="import" href="/ui/tracks/track.html">
     10 <link rel="import" href="/core/filter.html">
     11 <link rel="import" href="/ui/base/ui.html">
     12 
     13 <script>
     14 'use strict';
     15 
     16 tr.exportTo('tr.ui.tracks', function() {
     17   var Task = tr.b.Task;
     18 
     19   /**
     20    * A generic track that contains other tracks as its children.
     21    * @constructor
     22    */
     23   var ContainerTrack = tr.ui.b.define('container-track', tr.ui.tracks.Track);
     24   ContainerTrack.prototype = {
     25     __proto__: tr.ui.tracks.Track.prototype,
     26 
     27     decorate: function(viewport) {
     28       tr.ui.tracks.Track.prototype.decorate.call(this, viewport);
     29     },
     30 
     31     detach: function() {
     32       this.textContent = '';
     33     },
     34 
     35     get tracks_() {
     36       var tracks = [];
     37       for (var i = 0; i < this.children.length; i++) {
     38         if (this.children[i].classList.contains('track'))
     39           tracks.push(this.children[i]);
     40       }
     41       return tracks;
     42     },
     43 
     44     drawTrack: function(type) {
     45       for (var i = 0; i < this.children.length; ++i) {
     46         if (!(this.children[i] instanceof tr.ui.tracks.Track))
     47           continue;
     48         this.children[i].drawTrack(type);
     49       }
     50     },
     51 
     52     /**
     53      * Adds items intersecting the given range to a selection.
     54      * @param {number} loVX Lower X bound of the interval to search, in
     55      *     viewspace.
     56      * @param {number} hiVX Upper X bound of the interval to search, in
     57      *     viewspace.
     58      * @param {number} loY Lower Y bound of the interval to search, in
     59      *     viewspace space.
     60      * @param {number} hiY Upper Y bound of the interval to search, in
     61      *     viewspace space.
     62      * @param {Selection} selection Selection to which to add results.
     63      */
     64     addIntersectingEventsInRangeToSelection: function(
     65         loVX, hiVX, loY, hiY, selection) {
     66       for (var i = 0; i < this.tracks_.length; i++) {
     67         var trackClientRect = this.tracks_[i].getBoundingClientRect();
     68         var a = Math.max(loY, trackClientRect.top);
     69         var b = Math.min(hiY, trackClientRect.bottom);
     70         if (a <= b)
     71           this.tracks_[i].addIntersectingEventsInRangeToSelection(
     72               loVX, hiVX, loY, hiY, selection);
     73       }
     74 
     75       tr.ui.tracks.Track.prototype.addIntersectingEventsInRangeToSelection.
     76           apply(this, arguments);
     77     },
     78 
     79     addEventsToTrackMap: function(eventToTrackMap) {
     80       for (var i = 0; i < this.children.length; ++i)
     81         this.children[i].addEventsToTrackMap(eventToTrackMap);
     82     },
     83 
     84     addAllEventsMatchingFilterToSelection: function(filter, selection) {
     85       for (var i = 0; i < this.tracks_.length; i++)
     86         this.tracks_[i].addAllEventsMatchingFilterToSelection(
     87             filter, selection);
     88     },
     89 
     90     addAllEventsMatchingFilterToSelectionAsTask: function(filter, selection) {
     91       var task = new Task();
     92       for (var i = 0; i < this.tracks_.length; i++) {
     93         task.subTask(function(i) { return function() {
     94           this.tracks_[i].addAllEventsMatchingFilterToSelection(
     95               filter, selection);
     96         } }(i), this);
     97       }
     98       return task;
     99     },
    100 
    101     addClosestEventToSelection: function(
    102         worldX, worldMaxDist, loY, hiY, selection) {
    103       for (var i = 0; i < this.tracks_.length; i++) {
    104         var trackClientRect = this.tracks_[i].getBoundingClientRect();
    105         var a = Math.max(loY, trackClientRect.top);
    106         var b = Math.min(hiY, trackClientRect.bottom);
    107         if (a <= b) {
    108           this.tracks_[i].addClosestEventToSelection(
    109               worldX, worldMaxDist, loY, hiY, selection);
    110         }
    111       }
    112 
    113       tr.ui.tracks.Track.prototype.addClosestEventToSelection.
    114           apply(this, arguments);
    115     },
    116 
    117     clearTracks_: function() {
    118       this.tracks_.forEach(function(track) {
    119         this.removeChild(track);
    120       }, this);
    121     }
    122   };
    123 
    124   return {
    125     ContainerTrack: ContainerTrack
    126   };
    127 });
    128 </script>
    129