log.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import urllib.parse
  2. from collections import deque
  3. from typing import Any, Optional
  4. from ..element import Element
  5. class Log(Element, component='log.js'):
  6. def __init__(self, max_lines: Optional[int] = None) -> None:
  7. """Log View
  8. Create a log view that allows to add new lines without re-transmitting the whole history to the client.
  9. :param max_lines: maximum number of lines before dropping oldest ones (default: `None`)
  10. """
  11. super().__init__()
  12. self._props['max_lines'] = max_lines
  13. self._props['lines'] = ''
  14. self._classes = ['nicegui-log']
  15. self.lines: deque[str] = deque(maxlen=max_lines)
  16. self.total_count: int = 0
  17. def push(self, line: Any) -> None:
  18. """Add a new line to the log.
  19. :param line: the line to add (can contain line breaks)
  20. """
  21. new_lines = [urllib.parse.quote(line) for line in str(line).splitlines()]
  22. self.lines.extend(new_lines)
  23. self._props['lines'] = '\n'.join(self.lines)
  24. self.total_count += len(new_lines)
  25. self.run_method('push', urllib.parse.quote(str(line)), self.total_count)
  26. def clear(self) -> None:
  27. """Clear the log."""
  28. super().clear()
  29. self._props['lines'] = ''
  30. self.lines.clear()
  31. self.run_method('clear')