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