draganddrop.py 1.5 KB

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