# -*- coding: utf-8 -*- import time import threading from tools import trace, timer from View.ASubWindow import ASubMainWindow from View.ListedSubWindow import ListedSubWindow from PyQt5.QtGui import ( QKeySequence, ) from PyQt5.QtCore import ( Qt, QVariant, QAbstractTableModel, QCoreApplication, QModelIndex, pyqtSlot, QRect, ) from PyQt5.QtWidgets import ( QDialogButtonBox, QPushButton, QLineEdit, QFileDialog, QTableView, QAbstractItemView, QUndoStack, QShortcut, QAction, QItemDelegate, QComboBox, QVBoxLayout, QHeaderView, QTabWidget, QProgressBar, ) from View.CheckList.Table import TableModel _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): def __init__(self, title="Check list", study=None, config=None, solver=None, parent=None): self._title = title + " - " + study.name self._study = study self._config = config self._solver = solver super(CheckListWindow, self).__init__( name=self._title, ui="CheckList", parent=parent ) self.ui.setWindowTitle(self._title) self._checker_list = ( self._study.checkers() + self._solver.checkers() ) self.setup_table() self.setup_progress_bar() self.setup_connections() self.setup_thread() def setup_table(self): table = self.find(QTableView, f"tableView") self._table = TableModel( data = self._checker_list, ) table.setModel(self._table) table.setSelectionBehavior(QAbstractItemView.SelectRows) table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) table.setAlternatingRowColors(True) def setup_progress_bar(self): self._progress = self.find(QProgressBar, f"progressBar") self._p = 0 # Progress current step self._progress.setRange(0, len(self._checker_list)) self._progress.setValue(self._p) def setup_connections(self): self.find(QPushButton, "pushButton_ok").clicked.connect(self.accept) self.find(QPushButton, "pushButton_retry").clicked.connect(self.retry) self.find(QPushButton, "pushButton_cancel").clicked.connect(self.reject) def setup_thread(self): self._t1 = threading.Thread( target=_run_checker_list, args=(self._study, self._checker_list, self,) ) self._t1.start() def progress(self): self._p += 1 self._progress.setValue(self._p) # self._table.update() def start_compute(self): self._p = 0 self._progress.setValue(self._p) def end_compute(self): self._table.layoutChanged.emit() self.find(QPushButton, "pushButton_retry").setEnabled(True) errors = list(filter(lambda c: c.is_error(), self._checker_list)) if len(errors) == 0: self.find(QPushButton, "pushButton_ok").setEnabled(True) def end(self): # self._t1.join() self.close() def retry(self): self._t1.join() self._t1 = threading.Thread( target=_run_checker_list, args=(self._study, self._checker_list, self,) ) self.find(QPushButton, "pushButton_retry").setEnabled(False) self.find(QPushButton, "pushButton_ok").setEnabled(False) self._t1.start() def reject(self): print("cancel") self.end() def accept(self): print("ok") self.end()