handlePointerDown method

void handlePointerDown(
  1. PointerDownEvent event
)

Implementation

void handlePointerDown(PointerDownEvent event) {
  Offset localPosition = event.localPosition;
  int foundIndex = -1;

  // Check if we're clicking on a selected item
  for (int i = items.length - 1; i >= 0; i--) {
    if (_isTableComponent(items[i].label)) continue;

    Rect itemRect = Rect.fromLTWH(
        items[i].positionX ?? 0,
        items[i].positionY ?? 0,
        items[i].width ?? 100,
        items[i].height ?? 25);

    if (itemRect.contains(localPosition)) {
      foundIndex = i;
      break;
    }
  }

  if (foundIndex != -1) {
    final clickedItem = items[foundIndex];
    final isShiftPressed = HardwareKeyboard.instance.isShiftPressed;

    // Create a new list to force UI update
    final updatedItems = List<PrinterDesignerPackageListModel>.from(items);

    if (!isShiftPressed) {
      // Clear all selections if shift is not pressed
      selectedItemIds.clear();
      selectedItemId.value = null;

      // Update all items to be unselected
      for (var i = 0; i < updatedItems.length; i++) {
        updatedItems[i] = PrinterDesignerPackageListModel(
          id: updatedItems[i].id,
          type: updatedItems[i].type,
          label: updatedItems[i].label,
          prefix: updatedItems[i].prefix,
          value: updatedItems[i].value,
          imageUrl: updatedItems[i].imageUrl,
          positionX: updatedItems[i].positionX,
          positionY: updatedItems[i].positionY,
          height: updatedItems[i].height,
          width: updatedItems[i].width,
          section: updatedItems[i].section,
          isSelected: false,
          customText: updatedItems[i].customText,
          properties: updatedItems[i].properties,
        );
      }
    }

    // Add clicked item to selection
    selectedItemIds.add(clickedItem.id!);
    selectedItemId.value = clickedItem.id;

    // Update the clicked item's selection state
    updatedItems[foundIndex] = PrinterDesignerPackageListModel(
      id: clickedItem.id,
      type: clickedItem.type,
      label: clickedItem.label,
      prefix: clickedItem.prefix,
      value: clickedItem.value,
      imageUrl: clickedItem.imageUrl,
      positionX: clickedItem.positionX,
      positionY: clickedItem.positionY,
      height: clickedItem.height,
      width: clickedItem.width,
      section: clickedItem.section,
      isSelected: true,
      customText: clickedItem.customText,
      properties: clickedItem.properties,
    );

    // Update all items with new selection state
    items.value = updatedItems;

    // Set dragging state
    draggingItemId.value = clickedItem.id;
    lastDraggedItemId.value = clickedItem.id;
    originalItemPosition.value =
        Offset(clickedItem.positionX ?? 0, clickedItem.positionY ?? 0);
    itemStartPosition.value =
        Offset(clickedItem.positionX ?? 0, clickedItem.positionY ?? 0);
  } else {
    // Clicked on empty space
    final isShiftPressed = HardwareKeyboard.instance.isShiftPressed;

    if (!isShiftPressed) {
      // Clear all selections if shift is not pressed
      selectedItemIds.clear();
      selectedItemId.value = null;

      // Create a new list with all items unselected
      final updatedItems = items
          .map((item) =>
          PrinterDesignerPackageListModel(
            id: item.id,
            type: item.type,
            label: item.label,
            prefix: item.prefix,
            value: item.value,
            imageUrl: item.imageUrl,
            positionX: item.positionX,
            positionY: item.positionY,
            height: item.height,
            width: item.width,
            section: item.section,
            isSelected: false,
            customText: item.customText,
            properties: item.properties,
          ))
          .toList();

      // Update the items list
      items.value = updatedItems;
    }
  }
}