-
Conor Finn authored
Also refactors the tests to focus on one path of execution per test.
Conor Finn authoredAlso refactors the tests to focus on one path of execution per test.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
presenter.py 4.48 KiB
# Mantid Repository : https://github.com/mantidproject/mantid
#
# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI,
# NScD Oak Ridge National Laboratory, European Spallation Source
# & Institut Laue - Langevin
# SPDX - License - Identifier: GPL - 3.0 +
# pylint: disable=invalid-name
from __future__ import (absolute_import, division, print_function)
from qtpy.QtWidgets import QMessageBox
from Engineering.gui.engineering_diffraction.tabs.common import INSTRUMENT_DICT
from mantidqt.utils.asynchronous import AsyncTask
from mantidqt.utils.observer_pattern import Observer
from mantid.simpleapi import logger
class FocusPresenter(object):
def __init__(self, model, view):
self.model = model
self.view = view
self.worker = None
self.calibration_observer = self.CalibrationObserver(self)
# Connect view signals to local methods.
self.view.set_on_focus_clicked(self.on_focus_clicked)
self.view.set_enable_controls_connection(self.set_focus_controls_enabled)
# Variables from other GUI tabs.
self.current_calibration = {"vanadium_path": None, "ceria_path": None}
self.instrument = "ENGINX"
self.rb_num = None
def on_focus_clicked(self):
banks = self._get_banks()
if not self._validate(banks):
return
focus_path = self.view.get_focus_filename()
self.start_focus_worker(focus_path, banks, self.view.get_plot_output(), self.rb_num)
def start_focus_worker(self, focus_path, banks, plot_output, rb_num):
"""
Focus data in a separate thread to stop the main GUI from hanging.
:param focus_path: The path to the file containing the data to focus.
:param banks: A list of banks that are to be focused.
:param plot_output: True if the output should be plotted.
:param rb_num: The rb_number from the main window (often an experiment id)
"""
self.worker = AsyncTask(
self.model.focus_run,
(focus_path, banks, plot_output, self.instrument, rb_num, self.current_calibration),
error_cb=self._on_worker_error,
finished_cb=self.emit_enable_button_signal)
self.set_focus_controls_enabled(False)
self.worker.start()
def set_instrument_override(self, instrument):
instrument = INSTRUMENT_DICT[instrument]
self.view.set_instrument_override(instrument)
self.instrument = instrument
def set_rb_number(self, rb_number):
self.rb_num = rb_number
def _validate(self, banks):
"""
Ensure that the worker is ready to be started.
:param banks: A list of banks to focus.
:return: True if the worker can be started safely.
"""
if not self.view.get_focus_valid():
return False
if self.current_calibration["vanadium_path"] is None:
self._create_error_message(
"Load a calibration from the Calibration tab before focusing.")
return False
if self.view.is_searching():
return False
if len(banks) == 0:
self._create_error_message("Please select at least one bank.")
return False
return True
def _create_error_message(self, message):
QMessageBox.warning(self.view, "Engineering Diffraction - Error", str(message))
def _on_worker_error(self, failure_info):
logger.warning(str(failure_info))
self.emit_enable_button_signal()
def set_focus_controls_enabled(self, enabled):
self.view.set_focus_button_enabled(enabled)
self.view.set_plot_output_enabled(enabled)
def _get_banks(self):
banks = []
if self.view.get_north_bank():
banks.append("North")
if self.view.get_south_bank():
banks.append("South")
return banks
def emit_enable_button_signal(self):
self.view.sig_enable_controls.emit(True)
def update_calibration(self, calibration):
"""
Update the current calibration following an call from a CalibrationNotifier
:param calibration: The new current calibration.
"""
self.current_calibration = calibration
# -----------------------
# Observers / Observables
# -----------------------
class CalibrationObserver(Observer):
def __init__(self, outer):
Observer.__init__(self)
self.outer = outer
def update(self, observable, calibration):
self.outer.update_calibration(calibration)