• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/**
6 * This is a view class showing subs of selected item.
7 * TODO(junjianx): use dropdown menu to show.
8 * @param {Object} profiler Must have addListener method.
9 * @construct
10 */
11var DropdownView = function(profiler) {
12  this.profiler_ = profiler;
13  this.placeholder_ = '#subs-dropdown';
14  // Clear state when profiler model changed.
15  profiler.addListener('changed', this.redraw_.bind(this));
16  profiler.addListener('changed:selected', this.update_.bind(this));
17};
18
19/**
20 * Render new dropdown at first time being called and recover otherwise.
21 * @private
22 */
23DropdownView.prototype.redraw_ = function() {
24  var self = this;
25
26  var data = [{ label: 'subs' }];
27  if (!this.$tree_) {
28    this.$tree_ = $(this.placeholder_).tree({
29      data: data,
30      autoOpen: true
31    });
32
33    // Delegate click event to profiler.
34    this.$tree_.bind('tree.click', function(event) {
35      event.preventDefault();
36      self.profiler_.setSub(event.node.id);
37    });
38  } else {
39    this.$tree_.tree('loadData', data);
40    $(this.placeholder_).css('display', 'none');
41  }
42};
43
44/**
45 * Update dropdown view when new model is selected in menu view.
46 * @param {string} id Model id.
47 * @param {Object} pos Clicked position.
48 * @private
49 */
50DropdownView.prototype.update_ = function(id, pos) {
51  if (id == null) {
52    $(this.placeholder_).css('display', 'none');
53    return;
54  }
55
56  var self = this;
57
58  // Get all subs of selected model.
59  var prof = this.profiler_;
60  var models = prof.getModelsbyId(id);
61  var children = models.reduce(function(previous, current) {
62    if ('subs' in current) {
63      current.subs.forEach(function(sub) {
64        var id = sub.join(',');
65        var label = sub.join(':');
66        if (!previous.some(function(sub) {
67          return sub.id === id;
68        })) {
69          var child = {
70            id: id,
71            label: label
72          };
73          previous.push(child);
74        }
75      });
76    }
77    return previous;
78  }, []);
79
80  // Update data of subs tree.
81  var data = [{
82    label: 'subs',
83    children: children
84  }];
85  var $tree = this.$tree_;
86  $tree.tree('loadData', data);
87
88  // Select current sub if exists.
89  var curSub = prof.getCurSubById(id);
90  if (curSub) {
91    var node = $tree.tree('getNodeById', curSub);
92    $tree.tree('selectNode', node);
93  }
94
95  // If selected category has subs, display subs box.
96  $(this.placeholder_).css('display', 'none');
97  if (children.length > 0) {
98    var view = $(this.placeholder_);
99    view.css('display', 'block');
100    if (pos != undefined) {
101      view.css('position', 'fixed');
102      view.css('top', pos.pageY);
103      view.css('left', pos.pageX);
104    } else {
105      view.css('position', 'static');
106    }
107  }
108};
109