handleMouseMove method

void handleMouseMove(
  1. 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();
  }
}