diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py
index ff57e77a..11ac20f4 100644
--- a/src/View/MainWindow.py
+++ b/src/View/MainWindow.py
@@ -62,6 +62,7 @@ from View.SolverParameters.Window import SolverParametersWindow
from View.RunSolver.Window import SelectSolverWindow, SolverLogWindow
from View.CheckList.Window import CheckListWindow
from View.Results.Window import ResultsWindow
+from View.Results.ReadingResultsDialog import ReadingResultsDialog
from View.Debug.Window import ReplWindow
# Optional internal display of documentation for make the application
@@ -966,15 +967,20 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
sol.show()
def open_solver_results(self, solver, results=None):
+ def reading_fn():
+ self._tmp_results = results
+
# If no specific results, get last results
if results is None:
- results = self._last_results
+ def reading_fn():
+ self._tmp_results = self._last_results
if self._last_results is None:
- results = solver.results(
- self._study,
- self._solver_workdir(solver),
- )
+ def reading_fn():
+ self._tmp_results = solver.results(
+ self._study,
+ self._solver_workdir(solver),
+ )
# Open from file
if type(results) is str:
@@ -982,11 +988,16 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
name = os.path.basename(results).replace(".BIN", "")
- results = solver.results(
- self._study,
- os.path.dirname(results),
- name=name
- )
+ def reading_fn():
+ self._tmp_results = solver.results(
+ self._study,
+ os.path.dirname(results),
+ name=name
+ )
+
+ dlg = ReadingResultsDialog(reading_fn=reading_fn, parent=self)
+ dlg.exec_()
+ results = self._tmp_results
# No results available
if results is None:
diff --git a/src/View/Results/ReadingResultsDialog.py b/src/View/Results/ReadingResultsDialog.py
new file mode 100644
index 00000000..84fa17ea
--- /dev/null
+++ b/src/View/Results/ReadingResultsDialog.py
@@ -0,0 +1,117 @@
+# ReadingResultsDialog.py -- Pamhyr
+# Copyright (C) 2023-2024 INRAE
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+# -*- coding: utf-8 -*-
+
+import logging
+
+from tools import logger_exception
+
+from View.Tools.PamhyrWindow import PamhyrDialog
+from View.Results.translate import ResultsTranslate
+
+from PyQt5.QtGui import (
+ QKeySequence,
+)
+
+from PyQt5.QtCore import (
+ Qt, QVariant, QAbstractTableModel, QTimer,
+ QObject, pyqtSlot, pyqtSignal, QThread,
+)
+
+from PyQt5.QtWidgets import (
+ QLabel,
+)
+
+logger = logging.getLogger()
+
+
+class Worker(QObject):
+ signalStatus = pyqtSignal(str)
+
+ def __init__(self, reading_fn, parent=None):
+ super(self.__class__, self).__init__(parent)
+
+ self._reading_fn = reading_fn
+
+ def process(self):
+ self._reading_fn()
+ self.signalStatus.emit('end')
+
+
+class ReadingResultsDialog(PamhyrDialog):
+ _pamhyr_ui = "DialogReadingResults"
+ _pamhyr_name = "Reading results"
+
+ _spin = ["-", "\\", "|", "/"]
+
+ def __init__(self, reading_fn, parent=None):
+ trad = ResultsTranslate()
+ super(ReadingResultsDialog, self).__init__(
+ title=trad[self._pamhyr_name],
+ trad=trad,
+ options=[],
+ parent=parent
+ )
+
+ self._reading_fn = reading_fn
+
+ self._init_default_values()
+
+ self.setup_timer()
+ self.setup_worker()
+
+ self._timer.start(150)
+ self._worker_thread.start()
+
+ def _init_default_values(self):
+ self._spinner_step = 0
+
+ self.set_label_text("label_spinner", self._spin[0])
+
+ def setup_worker(self):
+ self._worker = Worker(self._reading_fn)
+ self._worker_thread = QThread(parent=self)
+ self._worker.moveToThread(self._worker_thread)
+
+ self._worker.signalStatus.connect(self.close)
+ self._worker_thread.started.connect(self._worker.process)
+
+ def setup_timer(self):
+ self._timer = QTimer(self)
+ self._timer.timeout.connect(self.update_spinner)
+
+ def update_spinner(self):
+ self._spinner_step += 1
+ self._spinner_step %= len(self._spin)
+
+ self.set_label_text(
+ "label_spinner",
+ self._spin[self._spinner_step]
+ )
+
+ def end_worker(self):
+ self._worker_thread.terminate()
+ self._worker_thread.wait()
+
+ def close(self):
+ try:
+ self._timer.stop()
+ self.end_worker()
+ except Exception as e:
+ logger_exception(e)
+
+ super().close()
diff --git a/src/View/Results/translate.py b/src/View/Results/translate.py
index 5f28c7f8..a42d8638 100644
--- a/src/View/Results/translate.py
+++ b/src/View/Results/translate.py
@@ -28,6 +28,9 @@ class ResultsTranslate(MainTranslate):
super(ResultsTranslate, self).__init__()
self._dict["Results"] = _translate("Results", "Results")
+ self._dict["Reading results"] = _translate(
+ "Results", "Reading results"
+ )
self._dict['day'] = _translate("Results", "day")
self._dict['days'] = _translate("Results", "days")
diff --git a/src/View/RunSolver/Window.py b/src/View/RunSolver/Window.py
index 2e090668..87f859e1 100644
--- a/src/View/RunSolver/Window.py
+++ b/src/View/RunSolver/Window.py
@@ -44,6 +44,7 @@ from PyQt5.QtWidgets import (
)
from View.RunSolver.Log.Window import SolverLogFileWindow
+from View.Results.ReadingResultsDialog import ReadingResultsDialog
try:
from signal import SIGTERM, SIGSTOP, SIGCONT
@@ -275,14 +276,18 @@ class SolverLogWindow(PamhyrWindow):
def _update_get_results(self):
if self._results is None:
- try:
- self._results = self._solver.results(
- self._study, self._workdir, qlog=self._output
- )
- self._parent.set_results(self._solver, self._results)
- except Exception as e:
- logger.error(f"Failed to open results")
- logger_exception(e)
+ def reading_fn():
+ try:
+ self._results = self._solver.results(
+ self._study, self._workdir, qlog=self._output
+ )
+ self._parent.set_results(self._solver, self._results)
+ except Exception as e:
+ logger.error(f"Failed to open results")
+ logger_exception(e)
+
+ dlg = ReadingResultsDialog(reading_fn=reading_fn, parent=self)
+ dlg.exec_()
def _update_logs_all(self):
while self._output.qsize() != 0:
@@ -352,9 +357,13 @@ class SolverLogWindow(PamhyrWindow):
def results(self):
if self._results is None:
- self._results = self._solver.results(
- self._study, self._workdir, qlog=self._output
- )
+ def reading_fn():
+ self._results = self._solver.results(
+ self._study, self._workdir, qlog=self._output
+ )
+
+ dlg = ReadingResultsDialog(reading_fn=reading_fn, parent=self)
+ dlg.exec_()
self._parent.set_results(self._solver, self._results)
self._parent.open_solver_results(self._solver, self._results)
diff --git a/src/View/ui/DialogReadingResults.ui b/src/View/ui/DialogReadingResults.ui
new file mode 100644
index 00000000..f93ea2a6
--- /dev/null
+++ b/src/View/ui/DialogReadingResults.ui
@@ -0,0 +1,77 @@
+
+
+ Dialog
+
+
+
+ 0
+ 0
+ 205
+ 42
+
+
+
+ Dialog
+
+
+ -
+
+
-
+
+
-
+
+
+ Read results:
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ Ubuntu Mono
+ 12
+ 50
+ false
+
+
+
+ .
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+