handlePointerDown method
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;
}
}
}