draganddrop.py 1.3 KB

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