Pamhyr: Add update propagation mechanism.

setup.py
Pierre-Antoine Rouby 2024-02-13 09:23:36 +01:00
parent e03ebedfdf
commit e96e291ec4
4 changed files with 69 additions and 17 deletions

View File

@ -31,7 +31,7 @@ from PyQt5.QtGui import (
) )
from PyQt5.QtCore import ( from PyQt5.QtCore import (
QModelIndex, Qt, QSettings, pyqtSlot, QModelIndex, Qt, QSettings, pyqtSlot,
QItemSelectionModel, QCoreApplication, QSize QItemSelectionModel, QCoreApplication, QSize,
) )
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QApplication, QMainWindow, QFileDialog, QCheckBox, QApplication, QMainWindow, QFileDialog, QCheckBox,
@ -201,6 +201,9 @@ class GeometryWindow(PamhyrWindow):
self._table.layoutChanged.connect(self.update) self._table.layoutChanged.connect(self.update)
def update(self): def update(self):
self._update()
def _update(self, propagate=True):
self.update_profile_windows() self.update_profile_windows()
self.plot_xy() self.plot_xy()
self.plot_kpc() self.plot_kpc()
@ -209,6 +212,15 @@ class GeometryWindow(PamhyrWindow):
self.select_current_profile() self.select_current_profile()
self.changed_slider_value() 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): def import_from_file(self):
options = QFileDialog.Options() options = QFileDialog.Options()
settings = QSettings(QSettings.IniFormat, settings = QSettings(QSettings.IniFormat,

View File

@ -28,7 +28,7 @@ from PyQt5.QtGui import (
) )
from PyQt5.QtCore import ( from PyQt5.QtCore import (
Qt, QTranslator, QEvent, QUrl, Qt, QTranslator, QEvent, QUrl, QTimer,
) )
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QMainWindow, QApplication, QAction, QMainWindow, QApplication, QAction,
@ -140,6 +140,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
self.default_style() self.default_style()
self.setup_debug_mode(init=True) self.setup_debug_mode(init=True)
self.setup_results() self.setup_results()
self.setup_timer()
self.trans = QTranslator(self) self.trans = QTranslator(self)
# self.ui.retranslateUi() # self.ui.retranslateUi()
@ -321,6 +322,31 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
menu.removeAction(self.debug_sqlite_action) menu.removeAction(self.debug_sqlite_action)
self.set_debug_lvl(debug=False) 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 # # MODEL #
######### #########

View File

@ -25,39 +25,41 @@ logger = logging.getLogger()
class ListedSubWindow(object): class ListedSubWindow(object):
def __init__(self, **kwargs): def __init__(self, **kwargs):
super(ListedSubWindow, self).__init__() super(ListedSubWindow, self).__init__()
self.sub_win_cnt = 0 self._sub_win_cnt = 0
self.sub_win_list = [] self._sub_win_list = []
@property
def sub_win_count(self): def sub_win_count(self):
return self.sub_win_cnt return self._sub_win_cnt
@property
def sub_win_list(self): def sub_win_list(self):
return self.sub_win_list.copy() return self._sub_win_list.copy()
def sub_win_add(self, name, win): def sub_win_add(self, name, win):
self.sub_win_list.append((name, win)) self._sub_win_list.append((name, win))
self.sub_win_cnt += 1 self._sub_win_cnt += 1
try: try:
logger.info( logger.info(
f"Open window: {name}: {self.sub_win_cnt}") f"Open window: {name}: {self._sub_win_cnt}")
except Exception: 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 !") logger.warning(f"Sub window without hash method !")
def sub_win_del(self, h): def sub_win_del(self, h):
self.sub_win_list = list( self._sub_win_list = list(
filter( filter(
lambda x: x[1].hash() != h, lambda x: x[1].hash() != h,
self.sub_win_list self._sub_win_list
) )
) )
self.sub_win_cnt = len(self.sub_win_list) self._sub_win_cnt = len(self._sub_win_list)
logger.info(f"Close window: ({h}) {self.sub_win_cnt}") logger.info(f"Close window: ({h}) {self._sub_win_cnt}")
def _sub_win_exists(self, h): def _sub_win_exists(self, h):
res = reduce( res = reduce(
lambda acc, el: (acc or (h == (el[1].hash()))), lambda acc, el: (acc or (h == (el[1].hash()))),
self.sub_win_list, self._sub_win_list,
False False
) )
return res return res
@ -70,7 +72,7 @@ class ListedSubWindow(object):
return next( return next(
filter( filter(
lambda el: (h == el[1].hash()), lambda el: (h == el[1].hash()),
self.sub_win_list, self._sub_win_list,
) )
)[1] )[1]
except Exception: except Exception:
@ -93,7 +95,7 @@ class ListedSubWindow(object):
otherelse None otherelse None
""" """
hash = cls._hash(data) hash = cls._hash(data)
if self.sub_win_exists(hash): if self._sub_win_exists(hash):
win = self.get_sub_win(hash) win = self.get_sub_win(hash)
win.activateWindow() win.activateWindow()
return True return True

View File

@ -103,6 +103,18 @@ class PamhyrWindowTools(object):
""" """
self._set_title() 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 # Hash methods
@classmethod @classmethod