Table sortable #55

Merged
tpeetz merged 3 commits from table_sortable into develop/0.1.0 2025-02-06 15:59:29 +00:00
6 changed files with 74 additions and 41 deletions
Showing only changes of commit 71ecfaff1f - Show all commits
+3 -2
View File
@@ -1,5 +1,5 @@
from PySide6.QtCore import Signal, QSortFilterProxyModel 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.model_config import KontorModelConfig
from gui.table_model import KontorTableModel from gui.table_model import KontorTableModel
@@ -56,7 +56,8 @@ class ComicWindow(QMdiSubWindow):
proxy_model = QSortFilterProxyModel() proxy_model = QSortFilterProxyModel()
proxy_model.setSourceModel(model) proxy_model.setSourceModel(model)
table_view.setSortingEnabled(True) table_view.setSortingEnabled(True)
#table_view.setModel(model) 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)
+3 -1
View File
@@ -1,5 +1,5 @@
from PySide6.QtCore import Signal, QSortFilterProxyModel 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.model_config import KontorModelConfig
from gui.table_model import KontorTableModel from gui.table_model import KontorTableModel
@@ -57,6 +57,8 @@ 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(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())
+8 -6
View File
@@ -1,5 +1,6 @@
from PySide6.QtCore import Signal, QSortFilterProxyModel 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.model_config import KontorModelConfig
from gui.table_model import KontorTableModel from gui.table_model import KontorTableModel
@@ -47,18 +48,19 @@ class MetaDataWindow(QMdiSubWindow):
def generate_data_tab(self, table_name): def generate_data_tab(self, table_name):
data_tab = QWidget() data_tab = QWidget()
table_config = KontorModelConfig(self._main_window.kontor_db, self, table_name) table_config = KontorModelConfig(self._main_window.kontor_db, self, table_name)
model = KontorTableModel(table_config) model = KontorTableModel(table_config)
layout = QVBoxLayout() layout = QVBoxLayout()
self.data_views.append(model) self.data_views.append(model)
data_tab.setLayout(layout) data_tab.setLayout(layout)
table_view = QTableView() table_view = QTableView()
proxy_model = QSortFilterProxyModel() # proxy_model = QSortFilterProxyModel()
proxy_model.setSourceModel(model) # proxy_model.setSourceModel(model)
table_view.setSortingEnabled(True) table_view.setSortingEnabled(True)
#table_view.setModel(model) header = table_view.horizontalHeader()
table_view.setModel(proxy_model) header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
# 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()
+4 -4
View File
@@ -1,5 +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
class KontorModelConfig: class KontorModelConfig:
@@ -29,7 +29,7 @@ class KontorModelConfig:
# print(self.filter["download"].isChecked()) # print(self.filter["download"].isChecked())
for column, filter_info in self.filter.items(): for column, filter_info in self.filter.items():
# print(column, filter_info) # print(column, filter_info)
if filter_info['widget'].isChecked(): if filter_info[ColumnEntry.COLUMN_WIDGET].isChecked():
_filters[column] = True _filters[column] = True
# print(f"{filter_rule=}") # print(f"{filter_rule=}")
# self.log.info("filters -> %s", _filters) # self.log.info("filters -> %s", _filters)
@@ -46,9 +46,9 @@ class KontorModelConfig:
filter_layout = QHBoxLayout() filter_layout = QHBoxLayout()
for column, filter_info in self.filter.items(): for column, filter_info in self.filter.items():
filter_checkbox = QCheckBox() 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) 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.addWidget(filter_checkbox)
filter_layout.addStretch() filter_layout.addStretch()
# self.log.info("get_filter_layout: %s", self.filter) # self.log.info("get_filter_layout: %s", self.filter)
+12 -5
View File
@@ -2,6 +2,7 @@ from datetime import datetime
from PySide6.QtCore import QAbstractTableModel, QModelIndex from PySide6.QtCore import QAbstractTableModel, QModelIndex
from PySide6.QtGui import Qt from PySide6.QtGui import Qt
from kontor_schema import ColumnEntry
from .model_config import KontorModelConfig from .model_config import KontorModelConfig
@@ -42,8 +43,9 @@ class KontorTableModel(QAbstractTableModel):
return len(self._data) return len(self._data)
def headerData(self, col, orientation, role=Qt.ItemDataRole.DisplayRole): 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: 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: if orientation == Qt.Orientation.Vertical and role == Qt.ItemDataRole.DisplayRole:
return str(col+1) return str(col+1)
@@ -52,11 +54,12 @@ class KontorTableModel(QAbstractTableModel):
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, 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 role == Qt.ItemDataRole.DisplayRole or role == Qt.ItemDataRole.EditRole:
if isinstance(value, datetime): if column_type == "BOOLEAN":
return value.strftime("%Y-%m-%d %M:%M:%S")
if isinstance(value, str):
return value
if isinstance(value, bytes): if isinstance(value, bytes):
if value == b'\x01': if value == b'\x01':
return self._config.main_window.tick return self._config.main_window.tick
@@ -73,6 +76,10 @@ class KontorTableModel(QAbstractTableModel):
return self._config.main_window.tick return self._config.main_window.tick
else: else:
return self._config.main_window.cross 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) return str(value)
if role == Qt.ItemDataRole.DecorationRole: if role == Qt.ItemDataRole.DecorationRole:
if isinstance(value, bytes): if isinstance(value, bytes):
+32 -11
View File
@@ -1,6 +1,7 @@
import json import json
import uuid import uuid
from datetime import datetime from datetime import datetime
from enum import Enum
from logging import Logger from logging import Logger
from pathlib import Path 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 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: class KontorDB:
def __init__(self, db_engine: Engine, log: Logger): def __init__(self, db_engine: Engine, log: Logger):
@@ -81,17 +91,23 @@ class KontorDB:
filter(MetaDataTable.table_name == table_name). filter(MetaDataTable.table_name == table_name).
filter(MetaDataColumn.is_shown == 1).all()): 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) # 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, meta_data[order] = {
'order': column.column_order, 'ref_column': column.ref_column} 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 order += 1
else: else:
for (_, column) in (session.query(MetaDataTable, MetaDataColumn). for (_, column) in (session.query(MetaDataTable, MetaDataColumn).
filter(MetaDataTable.id == MetaDataColumn.table_id). filter(MetaDataTable.id == MetaDataColumn.table_id).
filter(MetaDataTable.table_name == table_name).all()): filter(MetaDataTable.table_name == table_name).all()):
meta_data[order] = { meta_data[order] = {
'column': column.column_name, ColumnEntry.COLUMN_NAME: column.column_name,
'order': column.column_order, ColumnEntry.COLUMN_ORDER: column.column_order,
'ref_column': column.ref_column ColumnEntry.COLUMN_REF_COLUMN: column.ref_column,
ColumnEntry.COLUMN_TYPE: column.column_type
} }
order += 1 order += 1
# self.log.info("get_column_meta_data: %s", meta_data) # self.log.info("get_column_meta_data: %s", meta_data)
@@ -99,13 +115,15 @@ class KontorDB:
def get_columns(self, table_name: str) -> dict: def get_columns(self, table_name: str) -> dict:
columns = {} columns = {}
order = 0
__session__ = sessionmaker(self.engine) __session__ = sessionmaker(self.engine)
with __session__() as session: with __session__() as session:
for (_, column) in (session.query(MetaDataTable, MetaDataColumn). for (_, column) in (session.query(MetaDataTable, MetaDataColumn).
filter(MetaDataTable.id == MetaDataColumn.table_id). filter(MetaDataTable.id == MetaDataColumn.table_id).
filter(MetaDataTable.table_name == table_name).all()): 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 return columns
def get_filters(self, table_name: str) -> dict: def get_filters(self, table_name: str) -> dict:
@@ -116,7 +134,10 @@ class KontorDB:
filter(MetaDataTable.id == MetaDataColumn.table_id). filter(MetaDataTable.id == MetaDataColumn.table_id).
filter(MetaDataTable.table_name == table_name). filter(MetaDataTable.table_name == table_name).
filter(MetaDataColumn.show_filter == 1).all()): 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 return _filter_map
def data(self, table_name: str, columns: dict, filters: dict) -> list: def data(self, table_name: str, columns: dict, filters: dict) -> list:
@@ -133,8 +154,8 @@ class KontorDB:
# self.log.info("data: %s", entry) # self.log.info("data: %s", entry)
row = [] row = []
for order in columns.keys(): for order in columns.keys():
column_name = columns[order]['column'] column_name = columns[order][ColumnEntry.COLUMN_NAME]
ref_column = columns[order]['ref_column'] ref_column = columns[order][ColumnEntry.COLUMN_REF_COLUMN]
if str(column_name).endswith("_id"): if str(column_name).endswith("_id"):
ref_table = column_name[:-3] ref_table = column_name[:-3]
ref = getattr(entry, ref_table) ref = getattr(entry, ref_table)
@@ -166,7 +187,7 @@ class KontorDB:
entry = {} entry = {}
for order in columns: for order in columns:
# print(columns[order]) # 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}") # print(f"get value {column_name} from {row} of table {table}")
try: try:
value = getattr(row, column_name) value = getattr(row, column_name)