209 Zeilen
7.5 KiB
Python
209 Zeilen
7.5 KiB
Python
"""
|
|
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" |