diff options
Diffstat (limited to 'pw_build/py/pw_build/project_builder_context.py')
-rw-r--r-- | pw_build/py/pw_build/project_builder_context.py | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/pw_build/py/pw_build/project_builder_context.py b/pw_build/py/pw_build/project_builder_context.py index f45942351..d99362911 100644 --- a/pw_build/py/pw_build/project_builder_context.py +++ b/pw_build/py/pw_build/project_builder_context.py @@ -22,6 +22,7 @@ from enum import Enum import logging import os import subprocess +import time from typing import Callable, Dict, List, Optional, NoReturn, TYPE_CHECKING from prompt_toolkit.formatted_text import ( @@ -154,6 +155,9 @@ class ProjectBuilderContext: # pylint: disable=too-many-instance-attributes,too formatters.Text(' '), ] + self._progress_bar_refresh_interval: float = 0.1 # 10 FPS + self._last_progress_bar_redraw_time: float = 0.0 + self._enter_callback: Optional[Callable] = None key_bindings = KeyBindings() @@ -183,6 +187,12 @@ class ProjectBuilderContext: # pylint: disable=too-many-instance-attributes,too def using_progress_bars(self) -> bool: return bool(self.progress_bar) or self.using_fullscreen + @property + def log_build_steps(self) -> bool: + if self.project_builder: + return self.project_builder.log_build_steps + return False + def interrupted(self) -> bool: return self.ctrl_c_pressed or self.restart_flag @@ -221,15 +231,28 @@ class ProjectBuilderContext: # pylint: disable=too-many-instance-attributes,too def clear_progress_scrollback(self) -> None: if not self.progress_bar: return - self.progress_bar._app_loop.call_soon_threadsafe( # pylint: disable=protected-access - self.progress_bar.app.renderer.clear - ) + if ( + self.progress_bar.app.is_running + and self.progress_bar.app.loop is not None + ): + self.progress_bar.app.loop.call_soon_threadsafe( + self.progress_bar.app.renderer.clear + ) def redraw_progress(self) -> None: if not self.progress_bar: return if hasattr(self.progress_bar, 'app'): - self.progress_bar.invalidate() + redraw_time = time.time() + # Has enough time passed since last redraw? + if redraw_time > ( + self._last_progress_bar_redraw_time + + self._progress_bar_refresh_interval + ): + # Update last redraw time + self._last_progress_bar_redraw_time = redraw_time + # Trigger Prompt Toolkit UI redraw. + self.progress_bar.invalidate() def get_title_style(self) -> str: if self.restart_flag: |