handleMouseMove method
void
handleMouseMove(
- MouseEvent event
Implementation
void handleMouseMove(MouseEvent event) {
var rect = (event.target as Element).getBoundingClientRect();
var x = event.clientX - rect.left; //x position within the element.
var y = event.clientY - rect.top; //y position within the element.
var rerender = false;
PieChartItem? currentItem;
var radius = (min(width, height) / 2) * 0.9;
if ((x > width - legendWidth) && (y > height - legendHeight)) {
num ly = (y - (height - legendHeight));
for (var item in items) {
bool newIsActive = ly > 0 && ly < 20;
if (item.isActive != newIsActive) {
rerender = true;
}
item.isActive = newIsActive;
if (item.isActive) {
currentItem = item;
}
ly -= 20;
}
} else if (sqrt(pow(y - centerY, 2) + pow(x - centerX, 2)) < radius) {
var currentAngle = atan2(y - centerY, x - centerX) + (pi / 2);
if (currentAngle < 0) {
currentAngle = currentAngle + (2 * pi);
}
double startingAngle = 0;
for (var item in items) {
var arcSize = degreesToRadians((item.weight / totalWeight) * 360);
bool newIsActive = (startingAngle < currentAngle && (startingAngle + arcSize) > currentAngle);
if (item.isActive != newIsActive) {
rerender = true;
}
item.isActive = newIsActive;
if (item.isActive) {
currentItem = item;
}
startingAngle += arcSize;
}
} else {
for (var item in items) {
if (item.isActive) {
rerender = true;
}
item.isActive = false;
}
}
canvasTip.innerHTML =
('<strong>${currentItem?.label ?? ''}</strong><br/>${currentItem?.description ?? '${((currentItem?.weight ?? 0) * 100 / totalWeight).toStringAsFixed(2)}%'}')
.toJS;
canvasTip.style.display = currentItem != null ? 'block' : 'none';
canvasTip.style.right = (x < width / 2) ? '0' : 'auto';
canvasTip.style.left = (x >= width / 2) ? '0' : 'auto';
canvasTip.style.bottom = (y < height / 2) ? '0' : 'auto';
canvasTip.style.top = (y >= height / 2) ? '0' : 'auto';
if (rerender) {
render();
}
}