1
0

draganddrop.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from __future__ import annotations
  2. from typing import Callable, Optional
  3. from typing_extensions import Protocol
  4. from nicegui import ui
  5. class Item(Protocol):
  6. title: str
  7. dragged: Optional[card] = None
  8. class column(ui.column):
  9. def __init__(self, name: str, on_drop: Optional[Callable[[Item, str], None]] = None) -> None:
  10. super().__init__()
  11. with self.classes('bg-blue-grey-2 w-60 p-4 rounded shadow-2'):
  12. ui.label(name).classes('text-bold ml-1')
  13. self.name = name
  14. self.on('dragover.prevent', self.highlight)
  15. self.on('dragleave', self.unhighlight)
  16. self.on('drop', self.move_card)
  17. self.on_drop = on_drop
  18. def highlight(self) -> None:
  19. self.classes(remove='bg-blue-grey-2', add='bg-blue-grey-3')
  20. def unhighlight(self) -> None:
  21. self.classes(remove='bg-blue-grey-3', add='bg-blue-grey-2')
  22. def move_card(self) -> None:
  23. global dragged
  24. self.unhighlight()
  25. dragged.parent_slot.parent.remove(dragged)
  26. with self:
  27. card(dragged.item)
  28. self.on_drop(dragged.item, self.name)
  29. dragged = None
  30. class card(ui.card):
  31. def __init__(self, item: Item) -> None:
  32. super().__init__()
  33. self.item = item
  34. with self.props('draggable').classes('w-full cursor-pointer bg-grey-1'):
  35. ui.label(item.title)
  36. self.on('dragstart', self.handle_dragstart)
  37. def handle_dragstart(self) -> None:
  38. global dragged
  39. dragged = self