From 03812a0b42ac1490836296b60e5eb8b1c9880acd Mon Sep 17 00:00:00 2001
From: Conor Finn <conor.finn@stfc.ac.uk>
Date: Mon, 21 Oct 2019 15:39:54 +0100
Subject: [PATCH] RE #27012 Implement observer pattern for calibration

The calibration tab is now able to notify any tabs that subscribe to it what the current calibration is.
For now, this allows the focusing tab to perform it's algorithm based on the most recently loaded calibration.
---
 .../engineering_diffraction.py                 |  6 ++++++
 .../tabs/calibration/presenter.py              | 14 ++++++++++++++
 .../tabs/focus/presenter.py                    | 18 +++++++++++++++++-
 3 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
index a7601f3f2e9..bfb03af5406 100644
--- a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
+++ b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py
@@ -41,6 +41,9 @@ class EngineeringDiffractionGui(QtWidgets.QMainWindow, Ui_main_window):
         self.setup_calibration()
         self.setup_focus()
 
+        # Setup notifiers
+        self.setup_calibration_notifier()
+
     def setup_calibration(self):
         cal_model = CalibrationModel()
         cal_view = CalibrationView(parent=self.tabs)
@@ -57,6 +60,9 @@ class EngineeringDiffractionGui(QtWidgets.QMainWindow, Ui_main_window):
         self.set_on_rb_num_changed(self.focus_presenter.set_rb_number)
         self.tabs.addTab(focus_view, "Focus")
 
+    def setup_calibration_notifier(self):
+        self.calibration_presenter.calibration_notifier.add_subscriber(self.focus_presenter.calibration_observer)
+
     def set_on_help_clicked(self, slot):
         self.pushButton_help.clicked.connect(slot)
 
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py
index a646505f5cb..79c5f9e5008 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py
@@ -9,6 +9,7 @@ from __future__ import (absolute_import, division, print_function)
 
 from mantidqt.utils.asynchronous import AsyncTask
 from mantid.simpleapi import logger
+from mantidqt.utils.observer_pattern import Observable
 
 
 class CalibrationPresenter(object):
@@ -16,6 +17,7 @@ class CalibrationPresenter(object):
         self.model = model
         self.view = view
         self.worker = None
+        self.calibration_notifier = self.CalibrationNotifier(self)
 
         self.current_calibration = {"vanadium_path": None, "ceria_path": None}
         self.pending_calibration = {"vanadium_path": None, "ceria_path": None}
@@ -62,6 +64,7 @@ class CalibrationPresenter(object):
     def set_current_calibration(self, success_info):
         logger.information("Thread executed in " + str(success_info.elapsed_time) + " seconds.")
         self.current_calibration = self.pending_calibration
+        self.calibration_notifier.notify_subscribers(self.current_calibration)
         self.pending_calibration = {"vanadium_path": None, "ceria_path": None}
         self.enable_calibrate_buttons()
 
@@ -95,3 +98,14 @@ class CalibrationPresenter(object):
     def _on_error(self, failure_info):
         logger.warning(str(failure_info))
         self.enable_calibrate_buttons()
+
+    # -----------------------
+    # Observers / Observables
+    # -----------------------
+    class CalibrationNotifier(Observable):
+        def __init__(self, outer):
+            Observable.__init__(self)
+            self.outer = outer
+
+        def notify_subscribers(self, *args, **kwargs):
+            Observable.notify_subscribers(self, *args)
diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/focus/presenter.py b/scripts/Engineering/gui/engineering_diffraction/tabs/focus/presenter.py
index 8492ab66325..59989643cb0 100644
--- a/scripts/Engineering/gui/engineering_diffraction/tabs/focus/presenter.py
+++ b/scripts/Engineering/gui/engineering_diffraction/tabs/focus/presenter.py
@@ -10,6 +10,7 @@ from __future__ import (absolute_import, division, print_function)
 from qtpy.QtWidgets import QMessageBox
 
 from mantidqt.utils.asynchronous import AsyncTask
+from mantidqt.utils.observer_pattern import Observer
 from mantid.simpleapi import logger
 
 
@@ -18,12 +19,13 @@ class FocusPresenter(object):
         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)
 
         # Variables from other GUI tabs.
-        self.current_calibration = {"vanadium_path": "307521", "ceria_path": None}  # TODO: USE OBSERVER PATTERN
+        self.current_calibration = {"vanadium_path": None, "ceria_path": None}
         self.instrument = "ENGINX"
         self.rb_num = None
 
@@ -90,3 +92,17 @@ class FocusPresenter(object):
         if self.view.get_south_bank():
             banks.append("South")
         return banks
+
+    def update_calibration(self, 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)
-- 
GitLab