Initial commit
Dieser Commit ist enthalten in:
209
views/widgets/account_creation_modal.py
Normale Datei
209
views/widgets/account_creation_modal.py
Normale Datei
@ -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"
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren