| Index: tracing/tracing/ui/base/column_chart.html
|
| diff --git a/tracing/tracing/ui/base/column_chart.html b/tracing/tracing/ui/base/column_chart.html
|
| index f73f5ac7932d21a1a73da43eebab93339253dfa5..deaf44a55bf214f9e263e2225ec804ba2f93118f 100644
|
| --- a/tracing/tracing/ui/base/column_chart.html
|
| +++ b/tracing/tracing/ui/base/column_chart.html
|
| @@ -14,7 +14,7 @@ tr.exportTo('tr.ui.b', function() {
|
| var ColorScheme = tr.b.ColorScheme;
|
| var ChartBase2DBrushX = tr.ui.b.ChartBase2DBrushX;
|
|
|
| - function getTextWidth(parentNode, text) {
|
| + function getSVGTextWidth(parentNode, text) {
|
| var textNode = document.createElementNS(
|
| 'http://www.w3.org/2000/svg', 'text');
|
| textNode.setAttributeNS(null, 'x', 0);
|
| @@ -24,7 +24,7 @@ tr.exportTo('tr.ui.b', function() {
|
| parentNode.appendChild(textNode);
|
| var widthPx = textNode.getComputedTextLength();
|
| parentNode.removeChild(textNode);
|
| - return widthPx + 5;
|
| + return widthPx;
|
| }
|
|
|
| // @constructor
|
| @@ -170,6 +170,64 @@ tr.exportTo('tr.ui.b', function() {
|
| return stacks;
|
| },
|
|
|
| + drawHoverValueBox_: function(rect) {
|
| + var seriesKeys = [...this.seriesByKey_.keys()];
|
| + var chartAreaSel = d3.select(this.chartAreaElement);
|
| + chartAreaSel.selectAll('.hover').remove();
|
| + var keyWidthPx = 0;
|
| + var keyHeightPx = 0;
|
| + if (seriesKeys.length > 1) {
|
| + keyWidthPx = getSVGTextWidth(this.chartAreaElement, rect.key) + 5;
|
| + keyHeightPx = 16;
|
| + }
|
| + var valueWidthPx = getSVGTextWidth(
|
| + this.chartAreaElement, rect.value) + 5;
|
| + var valueHeightPx = 16;
|
| + var hoverLeftPx = rect.leftPx + (rect.widthPx / 2);
|
| +
|
| + chartAreaSel
|
| + .append('rect')
|
| + .attr('class', 'hover')
|
| + .attr('fill', 'white')
|
| + .attr('x', hoverLeftPx)
|
| + .attr('y', rect.topPx)
|
| + .attr('width', Math.max(keyWidthPx, valueWidthPx))
|
| + .attr('height', keyHeightPx + valueHeightPx);
|
| +
|
| + if (seriesKeys.length > 1) {
|
| + chartAreaSel
|
| + .append('text')
|
| + .attr('class', 'hover')
|
| + .attr('fill', rect.color)
|
| + .attr('x', hoverLeftPx + 2)
|
| + .attr('y', rect.topPx + keyHeightPx - 3)
|
| + .text(rect.key);
|
| + }
|
| +
|
| + chartAreaSel
|
| + .append('text')
|
| + .attr('class', 'hover')
|
| + .attr('fill', rect.color)
|
| + .attr('x', hoverLeftPx + 2)
|
| + .attr('y', rect.topPx + keyHeightPx + valueHeightPx - 3)
|
| + .text(rect.value);
|
| + },
|
| +
|
| + clearHoverValueBox_: function() {
|
| + d3.select(this.chartAreaElement).selectAll('.hover').remove();
|
| + },
|
| +
|
| + drawRect_: function(rect, sel) {
|
| + sel.append('rect')
|
| + .attr('fill', rect.color)
|
| + .attr('x', rect.leftPx)
|
| + .attr('y', rect.topPx)
|
| + .attr('width', rect.widthPx)
|
| + .attr('height', rect.heightPx)
|
| + .on('mouseenter', this.drawHoverValueBox_.bind(this, rect))
|
| + .on('mouseleave', this.clearHoverValueBox_.bind(this));
|
| + },
|
| +
|
| updateDataContents_: function(dataSel) {
|
| dataSel.selectAll('*').remove();
|
| var chartAreaSel = d3.select(this.chartAreaElement);
|
| @@ -184,68 +242,20 @@ tr.exportTo('tr.ui.b', function() {
|
| } else {
|
| width = this.xCushion_;
|
| }
|
| - this.getRectsForDatum_(datum, index).forEach(function(rect) {
|
| - var leftPx = this.xScale_(currentX);
|
| - var rightPx = this.xScale_(currentX + width);
|
| - var widthPx = rightPx - leftPx;
|
| - rectsSel.enter()
|
| - .append('rect')
|
| - .attr('fill', rect.color)
|
| - .attr('x', leftPx)
|
| - .attr('y', rect.topPx)
|
| - .attr('width', widthPx)
|
| - .attr('height', rect.heightPx)
|
| - .on('mouseenter', function() {
|
| - chartAreaSel.selectAll('.hover').remove();
|
| - var keyWidthPx = 0;
|
| - var keyHeightPx = 0;
|
| - if (seriesKeys.length > 1) {
|
| - keyWidthPx = getTextWidth(this.chartAreaElement, rect.key);
|
| - keyHeightPx = 12;
|
| - }
|
| - var valueWidthPx = getTextWidth(
|
| - this.chartAreaElement, rect.value);
|
| - var valueHeightPx = 12;
|
| - var hoverLeftPx = leftPx + (widthPx / 2);
|
| -
|
| - chartAreaSel
|
| - .append('rect')
|
| - .attr('class', 'hover')
|
| - .attr('fill', 'white')
|
| - .attr('x', hoverLeftPx)
|
| - .attr('y', rect.topPx)
|
| - .attr('width', Math.max(keyWidthPx, valueWidthPx))
|
| - .attr('height', keyHeightPx + valueHeightPx);
|
| -
|
| - if (seriesKeys.length > 1) {
|
| - chartAreaSel
|
| - .append('text')
|
| - .attr('class', 'hover')
|
| - .attr('fill', rect.color)
|
| - .attr('x', hoverLeftPx + 2)
|
| - .attr('y', rect.topPx + keyHeightPx - 2)
|
| - .text(rect.key);
|
| - }
|
| -
|
| - chartAreaSel
|
| - .append('text')
|
| - .attr('class', 'hover')
|
| - .attr('fill', rect.color)
|
| - .attr('x', hoverLeftPx + 2)
|
| - .attr('y', rect.topPx + keyHeightPx + valueHeightPx - 2)
|
| - .text(rect.value);
|
| - }.bind(this))
|
| - .on('mouseleave', function() {
|
| - chartAreaSel.selectAll('.hover').remove();
|
| - }.bind(this));
|
| - }, this);
|
| + for (var rect of this.getRectsForDatum_(datum, index)) {
|
| + rect.leftPx = this.xScale_(currentX);
|
| + rect.rightPx = this.xScale_(currentX + width);
|
| + rect.widthPx = rect.rightPx - rect.leftPx;
|
| + this.drawRect_(rect, rectsSel.enter());
|
| + }
|
| }, this);
|
| rectsSel.exit().remove();
|
| }
|
| };
|
|
|
| return {
|
| - ColumnChart: ColumnChart
|
| + ColumnChart: ColumnChart,
|
| + getSVGTextWidth: getSVGTextWidth
|
| };
|
| });
|
| </script>
|
|
|