You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

159 lines
6.1 KiB

import CLASS from './class';
import { ChartInternal } from './core';
ChartInternal.prototype.initEventRect = function () {
var $$ = this, config = $$.config;
$$.main.select('.' + CLASS.chart).append("g")
.attr("class", CLASS.eventRects)
.style('fill-opacity', 0);
$$.eventRect = $$.main.select('.' + CLASS.eventRects).append('rect')
.attr('class', CLASS.eventRect);
// event rect handle zoom event as well
if (config.zoom_enabled && $$.zoom) {
$$.eventRect.call($$.zoom).on("dblclick.zoom", null);
if (config.zoom_initialRange) {
// WORKAROUND: Add transition to apply transform immediately when no subchart
$$.eventRect.transition().duration(0).call(
$$.zoom.transform, $$.zoomTransform(config.zoom_initialRange)
);
}
}
};
ChartInternal.prototype.redrawEventRect = function () {
var $$ = this, d3 = $$.d3, config = $$.config,
x, y, w, h;
// TODO: rotated not supported yet
x = 0;
y = 0;
w = $$.width;
h = $$.height;
function mouseout() {
$$.svg.select('.' + CLASS.eventRect).style('cursor', null);
$$.hideXGridFocus();
$$.hideTooltip();
$$.unexpandCircles();
$$.unexpandBars();
}
// rects for mouseover
$$.main.select('.' + CLASS.eventRects)
.style('cursor', config.zoom_enabled ? config.axis_rotated ? 'ns-resize' : 'ew-resize' : null);
$$.eventRect
.attr('x', x)
.attr('y', y)
.attr('width', w)
.attr('height', h)
.on('mouseout', config.interaction_enabled ? function () {
if (!config) { return; } // chart is destroyed
if ($$.hasArcType()) { return; }
mouseout();
} : null)
.on('mousemove', config.interaction_enabled ? function () {
var targetsToShow, mouse, closest, sameXData, selectedData;
if ($$.dragging) { return; } // do nothing when dragging
if ($$.hasArcType(targetsToShow)) { return; }
targetsToShow = $$.filterTargetsToShow($$.data.targets);
mouse = d3.mouse(this);
closest = $$.findClosestFromTargets(targetsToShow, mouse);
if ($$.mouseover && (!closest || closest.id !== $$.mouseover.id)) {
config.data_onmouseout.call($$.api, $$.mouseover);
$$.mouseover = undefined;
}
if (!closest) {
mouseout();
return;
}
if ($$.isScatterType(closest) || !config.tooltip_grouped) {
sameXData = [closest];
} else {
sameXData = $$.filterByX(targetsToShow, closest.x);
}
// show tooltip when cursor is close to some point
selectedData = sameXData.map(function (d) {
return $$.addName(d);
});
$$.showTooltip(selectedData, this);
// expand points
if (config.point_focus_expand_enabled) {
$$.unexpandCircles();
selectedData.forEach(function (d) {
$$.expandCircles(d.index, d.id, false);
});
}
$$.expandBars(closest.index, closest.id, true);
// Show xgrid focus line
$$.showXGridFocus(selectedData);
// Show cursor as pointer if point is close to mouse position
if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {
$$.svg.select('.' + CLASS.eventRect).style('cursor', 'pointer');
if (!$$.mouseover) {
config.data_onmouseover.call($$.api, closest);
$$.mouseover = closest;
}
}
} : null)
.on('click', config.interaction_enabled ? function () {
var targetsToShow, mouse, closest, sameXData;
if ($$.hasArcType(targetsToShow)) { return; }
targetsToShow = $$.filterTargetsToShow($$.data.targets);
mouse = d3.mouse(this);
closest = $$.findClosestFromTargets(targetsToShow, mouse);
if (! closest) { return; }
// select if selection enabled
if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {
if ($$.isScatterType(closest) || !config.data_selection_grouped) {
sameXData = [closest];
} else {
sameXData = $$.filterByX(targetsToShow, closest.x);
}
sameXData.forEach(function (d) {
$$.main.selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(d.id)).selectAll('.' + CLASS.shape + '-' + d.index).each(function () {
if (config.data_selection_grouped || $$.isWithinShape(this, d)) {
$$.toggleShape(this, d, d.index);
config.data_onclick.call($$.api, d, this);
}
});
});
}
} : null)
.call(
config.interaction_enabled && config.data_selection_draggable && $$.drag ? (
d3.drag()
.on('drag', function () { $$.drag(d3.mouse(this)); })
.on('start', function () { $$.dragstart(d3.mouse(this)); })
.on('end', function () { $$.dragend(); })
) : function () {}
);
};
ChartInternal.prototype.getMousePosition = function (data) {
var $$ = this;
return [$$.x(data.x), $$.getYScale(data.id)(data.value)];
};
ChartInternal.prototype.dispatchEvent = function (type, mouse) {
var $$ = this,
selector = '.' + CLASS.eventRect,
eventRect = $$.main.select(selector).node(),
box = eventRect.getBoundingClientRect(),
x = box.left + (mouse ? mouse[0] : 0),
y = box.top + (mouse ? mouse[1] : 0),
event = document.createEvent("MouseEvents");
event.initMouseEvent(type, true, true, window, 0, x, y, x, y,
false, false, false, false, 0, null);
eventRect.dispatchEvent(event);
};