Dieser Commit ist enthalten in:
Claude Project Manager
2025-08-01 23:50:28 +02:00
Commit 04585e95b6
290 geänderte Dateien mit 64086 neuen und 0 gelöschten Zeilen

Datei anzeigen

@ -0,0 +1,209 @@
"""
Account Creation Modal - Spezialisiertes Modal für Account-Erstellung
"""
import logging
from typing import Optional, List
from PyQt5.QtCore import QTimer, pyqtSignal
from PyQt5.QtWidgets import QVBoxLayout, QLabel, QProgressBar
from PyQt5.QtGui import QFont
from views.widgets.progress_modal import ProgressModal
from styles.modal_styles import ModalStyles
logger = logging.getLogger("account_creation_modal")
class AccountCreationModal(ProgressModal):
"""
Spezialisiertes Modal für Account-Erstellung mit Step-by-Step Anzeige.
"""
# Signale
step_completed = pyqtSignal(str) # Step-Name
def __init__(self, parent=None, platform: str = "Social Media", language_manager=None, style_manager=None):
self.platform = platform
self.current_step = 0
self.total_steps = 0
self.steps = []
super().__init__(parent, "account_creation", language_manager, style_manager)
# Erweitere UI für Steps
self.setup_steps_ui()
def setup_steps_ui(self):
"""Erweitert die UI um Step-Anzeige"""
container_layout = self.modal_container.layout()
# Progress Bar (zwischen Animation und Status)
self.progress_bar = QProgressBar()
self.progress_bar.setVisible(False)
self.progress_bar.setFixedHeight(self.style_manager.SIZES['progress_bar_height'])
self.progress_bar.setStyleSheet(self.style_manager.get_progress_bar_style())
# Füge Progress Bar nach Animation Widget ein (Index 2)
container_layout.insertWidget(2, self.progress_bar)
# Steps Label (zwischen Progress Bar und Status)
self.steps_label = QLabel()
self.steps_label.setVisible(False)
self.steps_label.setAlignment(self.title_label.alignment())
self.steps_label.setFont(self.style_manager.create_font('steps'))
self.steps_label.setStyleSheet(self.style_manager.get_steps_label_style())
# Füge Steps Label nach Progress Bar ein (Index 3)
container_layout.insertWidget(3, self.steps_label)
def set_steps(self, steps: List[str]):
"""
Setzt die Liste der Schritte für die Account-Erstellung.
Args:
steps: Liste der Step-Namen
"""
self.steps = steps
self.total_steps = len(steps)
self.current_step = 0
if self.total_steps > 0:
self.progress_bar.setMaximum(self.total_steps)
self.progress_bar.setValue(0)
self.progress_bar.setVisible(True)
self.steps_label.setVisible(True)
self._update_steps_display()
def start_step(self, step_name: str, detail: str = None):
"""
Startet einen neuen Schritt.
Args:
step_name: Name des Schritts
detail: Optional - Detail-Information
"""
if step_name in self.steps:
self.current_step = self.steps.index(step_name) + 1
else:
self.current_step += 1
# Progress Bar aktualisieren
if self.progress_bar.isVisible():
self.progress_bar.setValue(self.current_step)
# Status aktualisieren
self.update_status(f"🔄 {step_name}", detail)
# Steps Display aktualisieren
self._update_steps_display()
logger.info(f"Account Creation Step gestartet: {step_name} ({self.current_step}/{self.total_steps})")
def complete_step(self, step_name: str, next_step: str = None):
"""
Markiert einen Schritt als abgeschlossen.
Args:
step_name: Name des abgeschlossenen Schritts
next_step: Optional - Name des nächsten Schritts
"""
# Step-completed Signal senden
self.step_completed.emit(step_name)
# Kurz "Completed" anzeigen
self.update_status(f"{step_name} abgeschlossen")
# Nach kurzer Verzögerung nächsten Schritt starten
if next_step:
QTimer.singleShot(self.style_manager.ANIMATIONS['step_delay'], lambda: self.start_step(next_step))
logger.info(f"Account Creation Step abgeschlossen: {step_name}")
def fail_step(self, step_name: str, error_message: str, retry_callback=None):
"""
Markiert einen Schritt als fehlgeschlagen.
Args:
step_name: Name des fehlgeschlagenen Schritts
error_message: Fehlermeldung
retry_callback: Optional - Callback für Retry
"""
self.update_status(f"{step_name} fehlgeschlagen", error_message)
# Animation stoppen
self.animation_widget.stop_animation()
logger.error(f"Account Creation Step fehlgeschlagen: {step_name} - {error_message}")
def show_platform_specific_process(self):
"""Zeigt plattform-spezifische Account-Erstellung an"""
# Plattform-spezifische Steps
platform_steps = self._get_platform_steps()
self.set_steps(platform_steps)
# Titel anpassen
title = f"🔄 {self.platform} Account wird erstellt"
self.title_label.setText(title)
# Modal anzeigen
self.show_process("account_creation")
def _get_platform_steps(self) -> List[str]:
"""Gibt plattform-spezifische Schritte zurück"""
return self.style_manager.get_platform_steps(self.platform)
def _update_steps_display(self):
"""Aktualisiert die Steps-Anzeige"""
if self.total_steps > 0:
steps_text = f"Schritt {self.current_step} von {self.total_steps}"
self.steps_label.setText(steps_text)
def show_success(self, account_data: dict = None):
"""
Zeigt Erfolgs-Status an.
Args:
account_data: Optional - Account-Daten für Anzeige
"""
# Animation stoppen
self.animation_widget.stop_animation()
# Success Status
platform_name = account_data.get('platform', self.platform) if account_data else self.platform
username = account_data.get('username', '') if account_data else ''
title = f"{platform_name} Account erstellt!"
status = f"Account '{username}' wurde erfolgreich erstellt" if username else "Account wurde erfolgreich erstellt"
self.title_label.setText(title)
self.update_status(status, "Das Fenster schließt automatisch...")
# Progress Bar auf Maximum setzen
if self.progress_bar.isVisible():
self.progress_bar.setValue(self.total_steps)
# Auto-Close nach konfigurierbarer Zeit
QTimer.singleShot(self.style_manager.ANIMATIONS['auto_close_delay'], self.hide_process)
logger.info(f"Account Creation erfolgreich für: {platform_name}")
def estimate_time_remaining(self) -> str:
"""
Schätzt die verbleibende Zeit basierend auf aktueller Step.
Returns:
str: Geschätzte Zeit als String
"""
if self.total_steps == 0:
return "Unbekannt"
# Grobe Zeitschätzung: ~30 Sekunden pro Step
remaining_steps = max(0, self.total_steps - self.current_step)
estimated_seconds = remaining_steps * 30
if estimated_seconds < 60:
return f"~{estimated_seconds}s"
else:
minutes = estimated_seconds // 60
return f"~{minutes} Min"