120 lines
4.7 KiB
Python
120 lines
4.7 KiB
Python
from datetime import datetime
|
|
|
|
from PySide6.QtCore import QAbstractTableModel, QModelIndex
|
|
from PySide6.QtGui import Qt
|
|
from kontor_schema import ColumnEntry
|
|
|
|
from .model_config import KontorModelConfig
|
|
|
|
|
|
class KontorTableModel(QAbstractTableModel):
|
|
|
|
def __init__(self, model_config: KontorModelConfig):
|
|
super().__init__()
|
|
self._main_window = model_config.main_window
|
|
self._config = model_config
|
|
self._data = []
|
|
self.log = model_config.log
|
|
|
|
def __str__(self):
|
|
return f"KontorTableModel({self._config})"
|
|
|
|
def refresh(self):
|
|
# self.log.info("refresh")
|
|
data = self._config.get_data()
|
|
count = 0
|
|
# print(data)
|
|
if data is not None:
|
|
self.beginResetModel()
|
|
self._data.clear()
|
|
self._data = data
|
|
self.endResetModel()
|
|
count = len(data)
|
|
# print(data)
|
|
# print(self._data)
|
|
self.layoutChanged.emit()
|
|
self._main_window.update_status(f"{count} Einträge geladen")
|
|
|
|
def rowCount(self, parent=QModelIndex()):
|
|
# self.log.info("rowCount %s: %d", self, len(self._data))
|
|
# The length of the outer list.
|
|
if self._data is None:
|
|
return 0
|
|
return len(self._data)
|
|
|
|
def headerData(self, col, orientation, role=Qt.ItemDataRole.DisplayRole):
|
|
# self.log.info(f"{self._config.header[col]}")
|
|
if orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole:
|
|
return self._config.header[col][ColumnEntry.COLUMN_LABEL]
|
|
if orientation == Qt.Orientation.Vertical and role == Qt.ItemDataRole.DisplayRole:
|
|
return str(col+1)
|
|
|
|
def data(self, index, role=Qt.ItemDataRole.DisplayRole):
|
|
if self._data is None:
|
|
return None
|
|
value = self._data[index.row()][index.column()]
|
|
# print('{}:: {}:: {}: {}'.format(index, role, value, type(value)))
|
|
row = index.row()
|
|
column = index.column()
|
|
column_type = self._config.header[column][ColumnEntry.COLUMN_TYPE]
|
|
# self.log.info(f"{row}-{column}: {column_type}")
|
|
if role == Qt.ItemDataRole.DisplayRole or role == Qt.ItemDataRole.EditRole:
|
|
if column_type == "BOOLEAN":
|
|
if isinstance(value, bytes):
|
|
if value == b'\x01':
|
|
return self._config.main_window.tick
|
|
else:
|
|
return self._config.main_window.cross
|
|
if isinstance(value, int):
|
|
# print('{}:: {}: {}'.format(index, value, type(value)))
|
|
if value == 1:
|
|
return self._config.main_window.tick
|
|
else:
|
|
return self._config.main_window.cross
|
|
if isinstance(value, bool):
|
|
if value:
|
|
return self._config.main_window.tick
|
|
else:
|
|
return self._config.main_window.cross
|
|
if isinstance(value, datetime):
|
|
return value.strftime("%Y-%m-%d %M:%M:%S")
|
|
if isinstance(value, str):
|
|
return value
|
|
return str(value)
|
|
if role == Qt.ItemDataRole.DecorationRole:
|
|
if isinstance(value, bytes):
|
|
if value == b'\x01':
|
|
return self._config.main_window.tick
|
|
else:
|
|
return self._config.main_window.cross
|
|
if isinstance(value, int):
|
|
if value == 1:
|
|
return self._config.main_window.tick
|
|
else:
|
|
return self._config.main_window.cross
|
|
if isinstance(value, bool):
|
|
if value:
|
|
return self._config.main_window.tick
|
|
else:
|
|
return self._config.main_window.cross
|
|
|
|
def columnCount(self, index=QModelIndex()):
|
|
# self.log.info("rowCount %s: %d", self, len(self._config.header))
|
|
return len(self._config.header)
|
|
|
|
def setData(self, index, value, role: int) -> bool:
|
|
# print(index, role)
|
|
if role == Qt.ItemDataRole.EditRole:
|
|
self._data[index.row()][index.column()] = value
|
|
# print(self._data[index.row()][index.column()])
|
|
self.dataChanged.emit(index, index)
|
|
return True
|
|
if role == Qt.ItemDataRole.CheckStateRole:
|
|
# print("role == Qt.ItemDataRole.CheckStateRole")
|
|
checked = value == Qt.CheckState.Checked
|
|
self._data[index.row()][index.column()] = checked
|
|
return False
|
|
|
|
def flags(self, index):
|
|
return Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsEditable | Qt.ItemFlag.ItemIsUserTristate
|