Files
AccountForger-neuerUpload/views/main_window.py
Claude Project Manager 04585e95b6 Initial commit
2025-08-01 23:50:28 +02:00

241 Zeilen
8.6 KiB
Python

# Path: views/main_window.py
"""
Hauptfenster der AccountForger Anwendung.
"""
import os
import logging
from PyQt5.QtWidgets import (
QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
QLabel, QPushButton, QStackedWidget, QTabWidget,
QAction, QMessageBox
)
from PyQt5.QtCore import Qt, pyqtSignal, QSize, QFile
from PyQt5.QtGui import QIcon, QFont, QPixmap
from localization.language_manager import LanguageManager
from views.platform_selector import PlatformSelector
from views.about_dialog import AboutDialog
from utils.logger import add_gui_handler
logger = logging.getLogger("main")
class MainWindow(QMainWindow):
"""Hauptfenster der Anwendung."""
# Signale
platform_selected = pyqtSignal(str)
back_to_selector_requested = pyqtSignal()
theme_toggled = pyqtSignal()
def __init__(self, theme_manager=None, language_manager=None, db_manager=None):
super().__init__()
# Theme Manager
self.theme_manager = theme_manager
# Language Manager
self.language_manager = language_manager
self.db_manager = db_manager
# Fenstereigenschaften setzen
self.setWindowTitle("AccountForger")
# Größere Mindest- und Startgröße, damit Plattformnamen
# (z.B. "Twitter" und "VK") nicht abgeschnitten werden und
# Tabelleninhalte genügend Platz haben
self.setMinimumSize(1450, 700)
self.resize(1450, 800)
# Hauptwidget und Layout
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
# Haupt-Layout
self.main_layout = QVBoxLayout(self.central_widget)
# Gestapeltes Widget für Anzeige von Plattformwahl und Hauptfunktionen
self.stacked_widget = QStackedWidget()
self.main_layout.addWidget(self.stacked_widget)
# Plattform-Auswahl-Widget
self.platform_selector = PlatformSelector(self.language_manager, self.db_manager)
self.stacked_widget.addWidget(self.platform_selector)
# Container für Plattform-spezifische Tabs
self.platform_container = QWidget()
self.platform_layout = QVBoxLayout(self.platform_container)
# Header-Bereich mit Titel und Zurück-Button
self.header_widget = QWidget()
self.header_layout = QHBoxLayout(self.header_widget)
self.header_layout.setContentsMargins(10, 10, 10, 10)
# Zurück-Button
self.back_button = QPushButton("↩ Zurück")
self.back_button.setMinimumWidth(120) # Breiter für den Text
self.header_layout.addWidget(self.back_button)
# Plattform-Titel
self.platform_title = QLabel()
self.platform_title.setObjectName("platform_title") # For CSS styling
title_font = QFont()
title_font.setPointSize(24)
title_font.setBold(True)
self.platform_title.setFont(title_font)
self.platform_title.setAlignment(Qt.AlignCenter)
self.header_layout.addWidget(self.platform_title)
# Platzhalter für die rechte Seite, um die Zentrierung zu erhalten
spacer = QLabel()
spacer.setMinimumWidth(120) # Gleiche Breite wie der Button
self.header_layout.addWidget(spacer)
self.platform_layout.addWidget(self.header_widget)
# Tabs für die Plattform
self.tabs = QTabWidget()
self.platform_layout.addWidget(self.tabs)
# Stacked Widget hinzufügen
self.stacked_widget.addWidget(self.platform_container)
# Anfänglich Platform-Selektor anzeigen
self.stacked_widget.setCurrentWidget(self.platform_selector)
# Statusleiste
self.statusBar().showMessage("Bereit")
# "Über"-Menü erstellen
if self.language_manager:
self._create_menus()
# Verbinde das Sprachänderungssignal mit der UI-Aktualisierung
self.language_manager.language_changed.connect(self.refresh_language_ui)
# Verbinde Signale
self.connect_signals()
def connect_signals(self):
"""Verbindet die internen Signale."""
# Platform-Selector-Signal verbinden
self.platform_selector.platform_selected.connect(self.platform_selected)
# Zurück-Button-Signal verbinden
self.back_button.clicked.connect(self.back_to_selector_requested)
def init_platform_ui(self, platform: str, platform_controller):
"""Initialisiert die plattformspezifische UI."""
# Tabs entfernen (falls vorhanden)
while self.tabs.count() > 0:
self.tabs.removeTab(0)
# Plattform-Titel setzen - nur Platform-Name
self.platform_title.setText(f"{platform.title()}")
# Icon laden und anzeigen
if self.theme_manager:
icon_path = self.theme_manager.get_icon_path(platform.lower())
if os.path.exists(icon_path):
self.setWindowTitle(f"{platform.title()}")
self.setWindowIcon(QIcon(icon_path))
# Tabs von den Plattform-Controllern holen und hinzufügen
self.add_platform_tabs(platform_controller)
def _create_menus(self):
"""Erstellt die Menüeinträge."""
# Erstelle ein Logo-Button anstelle des Text-Menüs
logo_widget = QPushButton()
logo_widget.setIcon(QIcon(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
"resources", "icons", "intelsight-logo.svg")))
logo_widget.setIconSize(QSize(120, 40))
logo_widget.setFlat(True)
logo_widget.setCursor(Qt.PointingHandCursor)
logo_widget.setStyleSheet("""
QPushButton {
background-color: transparent;
border: none;
padding: 5px;
}
QPushButton:hover {
background-color: rgba(0, 0, 0, 0.05);
border-radius: 4px;
}
""")
logo_widget.clicked.connect(self._show_about_dialog)
# Add logo to menu bar
self.menuBar().setCornerWidget(logo_widget, Qt.TopLeftCorner)
# Store reference for language updates
self.about_action = logo_widget
def _show_about_dialog(self):
"""Öffnet den Über-Dialog."""
dialog = AboutDialog(self.language_manager, self)
dialog.exec_()
def refresh_language_ui(self):
"""
Aktualisiert alle UI-Texte nach einem Sprachwechsel.
Diese Methode wird beim Language-Changed-Signal aufgerufen.
"""
if not self.language_manager:
return
# Fenstername aktualisieren
self.setWindowTitle(self.language_manager.get_text("main.title", "AccountForger"))
# Status-Nachricht aktualisieren
self.statusBar().showMessage(self.language_manager.get_text("status.ready", "Bereit"))
# Den Zurück-Button aktualisieren
self.back_button.setText(self.language_manager.get_text("buttons.back", "↩ Zurück"))
# Logo-Button braucht keine Text-Aktualisierung
# Die Platform Selector-View aktualisieren
if hasattr(self.platform_selector, "update_texts"):
self.platform_selector.update_texts()
# Die aktuelle Plattform-UI aktualisieren, falls vorhanden
current_platform = self.platform_title.text().lower() if self.platform_title.text() else None
if current_platform:
self.platform_title.setText(f"{current_platform.title()}")
# Tabs sind versteckt, keine Aktualisierung nötig
# Aktualisierung erzwingen
self.repaint()
def add_platform_tabs(self, platform_controller):
"""Fügt die Tabs vom Plattform-Controller hinzu."""
# Generator-Tab
if hasattr(platform_controller, "get_generator_tab"):
generator_tab = platform_controller.get_generator_tab()
self.tabs.addTab(generator_tab, "")
# Tab-Leiste verstecken, da nur ein Tab
self.tabs.tabBar().hide()
def show_platform_ui(self):
"""Zeigt die plattformspezifische UI an."""
self.stacked_widget.setCurrentWidget(self.platform_container)
def show_platform_selector(self):
"""Zeigt den Plattform-Selektor an."""
self.stacked_widget.setCurrentWidget(self.platform_selector)
self.setWindowTitle("AccountForger")
# Standard-Icon zurücksetzen
self.setWindowIcon(QIcon())
def set_status_message(self, message: str):
"""Setzt eine Nachricht in der Statusleiste."""
self.statusBar().showMessage(message)
def add_log_widget(self, text_widget):
"""Fügt einen GUI-Handler zum Logger hinzu."""
add_gui_handler(logger, text_widget)