Source code for mantidimaging.gui.dialogs.async_task.presenter
# Copyright (C) 2024 ISIS Rutherford Appleton Laboratory UKRI
# SPDX - License - Identifier: GPL-3.0-or-later
from __future__ import annotations
import traceback
from logging import getLogger
from enum import Enum
from collections.abc import Callable
from PyQt5.QtCore import QObject, pyqtSignal
from mantidimaging.core.utility.progress_reporting import ProgressHandler
from .model import AsyncTaskDialogModel
[docs]
class Notification(Enum):
START = 1
[docs]
class AsyncTaskDialogPresenter(QObject, ProgressHandler):
progress_updated = pyqtSignal(float, str)
def __init__(self, view):
super().__init__()
self.view = view
self.progress_updated.connect(self.view.set_progress)
self.model = AsyncTaskDialogModel()
self.model.task_done.connect(self.view.handle_completion)
[docs]
def notify(self, signal):
try:
if signal == Notification.START:
self.do_start_processing()
except Exception as e:
self.show_error(e, traceback.format_exc())
getLogger(__name__).exception("Notification handler failed")
[docs]
def set_task(self, f: Callable):
self.model.task.task_function = f
[docs]
def set_parameters(self, **kwargs):
self.model.task.kwargs = kwargs
[docs]
def set_on_complete(self, f: Callable):
self.model.on_complete_function = f
[docs]
def set_tracker(self, tracker: set):
self.model.set_tracker(tracker)
[docs]
def do_start_processing(self):
"""
Starts async task execution and shows GUI.
"""
self.model.do_execute_async()
self.view.show_delayed(1000)
@property
def task_is_running(self):
return self.model.task_is_running
[docs]
def progress_update(self):
msg = self.progress.last_status_message()
self.progress_updated.emit(self.progress.completion(), msg if msg is not None else '')