Initial commit
Dieser Commit ist enthalten in:
235
views/main_window.py
Normale Datei
235
views/main_window.py
Normale Datei
@ -0,0 +1,235 @@
|
||||
# Path: views/main_window.py
|
||||
|
||||
"""
|
||||
Hauptfenster der Social Media Account Generator 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
|
||||
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("Social Media Account Generator")
|
||||
# Größere Mindest- und Startgröße, damit Plattformnamen
|
||||
# (z.B. "Twitter" und "VK") nicht abgeschnitten werden und
|
||||
# Tabelleninhalte genügend Platz haben
|
||||
self.setMinimumSize(1200, 700)
|
||||
self.resize(1200, 700)
|
||||
|
||||
# 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(0, 0, 0, 0)
|
||||
|
||||
# Zurück-Button
|
||||
self.back_button = QPushButton("↩ Zurück")
|
||||
self.back_button.setFixedWidth(100)
|
||||
self.header_layout.addWidget(self.back_button)
|
||||
|
||||
# Plattform-Titel
|
||||
self.platform_title = QLabel()
|
||||
title_font = QFont()
|
||||
title_font.setPointSize(14)
|
||||
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.setFixedWidth(100)
|
||||
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
|
||||
gen_text = self.language_manager.get_text("tabs.generator", "Account Generator") if self.language_manager else "Account Generator"
|
||||
self.platform_title.setText(f"{platform.title()} {gen_text}")
|
||||
|
||||
# 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()} {gen_text}")
|
||||
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 für "Über" und Sprachen."""
|
||||
|
||||
# "Über"-Aktion
|
||||
self.about_action = QAction(self.language_manager.get_text("menu.about", "Über"), self)
|
||||
self.menuBar().addAction(self.about_action)
|
||||
self.about_action.triggered.connect(self._show_about_dialog)
|
||||
|
||||
|
||||
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", "Social Media Account Generator"))
|
||||
|
||||
# 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"))
|
||||
|
||||
# Menüs aktualisieren
|
||||
self.about_action.setText(self.language_manager.get_text("menu.about", "Über"))
|
||||
|
||||
# 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().split()[0].lower() if self.platform_title.text() else None
|
||||
if current_platform:
|
||||
gen_text = self.language_manager.get_text("tabs.generator", "Account Generator")
|
||||
self.platform_title.setText(f"{current_platform.title()} {gen_text}")
|
||||
|
||||
# Tabs aktualisieren
|
||||
tab_names = {
|
||||
0: self.language_manager.get_text("tabs.generator", "Account Generator"),
|
||||
1: self.language_manager.get_text("tabs.settings", "Einstellungen")
|
||||
}
|
||||
|
||||
for i in range(self.tabs.count()):
|
||||
self.tabs.setTabText(i, tab_names.get(i, self.tabs.tabText(i)))
|
||||
|
||||
# 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()
|
||||
gen_text = self.language_manager.get_text("tabs.generator", "Account Generator") if self.language_manager else "Account Generator"
|
||||
self.tabs.addTab(generator_tab, gen_text)
|
||||
|
||||
# Einstellungen-Tab
|
||||
if hasattr(platform_controller, "get_settings_tab"):
|
||||
settings_tab = platform_controller.get_settings_tab()
|
||||
settings_text = self.language_manager.get_text("tabs.settings", "Einstellungen") if self.language_manager else "Einstellungen"
|
||||
self.tabs.addTab(settings_tab, settings_text)
|
||||
|
||||
|
||||
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("Social Media Account Generator")
|
||||
|
||||
# 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)
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren