Commit 48c799c0 authored by Pierre-Antoine Rouby's avatar Pierre-Antoine Rouby
Browse files

CheckList: Switch to QThread and add dummy checker.

Showing with 141 additions and 34 deletions
+141 -34
...@@ -34,3 +34,41 @@ class StudyNetworkReachChecker(AbstractModelChecker): ...@@ -34,3 +34,41 @@ class StudyNetworkReachChecker(AbstractModelChecker):
self._summary = "ok" self._summary = "ok"
self._status = STATUS.OK self._status = STATUS.OK
return True return True
class DummyOK(AbstractModelChecker):
def __init__(self):
super(DummyOK, self).__init__()
self._name = _translate("Checker", "Dummy ok")
self._description = _translate("Checker", "Dummy ok")
def run(self, study):
self._summary = "ok"
self._status = STATUS.OK
return True
class DummyWARNING(AbstractModelChecker):
def __init__(self):
super(DummyWARNING, self).__init__()
self._name = _translate("Checker", "Dummy warning")
self._description = _translate("Checker", "Dummy warning")
def run(self, study):
self._summary = "Warning detected"
self._status = STATUS.WARNING
return True
class DummyERROR(AbstractModelChecker):
def __init__(self):
super(DummyERROR, self).__init__()
self._name = _translate("Checker", "Dummy error")
self._description = _translate("Checker", "Dummy error")
def run(self, study):
self._summary = "Error detected"
self._status = STATUS.ERROR
return True
...@@ -36,6 +36,9 @@ class Study(Serializable): ...@@ -36,6 +36,9 @@ class Study(Serializable):
def checkers(cls): def checkers(cls):
lst = [ lst = [
StudyNetworkReachChecker(), StudyNetworkReachChecker(),
DummyOK(),
DummyWARNING(),
DummyERROR(),
] ]
return lst return lst
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import time
import threading
from tools import trace, timer from tools import trace, timer
from View.ASubWindow import ASubMainWindow from View.ASubWindow import ASubMainWindow
...@@ -14,8 +11,8 @@ from PyQt5.QtGui import ( ...@@ -14,8 +11,8 @@ from PyQt5.QtGui import (
from PyQt5.QtCore import ( from PyQt5.QtCore import (
Qt, QVariant, QAbstractTableModel, Qt, QVariant, QAbstractTableModel,
QCoreApplication, QModelIndex, pyqtSlot, QCoreApplication, QModelIndex, QRect, QThread,
QRect, pyqtSlot, pyqtSignal,
) )
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
...@@ -23,22 +20,18 @@ from PyQt5.QtWidgets import ( ...@@ -23,22 +20,18 @@ from PyQt5.QtWidgets import (
QFileDialog, QTableView, QAbstractItemView, QFileDialog, QTableView, QAbstractItemView,
QUndoStack, QShortcut, QAction, QItemDelegate, QUndoStack, QShortcut, QAction, QItemDelegate,
QComboBox, QVBoxLayout, QHeaderView, QTabWidget, QComboBox, QVBoxLayout, QHeaderView, QTabWidget,
QProgressBar, QProgressBar, QLabel,
) )
from View.CheckList.Table import TableModel from View.CheckList.Table import TableModel
from View.CheckList.Worker import Worker
_translate = QCoreApplication.translate _translate = QCoreApplication.translate
def _run_checker_list(study, checker_list, parent):
parent.start_compute()
for checker in checker_list:
time.sleep(1)
checker.run(study)
parent.progress()
parent.end_compute()
class CheckListWindow(ASubMainWindow, ListedSubWindow): class CheckListWindow(ASubMainWindow, ListedSubWindow):
signalStatus = pyqtSignal(str)
def __init__(self, title="Check list", def __init__(self, title="Check list",
study=None, config=None, study=None, config=None,
solver=None, parent=None): solver=None, parent=None):
...@@ -61,6 +54,7 @@ class CheckListWindow(ASubMainWindow, ListedSubWindow): ...@@ -61,6 +54,7 @@ class CheckListWindow(ASubMainWindow, ListedSubWindow):
self.setup_progress_bar() self.setup_progress_bar()
self.setup_connections() self.setup_connections()
self.setup_thread() self.setup_thread()
self.setup_statusbar()
def setup_table(self): def setup_table(self):
table = self.find(QTableView, f"tableView") table = self.find(QTableView, f"tableView")
...@@ -87,44 +81,86 @@ class CheckListWindow(ASubMainWindow, ListedSubWindow): ...@@ -87,44 +81,86 @@ class CheckListWindow(ASubMainWindow, ListedSubWindow):
self.find(QPushButton, "pushButton_cancel").clicked.connect(self.reject) self.find(QPushButton, "pushButton_cancel").clicked.connect(self.reject)
def setup_thread(self): def setup_thread(self):
self._t1 = threading.Thread( self._worker = Worker(self._study, self._checker_list)
target=_run_checker_list, self._worker_thread = QThread()
args=(self._study, self._checker_list, self,) self._worker.moveToThread(self._worker_thread)
)
self._t1.start() # Connect any worker signals
self._worker.signalStatus.connect(self.update)
self._worker_thread.started.connect(self._worker.process)
self._worker_thread.start()
def retry(self):
self._worker_thread.terminate()
self._worker_thread.wait()
self.find(QPushButton, "pushButton_retry").setEnabled(False)
self.find(QPushButton, "pushButton_ok").setEnabled(False)
self.setup_thread()
def _compute_status(self):
ok = len(list(filter(lambda c: c.is_ok(), self._checker_list)))
warning = len(list(filter(lambda c: c.is_warning(), self._checker_list)))
error = len(list(filter(lambda c: c.is_error(), self._checker_list)))
return ok, warning, error
def _compute_status_label(self):
ok, warning, error = self._compute_status()
return (f"<font color=\"Green\">Ok: {ok} </font> |" +
f"<font color=\"Yellow\">Warning: {warning} </font> |" +
f"<font color=\"Red\">Error: {error}</font>")
def setup_statusbar(self):
txt = self._compute_status_label()
self._status_label = QLabel(txt)
self.statusbar.addPermanentWidget(self._status_label)
def update_statusbar(self):
txt = self._compute_status_label()
self._status_label.setText(txt)
def progress(self): def progress(self):
self._p += 1 self._p += 1
self._progress.setValue(self._p) self._progress.setValue(self._p)
# self._table.update() self._table.update()
def start_compute(self): def start_compute(self):
self._p = 0 self._p = 0
self._progress.setValue(self._p) self._progress.setValue(self._p)
def info_compute(self, str):
self.statusbar.showMessage(str, 3000)
def end_compute(self): def end_compute(self):
self._table.layoutChanged.emit() self._table.layoutChanged.emit()
self.find(QPushButton, "pushButton_retry").setEnabled(True) self.find(QPushButton, "pushButton_retry").setEnabled(True)
errors = list(filter(lambda c: c.is_error(), self._checker_list)) errors = any(filter(lambda c: c.is_error(), self._checker_list))
if len(errors) == 0: if errors:
self.find(QPushButton, "pushButton_ok").setEnabled(True) self.find(QPushButton, "pushButton_ok").setEnabled(True)
def end(self): self.update_statusbar()
# self._t1.join()
self.close()
def retry(self): def update(self, key:str):
self._t1.join() if key == "start":
self._t1 = threading.Thread( self.start_compute()
target=_run_checker_list, self.info_compute("Starting ...")
args=(self._study, self._checker_list, self,) elif key == "end":
) self.info_compute("Finish")
self.end_compute()
elif key == "progress":
self.progress()
else:
self.info_compute(key)
self.find(QPushButton, "pushButton_retry").setEnabled(False) self.update_statusbar()
self.find(QPushButton, "pushButton_ok").setEnabled(False)
self._t1.start() def end(self):
# self._worker.join()b
self.close()
def reject(self): def reject(self):
print("cancel") print("cancel")
......
# -*- coding: utf-8 -*-
import time
from PyQt5.QtCore import (
Qt, QObject, pyqtSlot, pyqtSignal
)
class Worker(QObject):
signalStatus = pyqtSignal(str)
def __init__(self, study, checker_list, parent=None):
super(self.__class__, self).__init__(parent)
self._study = study
self._checker_list = checker_list
def process(self):
self.signalStatus.emit('start')
self._compute()
self.signalStatus.emit('end')
def _compute(self):
for checker in self._checker_list:
self.signalStatus.emit(checker.name)
time.sleep(1)
checker.run(self._study)
self.signalStatus.emit("progress")
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment