main.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/env python3
  2. from dataclasses import dataclass
  3. from typing import List
  4. from nicegui import ui
  5. @dataclass
  6. class TodoItem:
  7. name: str
  8. done: bool = False
  9. items: List[TodoItem] = [
  10. TodoItem('Buy milk', done=True),
  11. TodoItem('Clean the house'),
  12. TodoItem('Call mom'),
  13. ]
  14. def add(name: str) -> None:
  15. items.append(TodoItem(name))
  16. add_input.value = None
  17. render_list.refresh()
  18. def remove(item: TodoItem) -> None:
  19. items.remove(item)
  20. render_list.refresh()
  21. def toggle(item: TodoItem) -> None:
  22. item.done = not item.done
  23. render_list.refresh()
  24. def rename(item: TodoItem, name: str) -> None:
  25. item.name = name
  26. render_list.refresh()
  27. @ui.refreshable
  28. def render_list():
  29. if not items:
  30. ui.label('List is empty.')
  31. return
  32. ui.linear_progress(sum(item.done for item in items) / len(items), show_value=False)
  33. with ui.row().classes('justify-center w-full'):
  34. ui.label(f'Completed: {sum(item.done for item in items)}')
  35. ui.label(f'Remaining: {sum(not item.done for item in items)}')
  36. for item in items:
  37. with ui.row().classes('items-center'):
  38. ui.checkbox(value=item.done, on_change=lambda _, item=item: toggle(item))
  39. input = ui.input(value=item.name).classes('flex-grow')
  40. input.on('keydown.enter', lambda _, item=item, input=input: rename(item, input.value))
  41. ui.button(on_click=lambda _, item=item: remove(item)).props('flat fab-mini icon=delete color=grey')
  42. with ui.card().classes('w-80 items-stretch'):
  43. ui.label('Todo list').classes('text-semibold text-2xl')
  44. render_list()
  45. add_input = ui.input('New item').classes('mx-12')
  46. add_input.on('keydown.enter', lambda: add(add_input.value))
  47. ui.run()