Results: Add waiting window at results reading.

setup.py
Pierre-Antoine Rouby 2024-02-26 16:33:45 +01:00
parent 8466531916
commit 76e4f4b80e
5 changed files with 238 additions and 21 deletions

View File

@ -62,6 +62,7 @@ from View.SolverParameters.Window import SolverParametersWindow
from View.RunSolver.Window import SelectSolverWindow, SolverLogWindow from View.RunSolver.Window import SelectSolverWindow, SolverLogWindow
from View.CheckList.Window import CheckListWindow from View.CheckList.Window import CheckListWindow
from View.Results.Window import ResultsWindow from View.Results.Window import ResultsWindow
from View.Results.ReadingResultsDialog import ReadingResultsDialog
from View.Debug.Window import ReplWindow from View.Debug.Window import ReplWindow
# Optional internal display of documentation for make the application # Optional internal display of documentation for make the application
@ -966,12 +967,17 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
sol.show() sol.show()
def open_solver_results(self, solver, results=None): def open_solver_results(self, solver, results=None):
def reading_fn():
self._tmp_results = results
# If no specific results, get last results # If no specific results, get last results
if results is None: if results is None:
results = self._last_results def reading_fn():
self._tmp_results = self._last_results
if self._last_results is None: if self._last_results is None:
results = solver.results( def reading_fn():
self._tmp_results = solver.results(
self._study, self._study,
self._solver_workdir(solver), self._solver_workdir(solver),
) )
@ -982,12 +988,17 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
name = os.path.basename(results).replace(".BIN", "") name = os.path.basename(results).replace(".BIN", "")
results = solver.results( def reading_fn():
self._tmp_results = solver.results(
self._study, self._study,
os.path.dirname(results), os.path.dirname(results),
name=name name=name
) )
dlg = ReadingResultsDialog(reading_fn=reading_fn, parent=self)
dlg.exec_()
results = self._tmp_results
# No results available # No results available
if results is None: if results is None:
return return

View File

@ -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 <https://www.gnu.org/licenses/>.
# -*- 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()

View File

@ -28,6 +28,9 @@ class ResultsTranslate(MainTranslate):
super(ResultsTranslate, self).__init__() super(ResultsTranslate, self).__init__()
self._dict["Results"] = _translate("Results", "Results") self._dict["Results"] = _translate("Results", "Results")
self._dict["Reading results"] = _translate(
"Results", "Reading results"
)
self._dict['day'] = _translate("Results", "day") self._dict['day'] = _translate("Results", "day")
self._dict['days'] = _translate("Results", "days") self._dict['days'] = _translate("Results", "days")

View File

@ -44,6 +44,7 @@ from PyQt5.QtWidgets import (
) )
from View.RunSolver.Log.Window import SolverLogFileWindow from View.RunSolver.Log.Window import SolverLogFileWindow
from View.Results.ReadingResultsDialog import ReadingResultsDialog
try: try:
from signal import SIGTERM, SIGSTOP, SIGCONT from signal import SIGTERM, SIGSTOP, SIGCONT
@ -275,6 +276,7 @@ class SolverLogWindow(PamhyrWindow):
def _update_get_results(self): def _update_get_results(self):
if self._results is None: if self._results is None:
def reading_fn():
try: try:
self._results = self._solver.results( self._results = self._solver.results(
self._study, self._workdir, qlog=self._output self._study, self._workdir, qlog=self._output
@ -284,6 +286,9 @@ class SolverLogWindow(PamhyrWindow):
logger.error(f"Failed to open results") logger.error(f"Failed to open results")
logger_exception(e) logger_exception(e)
dlg = ReadingResultsDialog(reading_fn=reading_fn, parent=self)
dlg.exec_()
def _update_logs_all(self): def _update_logs_all(self):
while self._output.qsize() != 0: while self._output.qsize() != 0:
s = self._output.get() s = self._output.get()
@ -352,10 +357,14 @@ class SolverLogWindow(PamhyrWindow):
def results(self): def results(self):
if self._results is None: if self._results is None:
def reading_fn():
self._results = self._solver.results( self._results = self._solver.results(
self._study, self._workdir, qlog=self._output 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.set_results(self._solver, self._results)
self._parent.open_solver_results(self._solver, self._results) self._parent.open_solver_results(self._solver, self._results)

View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>205</width>
<height>42</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Read results:</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_spinner">
<property name="font">
<font>
<family>Ubuntu Mono</family>
<pointsize>12</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>.</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>