from PyQt6.QtWidgets import QMainWindow, QTabWidget, QMessageBox from gui.tabs.accounts.account_tab import AccountTab from gui.tabs.products.product_tab import ProductTab from gui.tabs.import_tab import ImportTab from gui.tabs.listeds.listed_tab import ListedTab from gui.tabs.settings.settings_tab import SettingsTab from gui.core.login_handle_dialog import LoginHandleDialog from stores.shared_store import SharedStore from tasks.listed_tasks import start_background_listed from gui.global_signals import global_signals class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Facebook Marketplace Manager") self.resize(1200, 600) # --- Tabs --- self.tabs = QTabWidget() self.account_tab = AccountTab() self.product_tab = ProductTab() self.import_tab = ImportTab() self.listed_tab = ListedTab() self.setting_tab = SettingsTab() self.tabs.addTab(self.account_tab, "Accounts") self.tabs.addTab(self.product_tab, "Products") self.tabs.addTab(self.listed_tab, "Queue Handle") self.tabs.addTab(self.import_tab, "Import Data") self.tabs.addTab(self.setting_tab, "Setting") self.tabs.currentChanged.connect(self.on_tab_changed) self.setCentralWidget(self.tabs) self.on_tab_changed(0) # --- Signals --- # global_signals.listed_finished.connect(self.on_listed_task_finished) # global_signals.dialog_finished.connect(self.on_dialog_finished) # global_signals.open_login_dialog.connect(self.show_login_dialog) # --- Background tasks --- # start_background_listed() # --- Store opened dialogs --- self.login_dialogs = [] # ---------------------------------------------------------------------- def show_login_dialog(self, account_id: int, listed_id: int): """Hiển thị dialog xử lý login (modeless)""" print(f"[INFO] Open LoginHandleDialog for acc={account_id}, listed={listed_id}") dialog = LoginHandleDialog(account_id=account_id, listed_id=listed_id) dialog.setParent(self) # đảm bảo dialog đóng theo MainWindow dialog.show() self.login_dialogs.append(dialog) # Cleanup khi dialog đóng dialog.finished.connect( lambda: self._on_dialog_closed(dialog, account_id, listed_id) ) # ---------------------------------------------------------------------- def _on_dialog_closed(self, dialog, account_id, listed_id): """Xử lý khi dialog đóng""" if dialog in self.login_dialogs: self.login_dialogs.remove(dialog) self.on_dialog_finished(account_id, listed_id) # ---------------------------------------------------------------------- def on_dialog_finished(self, account_id, listed_id): """Khi dialog xử lý xong""" store = SharedStore.get_instance() store.remove(listed_id) # ---------------------------------------------------------------------- def on_tab_changed(self, index: int): """Lazy-load dữ liệu khi đổi tab""" tab = self.tabs.widget(index) if hasattr(tab, "load_data") and not getattr(tab, "is_loaded", False): tab.load_data() tab.is_loaded = True # ---------------------------------------------------------------------- def on_listed_task_finished(self): """Khi task nền hoàn tất""" QMessageBox.information( self, "Auto Listing", "All pending listed items have been processed!" ) # ---------------------------------------------------------------------- def closeEvent(self, event): """Khi đóng MainWindow -> đóng hết dialog con""" for dialog in self.login_dialogs[:]: # copy để tránh modify khi lặp dialog.close() event.accept()