blob: 5d2f799945e8fb0f07d6146ebad0471b72836bae [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2014 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="/tracing/ui/base/chart_base_2d.html">
<script>
'use strict';
tr.exportTo('tr.ui.b', function() {
var ChartBase2D = tr.ui.b.ChartBase2D;
var ChartBase2DBrushX = tr.ui.b.define('chart-base-2d-brush-1d', ChartBase2D);
ChartBase2DBrushX.prototype = {
__proto__: ChartBase2D.prototype,
decorate: function() {
ChartBase2D.prototype.decorate.call(this);
this.brushedRange_ = new tr.b.Range();
},
// Note: range can only be set, not retrieved. It needs to be immutable
// or else odd data binding effects will result.
set brushedRange(range) {
this.brushedRange_.reset();
this.brushedRange_.addRange(range);
this.updateContents_();
},
computeBrushRangeFromIndices: function(indexA, indexB) {
indexA = tr.b.clamp(indexA, 0, this.data_.length - 1);
indexB = tr.b.clamp(indexB, 0, this.data_.length - 1);
var leftIndex = Math.min(indexA, indexB);
var rightIndex = Math.max(indexA, indexB);
var r = new tr.b.Range();
r.addValue(this.getXForDatum_(this.data_[leftIndex], leftIndex) -
this.getSampleWidth_(this.data_, leftIndex, true));
r.addValue(this.getXForDatum_(this.data_[rightIndex], rightIndex) +
this.getSampleWidth_(this.data_, rightIndex, false));
return r;
},
getDataIndex_: function(dataX) {
if (!this.data_)
return undefined;
var bisect = d3.bisector(this.getXForDatum_.bind(this)).right;
return bisect(this.data_, dataX) - 1;
},
prepareDataEvent_: function(mouseEvent, dataEvent) {
ChartBase2D.prototype.prepareDataEvent_.call(
this, mouseEvent, dataEvent);
dataEvent.index = this.getDataIndex_(dataEvent.x);
if (dataEvent.index !== undefined)
dataEvent.data = this.data_[dataEvent.index];
},
updateBrushContents_: function(brushSel) {
brushSel.selectAll('*').remove();
var brushes = this.brushedRange_.isEmpty ? [] : [this.brushedRange_];
var brushRectsSel = brushSel.selectAll('rect').data(brushes);
brushRectsSel.enter().append('rect');
brushRectsSel.exit().remove();
this.drawBrush_(brushRectsSel);
},
drawBrush_: function(brushRectsSel) {
brushRectsSel
.attr('x', function(d) {
return this.xScale_(d.min);
}.bind(this))
.attr('y', 0)
.attr('width', function(d) {
return this.xScale_(d.max) - this.xScale_(d.min);
}.bind(this))
.attr('height', this.chartAreaSize.height);
}
};
return {
ChartBase2DBrushX: ChartBase2DBrushX
};
});
</script>