handleMouseEvent method

  1. @override
void handleMouseEvent(
  1. MouseEvent event,
  2. int localX,
  3. int localY,
  4. Rect area,
)
override

Handles a mouse event at local coordinates and bounding area.

Implementation

@override
void handleMouseEvent(MouseEvent event, int localX, int localY, Rect area) {
  final listView = widget as ListView;
  if (event.button == MouseButton.wheelUp) {
    scrollOffset = max(0, scrollOffset - 1);
    if (selectedIndex >= scrollOffset + size.height.toInt()) {
      selectedIndex = scrollOffset + size.height.toInt() - 1;
    }
    rebuild();
  } else if (event.button == MouseButton.wheelDown) {
    scrollOffset = min(
      max(0, listView.children.length - size.height.toInt()),
      scrollOffset + 1,
    );
    if (selectedIndex < scrollOffset) {
      selectedIndex = scrollOffset;
    }
    rebuild();
  } else if (event.type == MouseEventType.press &&
      event.button == MouseButton.left) {
    final clickedIndex = scrollOffset + localY;
    if (clickedIndex >= 0 && clickedIndex < listView.children.length) {
      selectedIndex = clickedIndex;
      listView.onSelect?.call(clickedIndex);
      rebuild();
    }
  } else if (event.type == MouseEventType.move ||
      event.type == MouseEventType.drag) {
    final hoveredIdx = scrollOffset + localY;
    if (localX >= 0 &&
        localX < area.width &&
        localY >= 0 &&
        localY < area.height &&
        hoveredIdx >= 0 &&
        hoveredIdx < listView.children.length) {
      if (hoveredIndex != hoveredIdx) {
        hoveredIndex = hoveredIdx;
        listView.onHover?.call(hoveredIdx);
        rebuild();
      }
    } else {
      if (hoveredIndex != null) {
        hoveredIndex = null;
        listView.onHover?.call(null);
        rebuild();
      }
    }
  }
}