from src.hooks.progressListener import ProgressListener from typing import Union class SubTaskProgressListener(ProgressListener): """ A sub task listener that reports the progress of a sub task to a base task listener Parameters ---------- base_task_listener : ProgressListener The base progress listener to accumulate overall progress in. base_task_total : float The maximum total progress that will be reported to the base progress listener. sub_task_start : float The starting progress of a sub task, in respect to the base progress listener. sub_task_total : float The total amount of progress a sub task will report to the base progress listener. """ def __init__( self, base_task_listener: ProgressListener, base_task_total: float, sub_task_start: float, sub_task_total: float, ): self.base_task_listener = base_task_listener self.base_task_total = base_task_total self.sub_task_start = base_task_total*sub_task_start self.sub_task_total = base_task_total*sub_task_total def on_progress(self, current: Union[int, float], total: Union[int, float], desc: str = None): sub_task_progress_frac = current / total sub_task_progress = self.sub_task_start + self.sub_task_total * sub_task_progress_frac self.base_task_listener.on_progress(sub_task_progress, self.base_task_total, desc=desc) def on_finished(self, desc: str = None): self.base_task_listener.on_progress(self.sub_task_start + self.sub_task_total, self.base_task_total, desc=desc)