Pamhyr2/src/View/CheckList/Table.py

165 lines
4.4 KiB
Python

# Table.py -- Pamhyr
# Copyright (C) 2023-2025 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 functools import reduce
from tools import trace, timer
from PyQt5.QtCore import (
Qt, QVariant, QAbstractTableModel,
QCoreApplication, QModelIndex, pyqtSlot,
QRect,
)
from PyQt5.QtGui import (
QColor, QBrush,
)
from PyQt5.QtWidgets import (
QDialogButtonBox, QPushButton, QLineEdit,
QFileDialog, QTableView, QAbstractItemView,
QUndoStack, QShortcut, QAction, QItemDelegate,
QComboBox,
)
from Modules import Modules
from Checker.Checker import STATUS
from View.Tools.PamhyrTable import PamhyrTableModel
logger = logging.getLogger()
class TableModel(PamhyrTableModel):
def data(self, index, role):
row = index.row()
column = index.column()
if role == Qt.ForegroundRole:
if self._headers[column] == "status":
color = Qt.gray
if self._data[row].is_ok():
color = Qt.green
elif self._data[row].is_warning():
color = QColor("orange")
elif self._data[row].is_error():
color = Qt.red
return QBrush(color)
return QVariant()
if role != Qt.ItemDataRole.DisplayRole:
return QVariant()
if self._headers[column] == "name":
return self._data[row].name
if self._headers[column] == "status":
return self._data[row].summary
return QVariant()
class TabTableModel(PamhyrTableModel):
def _setup_lst(self):
self._lst = self._opt_data
def data(self, index, role):
row = index.row()
column = index.column()
if role == Qt.ForegroundRole:
if self._headers[column] == "type":
return QVariant()
color = Qt.gray
status, _ = self.compute_status(row, column)
if status is STATUS.OK:
color = Qt.green
elif status is STATUS.WARNING:
color = QColor("orange")
elif status is STATUS.ERROR:
color = Qt.red
return QBrush(color)
if role == Qt.ItemDataRole.DisplayRole:
if self._headers[column] == "type":
return self.module_display_name(self._opt_data[row])
value = "UNKNOWN"
status, _ = self.compute_status(row, column)
if status is STATUS.OK:
value = "OK"
elif status is STATUS.WARNING:
value = "WARNING"
elif status is STATUS.ERROR:
value = "ERROR"
return value
return QVariant()
def module_display_name(self, module):
return Modules.modelling_display_name()[module]
def get_checkers(self, row, column):
module = self._opt_data[row]
solver = self._headers[column]
checkers = filter(
lambda checker: checker._modules is module,
filter(
lambda checker: checker._solver is solver,
self._data
)
)
return checkers
def get_checkers_from_indexes(self, indexes):
lst = []
for index in indexes:
row = index.row()
column = index.column()
lst += list(self.get_checkers(row, column))
return lst
def compute_status(self, row, column):
checkers = self.get_checkers(row, column)
checkers_status = list(
map(
lambda c: c._status,
checkers
)
)
status = STATUS.UNKNOWN
if len(checkers_status) > 0:
status = reduce(lambda acc, c: acc | c, checkers_status)
logger.debug(f"Checkers: {row}, {column}: {checkers_status} {status}")
return status, checkers_status