diff --git a/python/kontor-gui/gui/comic_window.py b/python/kontor-gui/gui/comic_window.py index 5f465d6..bf8b8d2 100644 --- a/python/kontor-gui/gui/comic_window.py +++ b/python/kontor-gui/gui/comic_window.py @@ -1,5 +1,5 @@ from PySide6.QtCore import Signal, QSortFilterProxyModel -from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QTabWidget, QMenu, QTableView, QMdiSubWindow +from PySide6.QtWidgets import QWidget, QVBoxLayout, QTabWidget, QTableView, QMdiSubWindow, QHeaderView from gui.model_config import KontorModelConfig from gui.table_model import KontorTableModel @@ -56,7 +56,8 @@ class ComicWindow(QMdiSubWindow): proxy_model = QSortFilterProxyModel() proxy_model.setSourceModel(model) table_view.setSortingEnabled(True) - #table_view.setModel(model) + header = table_view.horizontalHeader() + header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) table_view.setModel(proxy_model) layout.addLayout(table_config.get_filter_layout()) layout.addWidget(table_view) diff --git a/python/kontor-gui/gui/media_window.py b/python/kontor-gui/gui/media_window.py index 1d9455f..132a21e 100644 --- a/python/kontor-gui/gui/media_window.py +++ b/python/kontor-gui/gui/media_window.py @@ -1,5 +1,5 @@ from PySide6.QtCore import Signal, QSortFilterProxyModel -from PySide6.QtWidgets import QMdiSubWindow, QWidget, QVBoxLayout, QTabWidget, QTableView +from PySide6.QtWidgets import QMdiSubWindow, QWidget, QVBoxLayout, QTabWidget, QTableView, QHeaderView from gui.model_config import KontorModelConfig from gui.table_model import KontorTableModel @@ -57,6 +57,8 @@ class MediaWindow(QMdiSubWindow): proxy_model = QSortFilterProxyModel() proxy_model.setSourceModel(model) table_view.setSortingEnabled(True) + # header = table_view.horizontalHeader() + # header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) #table_view.setModel(model) table_view.setModel(proxy_model) layout.addLayout(table_config.get_filter_layout()) diff --git a/python/kontor-gui/gui/meta_data_window.py b/python/kontor-gui/gui/meta_data_window.py index 793fa16..49c4d73 100644 --- a/python/kontor-gui/gui/meta_data_window.py +++ b/python/kontor-gui/gui/meta_data_window.py @@ -1,5 +1,6 @@ from PySide6.QtCore import Signal, QSortFilterProxyModel -from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QTabWidget, QMenu, QTableView, QMdiSubWindow +from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QTabWidget, QMenu, QTableView, QMdiSubWindow, \ + QHeaderView from gui.model_config import KontorModelConfig from gui.table_model import KontorTableModel @@ -47,18 +48,19 @@ class MetaDataWindow(QMdiSubWindow): def generate_data_tab(self, table_name): data_tab = QWidget() - table_config = KontorModelConfig(self._main_window.kontor_db, self, table_name) model = KontorTableModel(table_config) layout = QVBoxLayout() self.data_views.append(model) data_tab.setLayout(layout) table_view = QTableView() - proxy_model = QSortFilterProxyModel() - proxy_model.setSourceModel(model) + # proxy_model = QSortFilterProxyModel() + # proxy_model.setSourceModel(model) table_view.setSortingEnabled(True) - #table_view.setModel(model) - table_view.setModel(proxy_model) + header = table_view.horizontalHeader() + header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) + # table_view.setModel(proxy_model) + table_view.setModel(model) layout.addLayout(table_config.get_filter_layout()) layout.addWidget(table_view) model.refresh() diff --git a/python/kontor-gui/gui/model_config.py b/python/kontor-gui/gui/model_config.py index 7aa05cc..1259fc3 100644 --- a/python/kontor-gui/gui/model_config.py +++ b/python/kontor-gui/gui/model_config.py @@ -1,5 +1,5 @@ from PySide6.QtWidgets import QHBoxLayout, QCheckBox, QMdiSubWindow -from kontor_schema import KontorDB +from kontor_schema import KontorDB, ColumnEntry class KontorModelConfig: @@ -29,7 +29,7 @@ class KontorModelConfig: # print(self.filter["download"].isChecked()) for column, filter_info in self.filter.items(): # print(column, filter_info) - if filter_info['widget'].isChecked(): + if filter_info[ColumnEntry.COLUMN_WIDGET].isChecked(): _filters[column] = True # print(f"{filter_rule=}") # self.log.info("filters -> %s", _filters) @@ -46,9 +46,9 @@ class KontorModelConfig: filter_layout = QHBoxLayout() for column, filter_info in self.filter.items(): filter_checkbox = QCheckBox() - filter_checkbox.setText(filter_info['label']) + filter_checkbox.setText(filter_info[ColumnEntry.COLUMN_LABEL]) filter_checkbox.checkStateChanged.connect(self.main_window.refresh) - self.filter[column]['widget'] = filter_checkbox + self.filter[column][ColumnEntry.COLUMN_WIDGET] = filter_checkbox filter_layout.addWidget(filter_checkbox) filter_layout.addStretch() # self.log.info("get_filter_layout: %s", self.filter) diff --git a/python/kontor-gui/gui/table_model.py b/python/kontor-gui/gui/table_model.py index 6c7574b..345e336 100644 --- a/python/kontor-gui/gui/table_model.py +++ b/python/kontor-gui/gui/table_model.py @@ -2,6 +2,7 @@ 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 @@ -42,8 +43,9 @@ class KontorTableModel(QAbstractTableModel): 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]['label'] + return self._config.header[col][ColumnEntry.COLUMN_LABEL] if orientation == Qt.Orientation.Vertical and role == Qt.ItemDataRole.DisplayRole: return str(col+1) @@ -52,27 +54,32 @@ class KontorTableModel(QAbstractTableModel): 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 - 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 return str(value) if role == Qt.ItemDataRole.DecorationRole: if isinstance(value, bytes): diff --git a/python/kontor-schema/kontor_schema/__init__.py b/python/kontor-schema/kontor_schema/__init__.py index 5cb8bb6..0a12a3b 100644 --- a/python/kontor-schema/kontor_schema/__init__.py +++ b/python/kontor-schema/kontor_schema/__init__.py @@ -1,6 +1,7 @@ import json import uuid from datetime import datetime +from enum import Enum from logging import Logger from pathlib import Path @@ -17,6 +18,15 @@ from .tysc import Card, CardSet, Sport, Team, FieldPosition, Rooster, Player, Ve from .media import MediaFile, MediaArticle, MediaVideo +class ColumnEntry(Enum): + COLUMN_NAME = "column" + COLUMN_LABEL = 'label' + COLUMN_ORDER = 'order' + COLUMN_REF_COLUMN = 'ref_column' + COLUMN_TYPE = "type" + COLUMN_WIDGET = 'widget' + + class KontorDB: def __init__(self, db_engine: Engine, log: Logger): @@ -81,17 +91,23 @@ class KontorDB: filter(MetaDataTable.table_name == table_name). filter(MetaDataColumn.is_shown == 1).all()): # self.log.info("get_column_meta_data: %s %s %d", column.column_name, column.column_label, column.column_order) - meta_data[order] = {'column': column.column_name, 'label': column.column_label, - 'order': column.column_order, 'ref_column': column.ref_column} + meta_data[order] = { + ColumnEntry.COLUMN_NAME: column.column_name, + ColumnEntry.COLUMN_LABEL: column.column_label, + ColumnEntry.COLUMN_ORDER: column.column_order, + ColumnEntry.COLUMN_REF_COLUMN: column.ref_column, + ColumnEntry.COLUMN_TYPE: column.column_type + } order += 1 else: for (_, column) in (session.query(MetaDataTable, MetaDataColumn). filter(MetaDataTable.id == MetaDataColumn.table_id). filter(MetaDataTable.table_name == table_name).all()): meta_data[order] = { - 'column': column.column_name, - 'order': column.column_order, - 'ref_column': column.ref_column + ColumnEntry.COLUMN_NAME: column.column_name, + ColumnEntry.COLUMN_ORDER: column.column_order, + ColumnEntry.COLUMN_REF_COLUMN: column.ref_column, + ColumnEntry.COLUMN_TYPE: column.column_type } order += 1 # self.log.info("get_column_meta_data: %s", meta_data) @@ -99,13 +115,15 @@ class KontorDB: def get_columns(self, table_name: str) -> dict: columns = {} - order = 0 __session__ = sessionmaker(self.engine) with __session__() as session: for (_, column) in (session.query(MetaDataTable, MetaDataColumn). filter(MetaDataTable.id == MetaDataColumn.table_id). filter(MetaDataTable.table_name == table_name).all()): - columns[column.column_name] = {"order": column.column_order, "type": column.column_type} + columns[column.column_name] = { + ColumnEntry.COLUMN_ORDER: column.column_order, + ColumnEntry.COLUMN_TYPE: column.column_type + } return columns def get_filters(self, table_name: str) -> dict: @@ -116,7 +134,10 @@ class KontorDB: filter(MetaDataTable.id == MetaDataColumn.table_id). filter(MetaDataTable.table_name == table_name). filter(MetaDataColumn.show_filter == 1).all()): - _filter_map[column.column_name] = {'label': column.filter_label, 'widget': None} + _filter_map[column.column_name] = { + ColumnEntry.COLUMN_LABEL: column.filter_label, + ColumnEntry.COLUMN_WIDGET: None + } return _filter_map def data(self, table_name: str, columns: dict, filters: dict) -> list: @@ -133,8 +154,8 @@ class KontorDB: # self.log.info("data: %s", entry) row = [] for order in columns.keys(): - column_name = columns[order]['column'] - ref_column = columns[order]['ref_column'] + column_name = columns[order][ColumnEntry.COLUMN_NAME] + ref_column = columns[order][ColumnEntry.COLUMN_REF_COLUMN] if str(column_name).endswith("_id"): ref_table = column_name[:-3] ref = getattr(entry, ref_table) @@ -166,7 +187,7 @@ class KontorDB: entry = {} for order in columns: # print(columns[order]) - column_name = columns[order]['column'] + column_name = columns[order][ColumnEntry.COLUMN_NAME] # print(f"get value {column_name} from {row} of table {table}") try: value = getattr(row, column_name)