Table.py 3.25 KiB
# Table.py -- Pamhyr
# Copyright (C) 2023  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
import traceback

from tools import timer, trace

from PyQt5.QtGui import (
    QKeySequence, QColor
)
from PyQt5.QtCore import (
    Qt, QAbstractTableModel, QModelIndex,
    QVariant, pyqtSlot, QCoreApplication,
)
from PyQt5.QtWidgets import (
    QMessageBox, QUndoCommand, QUndoStack,
    QStyledItemDelegate, QLineEdit, QAbstractItemView,
    QComboBox,
)

from View.Results.translate import *

logger = logging.getLogger()

_translate = QCoreApplication.translate


class TableModel(QAbstractTableModel):
    def __init__(self, results = None, study = None, mode = None, undo=None):
        super(QAbstractTableModel, self).__init__()

        self._results = results
        self._study = study
        self._mode = mode
        self._undo_stack = undo

        self._table_headers = table_headers_reach
        if mode != "reach":
            self._table_headers = table_headers_profile

        self._headers = list(self._table_headers.keys())

        self._selected = 0
        self._timestamp = 0

    def rowCount(self, parent=QModelIndex()):
        if self._mode == "reach":
            return len(self._results.river.reachs)

        current_reach = self._results.river.reach(self._selected)
        return len(current_reach.profiles)

    def columnCount(self, parent=QModelIndex()):
        return len(self._headers)

    def data(self, index, role=Qt.DisplayRole):
        if role != Qt.ItemDataRole.DisplayRole:
            return QVariant()

        row = index.row()
        column = index.column()

        if self._mode == "reach":
            if self._headers[column] == "name":
                v = self._results.river.reach(row).name
                return str(v)
        else:
            current_reach = self._results.river.reach(self._selected)
            if self._headers[column] == "name":
                v = current_reach.profile(row).name
                return str(v)
            elif self._headers[column] == "kp":
                v = current_reach.profile(row).kp
                return f"{v:.4f}"

        return QVariant()

    def headerData(self, section, orientation, role=Qt.DisplayRole):
        if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal:
            return self._table_headers[self._headers[section]]

        return QVariant()

    def index(self, row, column, parent=QModelIndex()):
        if not self.hasIndex(row, column, parent):
            return QModelIndex()

        return self.createIndex(row, column, QModelIndex())

    def flags(self, index):
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable