refactor project by using enums for recurring strings

This commit is contained in:
Thomas Peetz
2025-02-06 16:33:15 +01:00
parent 7dc18b10cb
commit ed0e108599
6 changed files with 62 additions and 63 deletions
+4 -3
View File
@@ -1,5 +1,6 @@
from PySide6.QtCore import Signal, QSortFilterProxyModel from PySide6.QtCore import Signal, QSortFilterProxyModel
from PySide6.QtWidgets import QWidget, QVBoxLayout, QTabWidget, QTableView, QMdiSubWindow, QHeaderView from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QTabWidget, QMenu, QTableView, QMdiSubWindow, \
QHeaderView
from gui.model_config import KontorModelConfig from gui.model_config import KontorModelConfig
from gui.table_model import KontorTableModel from gui.table_model import KontorTableModel
@@ -53,11 +54,11 @@ class ComicWindow(QMdiSubWindow):
self.data_views.append(model) self.data_views.append(model)
data_tab.setLayout(layout) data_tab.setLayout(layout)
table_view = QTableView() table_view = QTableView()
header = table_view.horizontalHeader()
header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
proxy_model = QSortFilterProxyModel() proxy_model = QSortFilterProxyModel()
proxy_model.setSourceModel(model) proxy_model.setSourceModel(model)
table_view.setSortingEnabled(True) table_view.setSortingEnabled(True)
header = table_view.horizontalHeader()
header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
table_view.setModel(proxy_model) table_view.setModel(proxy_model)
layout.addLayout(table_config.get_filter_layout()) layout.addLayout(table_config.get_filter_layout())
layout.addWidget(table_view) layout.addWidget(table_view)
+1 -3
View File
@@ -57,11 +57,9 @@ class MediaWindow(QMdiSubWindow):
proxy_model = QSortFilterProxyModel() proxy_model = QSortFilterProxyModel()
proxy_model.setSourceModel(model) proxy_model.setSourceModel(model)
table_view.setSortingEnabled(True) table_view.setSortingEnabled(True)
# header = table_view.horizontalHeader()
# header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
#table_view.setModel(model)
table_view.setModel(proxy_model) table_view.setModel(proxy_model)
layout.addLayout(table_config.get_filter_layout()) layout.addLayout(table_config.get_filter_layout())
layout.addWidget(table_view) layout.addWidget(table_view)
model.refresh() model.refresh()
table_view.resizeColumnToContents(0)
return data_tab return data_tab
+4 -4
View File
@@ -57,11 +57,11 @@ class MetaDataWindow(QMdiSubWindow):
# proxy_model = QSortFilterProxyModel() # proxy_model = QSortFilterProxyModel()
# proxy_model.setSourceModel(model) # proxy_model.setSourceModel(model)
table_view.setSortingEnabled(True) table_view.setSortingEnabled(True)
header = table_view.horizontalHeader() # header = table_view.horizontalHeader()
header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) # header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
# table_view.setModel(proxy_model) table_view.setModel(proxy_model)
table_view.setModel(model)
layout.addLayout(table_config.get_filter_layout()) layout.addLayout(table_config.get_filter_layout())
layout.addWidget(table_view) layout.addWidget(table_view)
model.refresh() model.refresh()
table_view.resizeColumnToContents(0)
return data_tab return data_tab
+1 -2
View File
@@ -1,6 +1,5 @@
from PySide6.QtWidgets import QHBoxLayout, QCheckBox, QMdiSubWindow from PySide6.QtWidgets import QHBoxLayout, QCheckBox, QMdiSubWindow
from kontor_schema import KontorDB from kontor_schema import KontorDB, ColumnEntry
from kontor_schema.database import ColumnEntry
class KontorModelConfig: class KontorModelConfig:
+50 -49
View File
@@ -1,12 +1,45 @@
from datetime import datetime from datetime import datetime
from typing import Any
from PySide6.QtCore import QAbstractTableModel, QModelIndex from PySide6.QtCore import QAbstractTableModel, QModelIndex
from PySide6.QtGui import Qt from PySide6.QtGui import Qt, QColor
from kontor_schema.database import ColumnEntry from kontor_schema.database import ColumnEntry
from .model_config import KontorModelConfig from .model_config import KontorModelConfig
def get_display_value(value: Any, column_config: dict, window) -> str:
if isinstance(value, datetime):
return value.strftime("%Y-%m-%d %M:%M:%S")
if column_config[ColumnEntry.COLUMN_TYPE] == 'BOOLEAN':
if value == 1:
return window.tick
else:
return window.cross
if value is None:
return ""
# window.log.info(f"unknown type: {column_config[ColumnEntry.COLUMN_TYPE]} - {type(value)}")
return str(value)
def get_edit_value(value, column_config, window):
# window.log.info(f"edit value {value}")
return str(value)
def get_decoration_value(value: Any, column_config: dict, window):
if column_config[ColumnEntry.COLUMN_TYPE] == 'BOOLEAN':
if value == 1:
return window.tick
else:
return window.cross
def get_background_value(value: Any, column_config: dict, window):
if value is None:
return QColor('lightgrey')
class KontorTableModel(QAbstractTableModel): class KontorTableModel(QAbstractTableModel):
def __init__(self, model_config: KontorModelConfig): def __init__(self, model_config: KontorModelConfig):
@@ -53,67 +86,35 @@ class KontorTableModel(QAbstractTableModel):
if self._data is None: if self._data is None:
return None return None
value = self._data[index.row()][index.column()] value = self._data[index.row()][index.column()]
# print('{}:: {}:: {}: {}'.format(index, role, value, type(value))) # print('{}:: {}:: {}:: {}: {}'.format(index, role, self._config.header[index.column()][ColumnEntry.COLUMN_TYPE], value, type(value)))
row = index.row() match role:
column = index.column() case Qt.ItemDataRole.DisplayRole:
column_type = self._config.header[column][ColumnEntry.COLUMN_TYPE] return get_display_value(value, self._config.header[index.column()], self._config.main_window)
# self.log.info(f"{row}-{column}: {column_type}") case Qt.ItemDataRole.EditRole:
if role == Qt.ItemDataRole.DisplayRole or role == Qt.ItemDataRole.EditRole: return get_edit_value(value, self._config.header[index.column()], self._config.main_window)
if column_type == "BOOLEAN": case Qt.ItemDataRole.DecorationRole:
if isinstance(value, bytes): return get_decoration_value(value, self._config.header[index.column()], self._config.main_window)
if value == b'\x01': case Qt.ItemDataRole.BackgroundRole:
return self._config.main_window.tick return get_background_value(value, self._config.header[index.column()], self._config.main_window)
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()): def columnCount(self, index=QModelIndex()):
# self.log.info("rowCount %s: %d", self, len(self._config.header)) # self.log.info("rowCount %s: %d", self, len(self._config.header))
return len(self._config.header) return len(self._config.header)
def setData(self, index, value, role: int) -> bool: def setData(self, index, value, role=Qt.ItemDataRole.EditRole) -> bool:
# print(index, role) # self._config.log.info(f"{index}: {role}")
if role == Qt.ItemDataRole.EditRole: if role == Qt.ItemDataRole.EditRole:
self._data[index.row()][index.column()] = value self._data[index.row()][index.column()] = value
# print(self._data[index.row()][index.column()]) # self._config.log.info(f"{index.row()}-{index.column()}: {self._data[index.row()][index.column()]}")
self.dataChanged.emit(index, index) self.dataChanged.emit(index, index)
return True return True
if role == Qt.ItemDataRole.CheckStateRole: if role == Qt.ItemDataRole.CheckStateRole:
# print("role == Qt.ItemDataRole.CheckStateRole") print("role == Qt.ItemDataRole.CheckStateRole")
checked = value == Qt.CheckState.Checked checked = value == Qt.CheckState.Checked
self._data[index.row()][index.column()] = checked self._data[index.row()][index.column()] = checked
return False return False
def flags(self, index): def flags(self, index):
if self._config.header[index.column()][ColumnEntry.COLUMN_NAME] == 'id':
return Qt.ItemFlag.ItemIsEnabled
return Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsEditable | Qt.ItemFlag.ItemIsUserTristate return Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsEditable | Qt.ItemFlag.ItemIsUserTristate
@@ -7,4 +7,4 @@ from .metadata import MetaDataTable, MetaDataColumn
from .tysc import Card, CardSet, Sport, Team, FieldPosition, Rooster, Player, Vendor from .tysc import Card, CardSet, Sport, Team, FieldPosition, Rooster, Player, Vendor
from .media import MediaFile, MediaArticle, MediaVideo from .media import MediaFile, MediaArticle, MediaVideo
from .base import Base from .base import Base
from .database import KontorDB from .database import KontorDB, ColumnEntry