From 591171b22396bb074ef57ddd55e640a445020a9f Mon Sep 17 00:00:00 2001 From: Thomas Peetz Date: Sun, 2 Feb 2025 21:38:16 +0100 Subject: [PATCH] add meta data subwindow --- python/kontor-gui/gui/comic_window.py | 9 ++- python/kontor-gui/gui/main_window.py | 43 ++++++------ python/kontor-gui/gui/media_window.py | 9 ++- python/kontor-gui/gui/meta_data_window.py | 65 +++++++++++++++++++ .../kontor-schema/kontor_schema/__init__.py | 6 +- 5 files changed, 99 insertions(+), 33 deletions(-) create mode 100644 python/kontor-gui/gui/meta_data_window.py diff --git a/python/kontor-gui/gui/comic_window.py b/python/kontor-gui/gui/comic_window.py index b9f9b9f..5f465d6 100644 --- a/python/kontor-gui/gui/comic_window.py +++ b/python/kontor-gui/gui/comic_window.py @@ -1,4 +1,4 @@ -from PySide6.QtCore import Signal +from PySide6.QtCore import Signal, QSortFilterProxyModel from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QTabWidget, QMenu, QTableView, QMdiSubWindow from gui.model_config import KontorModelConfig @@ -53,9 +53,12 @@ class ComicWindow(QMdiSubWindow): self.data_views.append(model) data_tab.setLayout(layout) table_view = QTableView() - table_view.setModel(model) + proxy_model = QSortFilterProxyModel() + proxy_model.setSourceModel(model) + table_view.setSortingEnabled(True) + #table_view.setModel(model) + table_view.setModel(proxy_model) layout.addLayout(table_config.get_filter_layout()) layout.addWidget(table_view) model.refresh() return data_tab - diff --git a/python/kontor-gui/gui/main_window.py b/python/kontor-gui/gui/main_window.py index 6ddd612..6a2b591 100644 --- a/python/kontor-gui/gui/main_window.py +++ b/python/kontor-gui/gui/main_window.py @@ -7,6 +7,7 @@ from kontor_schema import KontorDB from .comic_window import ComicWindow from .media_window import MediaWindow +from .meta_data_window import MetaDataWindow from .progress import ProgressUpdate from .dialogs import ExportKontorDialog, ImportKontorDialog from .model_config import KontorModelConfig @@ -50,8 +51,8 @@ class MainWindow(QMainWindow): self.status_progress = QProgressBar() self.progress_update = ProgressUpdate(self.status_progress) self._create_statusbar() - centerPoint = QGuiApplication.screens()[0].geometry().center() - self.move(centerPoint - self.frameGeometry().center()) + center_point = QGuiApplication.screens()[0].geometry().center() + self.move(center_point - self.frameGeometry().center()) def _create_actions(self): self.newAction = QAction("&New", self) @@ -62,6 +63,8 @@ class MainWindow(QMainWindow): self.showTyscWindow = QAction("TYSC Window", self) self.showMediaWindow = QAction("&Media Window", self) self.showMediaWindow.triggered.connect(self.show_media_window) + self.showMetaDataWindow = QAction("Meta Data Window", self) + self.showMetaDataWindow.triggered.connect(self.show_meta_data_window) self.importAction = QAction(self.import_icon, "&Import", self) self.importAction.triggered.connect(self.import_from_file) self.exportAction = QAction(self.export_icon, "&Export", self) @@ -104,6 +107,7 @@ class MainWindow(QMainWindow): window_menu.addMenu(layouts_menu) window_menu.addAction(self.showComicWindow) window_menu.addAction(self.showMediaWindow) + window_menu.addAction(self.showMetaDataWindow) menu_bar.addMenu(window_menu) # Help menu help_menu = QMenu("&Hilfe") @@ -125,7 +129,7 @@ class MainWindow(QMainWindow): self.statusBar.addPermanentWidget(self.status_progress) def about(self): - QMessageBox.about(self.central_widget, "Über Kontor", f"Python: 3.11\nKontor: 0.1.0") + QMessageBox.about(self, "Über Kontor", f"Python: 3.11\nKontor: 0.1.0") def show_comic_window(self): if 'comic' not in self._subwindows: @@ -151,6 +155,18 @@ class MainWindow(QMainWindow): media.close() self.mdi_area.removeSubWindow(media) + def show_meta_data_window(self): + if 'meta_data' not in self._subwindows: + meta_data = MetaDataWindow(self) + meta_data.closed.connect(self.sub_window_closed) + self._subwindows['meta_data'] = meta_data + self.mdi_area.addSubWindow(meta_data) + meta_data.show() + else: + meta_data = self._subwindows.pop('meta_data') + meta_data.close() + self.mdi_area.removeSubWindow(meta_data) + def remove_sub_window(self, name: str): # self.log.info("remove subwindow %s", name) if name in self._subwindows: @@ -218,27 +234,6 @@ class MainWindow(QMainWindow): self.log.info("refresh") for (_, window) in self._subwindows.items(): window.refresh() - # def refresh(self): - # self.data[self.tabs.currentIndex()].refresh() - - # def _tab_changed(self, tab_index): - # self.data[tab_index].refresh() def update_status(self, message, timeout=3000): self.statusBar.showMessage(message, timeout=timeout) - - def generate_data_tab(self, table_name): - data_tab = QWidget() - - table_config = KontorModelConfig(self.kontor_db, self, table_name) - model = KontorTableModel(table_config) - layout = QVBoxLayout() - self.data.append(model) - data_tab.setLayout(layout) - table_view = QTableView() - table_view.setModel(model) - layout.addLayout(table_config.get_filter_layout()) - layout.addWidget(table_view) - model.refresh() - return data_tab - diff --git a/python/kontor-gui/gui/media_window.py b/python/kontor-gui/gui/media_window.py index 44c30a8..175dd07 100644 --- a/python/kontor-gui/gui/media_window.py +++ b/python/kontor-gui/gui/media_window.py @@ -1,4 +1,4 @@ -from PySide6.QtCore import Signal +from PySide6.QtCore import Signal, QSortFilterProxyModel from PySide6.QtWidgets import QMdiSubWindow, QWidget, QVBoxLayout, QTabWidget, QTableView from gui.model_config import KontorModelConfig @@ -24,6 +24,7 @@ class MediaWindow(QMdiSubWindow): self.tabs = QTabWidget() self.tabs.addTab(self.generate_data_tab("media_file"), "Media File") self.tabs.addTab(self.generate_data_tab("media_video"), "Media Video") + self.tabs.addTab(self.generate_data_tab("media_article"), "Media Article") self.tabs.currentChanged.connect(self._tab_changed) layout.addWidget(self.tabs) self.setLayout(layout) @@ -53,7 +54,11 @@ class MediaWindow(QMdiSubWindow): self.data_views.append(model) data_tab.setLayout(layout) table_view = QTableView() - table_view.setModel(model) + proxy_model = QSortFilterProxyModel() + proxy_model.setSourceModel(model) + table_view.setSortingEnabled(True) + #table_view.setModel(model) + table_view.setModel(proxy_model) layout.addLayout(table_config.get_filter_layout()) layout.addWidget(table_view) model.refresh() diff --git a/python/kontor-gui/gui/meta_data_window.py b/python/kontor-gui/gui/meta_data_window.py new file mode 100644 index 0000000..77ce516 --- /dev/null +++ b/python/kontor-gui/gui/meta_data_window.py @@ -0,0 +1,65 @@ +from PySide6.QtCore import Signal, QSortFilterProxyModel +from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QTabWidget, QMenu, QTableView, QMdiSubWindow + +from gui.model_config import KontorModelConfig +from gui.table_model import KontorTableModel + + +class MetaDataWindow(QMdiSubWindow): + closed = Signal() + + def __init__(self, main_window): + super().__init__() + self.data_views = list() + self._main_window = main_window + self.log = main_window.log + self._init_gui() + self.tick = main_window.tick + self.cross = main_window.cross + + def _init_gui(self): + self.setWindowTitle("Meta Data") + self.setWidget(QWidget()) + layout = QVBoxLayout() + self.tabs = QTabWidget() + self.tabs.addTab(self.generate_data_tab("module_data"), "Module") + self.tabs.addTab(self.generate_data_tab("meta_data_table"), "Tables") + self.tabs.addTab(self.generate_data_tab("meta_data_column"), "Columns") + self.tabs.currentChanged.connect(self._tab_changed) + layout.addWidget(self.tabs) + self.setLayout(layout) + self.setWidget(self.tabs) + + def closeEvent(self, event): + self.closed.emit() + super().closeEvent(event) + self._main_window.remove_sub_window('comic') + + def refresh(self): + # self.log.info("refresh") + self.data_views[self.tabs.currentIndex()].refresh() + + def _tab_changed(self, tab_index): + self.data_views[tab_index].refresh() + + def update_status(self, message): + self._main_window.update_status(message) + + 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) + table_view.setSortingEnabled(True) + #table_view.setModel(model) + table_view.setModel(proxy_model) + layout.addLayout(table_config.get_filter_layout()) + layout.addWidget(table_view) + model.refresh() + return data_tab diff --git a/python/kontor-schema/kontor_schema/__init__.py b/python/kontor-schema/kontor_schema/__init__.py index 1e747a1..5cb8bb6 100644 --- a/python/kontor-schema/kontor_schema/__init__.py +++ b/python/kontor-schema/kontor_schema/__init__.py @@ -1,12 +1,9 @@ import json -import re -import subprocess import uuid from datetime import datetime from logging import Logger from pathlib import Path -import mariadb from sqlalchemy import Engine, select from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import sessionmaker @@ -137,10 +134,11 @@ class KontorDB: row = [] for order in columns.keys(): column_name = columns[order]['column'] + ref_column = columns[order]['ref_column'] if str(column_name).endswith("_id"): ref_table = column_name[:-3] ref = getattr(entry, ref_table) - value = getattr(ref, "name") + value = getattr(ref, ref_column) row.append(value) else: row.append(getattr(entry, column_name))