From e96e291ec4d4cd2350fec259cf9a6c2f53b829d4 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Tue, 13 Feb 2024 09:23:36 +0100
Subject: [PATCH] Pamhyr: Add update propagation mechanism.

---
 src/View/Geometry/Window.py       | 14 +++++++++++++-
 src/View/MainWindow.py            | 28 ++++++++++++++++++++++++++-
 src/View/Tools/ListedSubWindow.py | 32 ++++++++++++++++---------------
 src/View/Tools/PamhyrWindow.py    | 12 ++++++++++++
 4 files changed, 69 insertions(+), 17 deletions(-)

diff --git a/src/View/Geometry/Window.py b/src/View/Geometry/Window.py
index 3afcc603..b5e5181c 100644
--- a/src/View/Geometry/Window.py
+++ b/src/View/Geometry/Window.py
@@ -31,7 +31,7 @@ from PyQt5.QtGui import (
 )
 from PyQt5.QtCore import (
     QModelIndex, Qt, QSettings, pyqtSlot,
-    QItemSelectionModel, QCoreApplication, QSize
+    QItemSelectionModel, QCoreApplication, QSize,
 )
 from PyQt5.QtWidgets import (
     QApplication, QMainWindow, QFileDialog, QCheckBox,
@@ -201,6 +201,9 @@ class GeometryWindow(PamhyrWindow):
         self._table.layoutChanged.connect(self.update)
 
     def update(self):
+        self._update()
+
+    def _update(self, propagate=True):
         self.update_profile_windows()
         self.plot_xy()
         self.plot_kpc()
@@ -209,6 +212,15 @@ class GeometryWindow(PamhyrWindow):
         self.select_current_profile()
         self.changed_slider_value()
 
+        if propagate:
+            self._propagate_update(key="geometry")
+
+    def _propagated_update(self, key=None):
+        if key != "network":
+            return
+
+        self._update(propagate=False)
+
     def import_from_file(self):
         options = QFileDialog.Options()
         settings = QSettings(QSettings.IniFormat,
diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py
index 48f784d6..001bf4c8 100644
--- a/src/View/MainWindow.py
+++ b/src/View/MainWindow.py
@@ -28,7 +28,7 @@ from PyQt5.QtGui import (
 )
 
 from PyQt5.QtCore import (
-    Qt, QTranslator, QEvent, QUrl,
+    Qt, QTranslator, QEvent, QUrl, QTimer,
 )
 from PyQt5.QtWidgets import (
     QMainWindow, QApplication, QAction,
@@ -140,6 +140,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
         self.default_style()
         self.setup_debug_mode(init=True)
         self.setup_results()
+        self.setup_timer()
 
         self.trans = QTranslator(self)
         # self.ui.retranslateUi()
@@ -321,6 +322,31 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
                 menu.removeAction(self.debug_sqlite_action)
                 self.set_debug_lvl(debug=False)
 
+    def setup_timer(self):
+        self._init_propagation_keys()
+
+        self._propagation_timer = QTimer(self)
+        self._propagation_timer.start(2000)
+
+        self._propagation_timer.timeout.connect(
+            self._do_propagate_update
+        )
+
+    def _init_propagation_keys(self):
+        self._propagation_keys = set()
+
+    def _propagate_update(self, key=None):
+        self._propagation_keys.add(key)
+        logger.debug(f"Propagation keys: {self._propagation_keys}")
+
+    def _do_propagate_update(self):
+        for key in self._propagation_keys:
+            logger.debug(f"Propagation of {key}")
+            for _, window in self.sub_win_list:
+                window._propagated_update(key=key)
+
+        self._init_propagation_keys()
+
     #########
     # MODEL #
     #########
diff --git a/src/View/Tools/ListedSubWindow.py b/src/View/Tools/ListedSubWindow.py
index a0f1b335..4c53590f 100644
--- a/src/View/Tools/ListedSubWindow.py
+++ b/src/View/Tools/ListedSubWindow.py
@@ -25,39 +25,41 @@ logger = logging.getLogger()
 class ListedSubWindow(object):
     def __init__(self, **kwargs):
         super(ListedSubWindow, self).__init__()
-        self.sub_win_cnt = 0
-        self.sub_win_list = []
+        self._sub_win_cnt = 0
+        self._sub_win_list = []
 
+    @property
     def sub_win_count(self):
-        return self.sub_win_cnt
+        return self._sub_win_cnt
 
+    @property
     def sub_win_list(self):
-        return self.sub_win_list.copy()
+        return self._sub_win_list.copy()
 
     def sub_win_add(self, name, win):
-        self.sub_win_list.append((name, win))
-        self.sub_win_cnt += 1
+        self._sub_win_list.append((name, win))
+        self._sub_win_cnt += 1
         try:
             logger.info(
-                f"Open window: {name}: {self.sub_win_cnt}")
+                f"Open window: {name}: {self._sub_win_cnt}")
         except Exception:
-            logger.info(f"Open window: {name}: {self.sub_win_cnt}: X")
+            logger.info(f"Open window: {name}: {self._sub_win_cnt}: X")
             logger.warning(f"Sub window without hash method !")
 
     def sub_win_del(self, h):
-        self.sub_win_list = list(
+        self._sub_win_list = list(
             filter(
                 lambda x: x[1].hash() != h,
-                self.sub_win_list
+                self._sub_win_list
             )
         )
-        self.sub_win_cnt = len(self.sub_win_list)
-        logger.info(f"Close window: ({h}) {self.sub_win_cnt}")
+        self._sub_win_cnt = len(self._sub_win_list)
+        logger.info(f"Close window: ({h}) {self._sub_win_cnt}")
 
     def _sub_win_exists(self, h):
         res = reduce(
             lambda acc, el: (acc or (h == (el[1].hash()))),
-            self.sub_win_list,
+            self._sub_win_list,
             False
         )
         return res
@@ -70,7 +72,7 @@ class ListedSubWindow(object):
             return next(
                 filter(
                     lambda el: (h == el[1].hash()),
-                    self.sub_win_list,
+                    self._sub_win_list,
                 )
             )[1]
         except Exception:
@@ -93,7 +95,7 @@ class ListedSubWindow(object):
             otherelse None
         """
         hash = cls._hash(data)
-        if self.sub_win_exists(hash):
+        if self._sub_win_exists(hash):
             win = self.get_sub_win(hash)
             win.activateWindow()
             return True
diff --git a/src/View/Tools/PamhyrWindow.py b/src/View/Tools/PamhyrWindow.py
index 46b47f44..32b77db9 100644
--- a/src/View/Tools/PamhyrWindow.py
+++ b/src/View/Tools/PamhyrWindow.py
@@ -103,6 +103,18 @@ class PamhyrWindowTools(object):
         """
         self._set_title()
 
+    def _propagate_update(self, key=None):
+        logger.debug(f"_propagate_update({key}) to {self._parent}")
+        if self._parent is not None:
+            self._parent._propagate_update(key=key)
+
+    def _propagated_update(self, key=None):
+        if key is None:
+            return
+
+        # Update ...
+        return
+
     # Hash methods
 
     @classmethod
-- 
GitLab