Source code for mantidimaging.gui.dialogs.async_task.view

# Copyright (C) 2024 ISIS Rutherford Appleton Laboratory UKRI
# SPDX - License - Identifier: GPL-3.0-or-later
from __future__ import annotations

from typing import Any
from collections.abc import Callable

from mantidimaging.core.utility.progress_reporting import Progress
from mantidimaging.gui.mvp_base import BaseDialogView
from .presenter import AsyncTaskDialogPresenter

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QTimer


[docs] class AsyncTaskDialogView(BaseDialogView): _presenter: AsyncTaskDialogPresenter | None def __init__(self, parent: QMainWindow): super().__init__(parent, 'gui/ui/async_task_dialog.ui') self._presenter = AsyncTaskDialogPresenter(self) self.progressBar.setMinimum(0) self.progressBar.setMaximum(1000) self.show_timer = QTimer(self) self.hide() @property def presenter(self) -> AsyncTaskDialogPresenter: if self._presenter is None: raise RuntimeError("Presenter accessed after handle_completion") return self._presenter
[docs] def handle_completion(self, successful: bool): """ Updates the UI after the task has been completed. :param successful: If the task was successful """ self.show_timer.stop() if successful: # Set info text to "Complete" self.infoText.setText("Complete") else: self.infoText.setText("Task failed.") self.close() self.setParent(None) self.presenter.progress = None self.presenter.model = None self._presenter = None
[docs] def set_progress(self, progress: float, message: str): # Set status message if message: self.infoText.setText(message) # Update progress bar self.progressBar.setValue(int(progress * 1000))
[docs] def show_delayed(self, timeout): self.show_timer.singleShot(timeout, self.show_from_timer) self.show_timer.start()
[docs] def show_from_timer(self): # Might not run until after handle_completion if self._presenter is not None and self.presenter.task_is_running: self.show()
[docs] def start_async_task_view(parent: QMainWindow, task: Callable, on_complete: Callable, kwargs: dict | None = None, tracker: set[Any] | None = None, busy: bool | None = False): atd = AsyncTaskDialogView(parent) if not kwargs: kwargs = {'progress': Progress()} else: kwargs['progress'] = Progress() kwargs['progress'].add_progress_handler(atd.presenter) if busy: atd.progressBar.setMinimum(0) atd.progressBar.setMaximum(0) atd.presenter.set_task(task) atd.presenter.set_on_complete(on_complete) atd.presenter.set_parameters(**kwargs) if tracker is not None: atd.presenter.set_tracker(tracker) atd.presenter.do_start_processing()