from PySide6.QtGui import QAction, QIcon, QGuiApplication from PySide6.QtWidgets import QWidget, QVBoxLayout, QMenu, QMessageBox, QTabWidget, QTableView, QProgressBar, QMdiArea from PySide6.QtWidgets import QLabel, QMainWindow from sqlalchemy import Engine from kontor_schema import KontorDB from .comic_window import ComicWindow from .progress import ProgressUpdate from .dialogs import ExportKontorDialog, ImportKontorDialog from .model_config import KontorModelConfig from .table_model import KontorTableModel class MainWindow(QMainWindow): def __init__(self, engine: Engine, log): super().__init__() self.tick = QIcon('res/tick.png') self.cross = QIcon('res/cross.png') self.import_icon = QIcon("res/application-import.png") self.export_icon = QIcon("res/application-export.png") self.circle_icon = QIcon("res/arrow-circle-double.png") self.data = [] self.filter = {} self.kontor_db = KontorDB(engine, log) self.log = log self._subwindows = {} self._setup_ui() #self.tabs = QTabWidget() #self.tabs.addTab(self.generate_data_tab("comic"), "Comics") #self.tabs.addTab(self.generate_data_tab("media_file"), "MediaFile") #self.tabs.currentChanged.connect(self._tab_changed) #label.setAlignment(Qt.AlignmentFlag.AlignCenter) #parent_layout.addWidget(self.tabs) self.setCentralWidget(self.central_widget) def _setup_ui(self): self.setWindowTitle("Kontor") self.setMinimumSize(1200, 800) self._create_actions() self.central_widget = QWidget() # parent_layout = QVBoxLayout() # self.central_widget.setLayout(parent_layout) self.mdi_area = QMdiArea(self.central_widget) self.mdi_area.setObjectName('mdi_area') self.setCentralWidget(self.central_widget) self._create_menubar() self._create_toolbars() 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()) def _create_actions(self): self.newAction = QAction("&New", self) self.aboutAction = QAction("&Über...", self) self.aboutAction.triggered.connect(self.about) self.showComicWindow = QAction("Show/Hide &Comic Window", self) self.showComicWindow.triggered.connect(self.show_comic_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) self.exportAction.triggered.connect(self.export_to_file) self.refreshAction = QAction(self.circle_icon, "&Refresh", self) self.refreshAction.triggered.connect(self.refresh) self.updateTitleAction = QAction("&Update Titles", self) self.updateTitleAction.triggered.connect(self.update_title) self.downloadAction = QAction("&Download Videos", self) self.downloadAction.triggered.connect(self.download_file) self.checkFileAction = QAction("&Check files", self) self.checkFileAction.triggered.connect(self.check_files) self.exitAction = QAction("&Beenden", self) self.exitAction.setShortcut("Alt+F4") self.exitAction.triggered.connect(self.close) def _create_menubar(self): menu_bar = self.menuBar() # File menu file_menu = QMenu("&Datei") menu_bar.addMenu(file_menu) file_menu.addAction(self.exitAction) # Kontor menu kontor_menu = QMenu("&Kontor") menu_bar.addMenu(kontor_menu) kontor_menu.addAction(self.importAction) kontor_menu.addAction(self.exportAction) comic_menu = QMenu("&Comic") comic_menu.addAction(self.showComicWindow) tysc_menu = QMenu("&TradeYourSportCards") media_file_menu = QMenu("&MediaFile") media_file_menu.addAction(self.updateTitleAction) media_file_menu.addAction(self.downloadAction) media_file_menu.addAction(self.checkFileAction) kontor_menu.addMenu(comic_menu) kontor_menu.addMenu(tysc_menu) kontor_menu.addMenu(media_file_menu) # Help menu help_menu = QMenu("&Hilfe") menu_bar.addMenu(help_menu) help_menu.addAction(self.aboutAction) def _create_toolbars(self): # Kontor toolbar kontor_tool_bar = self.addToolBar("Kontor") kontor_tool_bar.addAction(self.importAction) kontor_tool_bar.addAction(self.exportAction) kontor_tool_bar.addAction(self.refreshAction) def _create_statusbar(self): self.statusBar = self.statusBar() self.statusBar.showMessage("Kontor ready", 6000) self.status_label = QLabel("") self.status_progress.setEnabled(False) self.statusBar.addPermanentWidget(self.status_progress) def about(self): QMessageBox.about(self.central_widget, "Über Kontor", f"Python: 3.11\nKontor: 0.1.0") def show_comic_window(self): if 'comic' not in self._subwindows: comic = ComicWindow(self) comic.closed.connect(self.sub_window_closed) self._subwindows['comic'] = comic self.mdi_area.addSubWindow(comic) comic.show() else: comic = self._subwindows.pop('comic') comic.close() self.mdi_area.removeSubWindow(comic) def remove_sub_window(self, name: str): # self.log.info("remove subwindow %s", name) if name in self._subwindows: window = self._subwindows.pop(name) window.close() self.mdi_area.removeSubWindow(window) def sub_window_closed(self): self.log.info("close subwindow") def import_from_file(self): import_dlg = ImportKontorDialog(self) if import_dlg.exec(): print(f"import DB from file {import_dlg.file_name}") else: print("do nothing for import") pass def export_to_file(self): export_dlg = ExportKontorDialog(self, self.kontor_db) if export_dlg.exec(): self.log.info(export_dlg.get_tables_to_export()) self.log.info(f"export DB to {export_dlg.file_name}") self.statusBar.showMessage(f"export DB to {export_dlg.file_name}", 3000) self.kontor_db.export_db(export_dlg.current_export_type, export_dlg.file_name) else: self.statusBar.showMessage("Export cancelled", 3000) def update_title(self): self.log.info("update title for table MediaFile") self.statusBar.showMessage("update title for table MediaFile", 3000) self.status_progress.setEnabled(True) self.kontor_db.update_title() self.status_progress.setEnabled(False) self.refresh() def download_file(self): self.log.info("download videos for table MediaFile") self.statusBar.showMessage("download videos for table MediaFile", 3000) self.status_progress.setEnabled(True) self.kontor_db.download_file(False, self.progress_update) self.status_progress.setEnabled(False) self.refresh() def check_files(self): self.log.info("check files") self.statusBar.showMessage("check files for table MediaFile", 3000) self.kontor_db.check_files() def refresh(self): 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