log.py 1.4 KB

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