Abuse-Schutz fertig
Dieser Commit ist enthalten in:
@ -11,7 +11,7 @@ from PyQt5.QtWidgets import (
|
||||
QCheckBox, QComboBox, QPushButton, QProgressBar,
|
||||
QMessageBox, QSizePolicy, QSpacerItem
|
||||
)
|
||||
from PyQt5.QtCore import Qt, pyqtSignal
|
||||
from PyQt5.QtCore import Qt, pyqtSignal, QTimer
|
||||
|
||||
logger = logging.getLogger("generator_tab")
|
||||
|
||||
@ -34,6 +34,14 @@ class GeneratorTab(QWidget):
|
||||
self.language_manager.language_changed.connect(self.update_texts)
|
||||
self.update_texts()
|
||||
|
||||
# Feature 5: Timer für periodische Guard-Status-Prüfung
|
||||
self.guard_check_timer = QTimer()
|
||||
self.guard_check_timer.timeout.connect(self.update_button_states)
|
||||
self.guard_check_timer.start(2000) # Alle 2 Sekunden prüfen
|
||||
|
||||
# Feature 5: Initiale Button-Status-Prüfung nach UI-Initialisierung
|
||||
self.update_button_states()
|
||||
|
||||
def init_ui(self):
|
||||
"""Initialisiert die Benutzeroberfläche."""
|
||||
layout = QVBoxLayout(self)
|
||||
@ -114,9 +122,18 @@ class GeneratorTab(QWidget):
|
||||
|
||||
def on_start_clicked(self):
|
||||
"""Wird aufgerufen, wenn der Start-Button geklickt wird."""
|
||||
# Feature 5: Prüfe Guard-Status vor Start
|
||||
from utils.process_guard import get_guard
|
||||
guard = get_guard()
|
||||
|
||||
can_start, error_msg = guard.can_start("Account-Erstellung", "Unknown")
|
||||
if not can_start:
|
||||
self.show_error(error_msg)
|
||||
return
|
||||
|
||||
# Parameter sammeln
|
||||
params = self.get_params()
|
||||
|
||||
|
||||
# Eingaben validieren
|
||||
valid, error_msg = self.validate_inputs(params)
|
||||
if not valid:
|
||||
@ -125,7 +142,7 @@ class GeneratorTab(QWidget):
|
||||
|
||||
# Status aktualisieren
|
||||
self.set_status("Starte Account-Erstellung...")
|
||||
|
||||
|
||||
# Signal auslösen
|
||||
self.start_requested.emit(params)
|
||||
|
||||
@ -237,15 +254,53 @@ class GeneratorTab(QWidget):
|
||||
|
||||
def set_running(self, running: bool):
|
||||
"""Setzt den Status auf 'Wird ausgeführt' oder 'Bereit'."""
|
||||
self.start_button.setEnabled(not running)
|
||||
self.stop_button.setEnabled(running)
|
||||
|
||||
# Feature 5: Prüfe Guard-Status bevor Buttons aktiviert werden
|
||||
if not running:
|
||||
# Prozess ist beendet, prüfe ob Guard erlaubt
|
||||
self.update_button_states()
|
||||
else:
|
||||
# Prozess läuft
|
||||
self.start_button.setEnabled(False)
|
||||
self.stop_button.setEnabled(True)
|
||||
|
||||
if running:
|
||||
self.set_status("Läuft...")
|
||||
else:
|
||||
self.progress_bar.setValue(0)
|
||||
self.progress_bar.hide()
|
||||
|
||||
def update_button_states(self):
|
||||
"""
|
||||
Feature 5: Aktualisiert Button-Status basierend auf Process Guard.
|
||||
Deaktiviert Buttons wenn Guard locked ist oder Pause aktiv ist.
|
||||
"""
|
||||
from utils.process_guard import get_guard
|
||||
guard = get_guard()
|
||||
|
||||
# Prüfe ob blockiert
|
||||
is_locked = guard.is_locked()
|
||||
is_paused = guard.is_paused()
|
||||
is_blocked = is_locked or is_paused
|
||||
|
||||
# Buttons entsprechend setzen
|
||||
self.start_button.setEnabled(not is_blocked)
|
||||
self.stop_button.setEnabled(False) # Stop nur wenn running
|
||||
|
||||
# Tooltip setzen
|
||||
if is_blocked:
|
||||
status_msg = guard.get_status_message()
|
||||
self.start_button.setToolTip(f"⚠ {status_msg}")
|
||||
else:
|
||||
# Reset Tooltip
|
||||
if self.language_manager:
|
||||
tooltip = self.language_manager.get_text(
|
||||
"buttons.create",
|
||||
"Account erstellen"
|
||||
)
|
||||
else:
|
||||
tooltip = "Account erstellen"
|
||||
self.start_button.setToolTip(tooltip)
|
||||
|
||||
def set_progress(self, value: int):
|
||||
"""Setzt den Fortschritt der Fortschrittsanzeige."""
|
||||
if value > 0:
|
||||
|
||||
@ -34,20 +34,75 @@ class AccountCard(QFrame):
|
||||
self.email_copy_timer.timeout.connect(self._restore_email_copy_icon)
|
||||
self.password_copy_timer = QTimer()
|
||||
self.password_copy_timer.timeout.connect(self._restore_password_copy_icon)
|
||||
|
||||
|
||||
# Feature 5: Timer für periodische Guard-Status-Prüfung
|
||||
self.guard_check_timer = QTimer()
|
||||
self.guard_check_timer.timeout.connect(self.update_login_button_state)
|
||||
self.guard_check_timer.start(2000) # Alle 2 Sekunden prüfen
|
||||
|
||||
# Original Icons speichern
|
||||
self.copy_icon = None
|
||||
self.check_icon = None
|
||||
|
||||
|
||||
self.init_ui()
|
||||
|
||||
|
||||
if self.language_manager:
|
||||
self.language_manager.language_changed.connect(self.update_texts)
|
||||
self.update_texts()
|
||||
|
||||
# Feature 5: Initiale Button-Status-Prüfung
|
||||
self.update_login_button_state()
|
||||
|
||||
def _on_login_clicked(self):
|
||||
"""Handler für Login-Button"""
|
||||
# Feature 5: Prüfe Guard-Status vor Login
|
||||
from utils.process_guard import get_guard
|
||||
guard = get_guard()
|
||||
|
||||
platform = self.account_data.get("platform", "Unknown")
|
||||
can_start, error_msg = guard.can_start("Account-Login", platform)
|
||||
|
||||
if not can_start:
|
||||
# Zeige benutzerfreundliche Fehlermeldung
|
||||
from views.widgets.modern_message_box import show_error
|
||||
show_error(self, "Login blockiert", error_msg)
|
||||
return
|
||||
|
||||
self.login_requested.emit(self.account_data)
|
||||
|
||||
def _on_export_clicked(self):
|
||||
"""Handler für Export-Button"""
|
||||
# Feature 5: Prüfe Guard-Status vor Export
|
||||
from utils.process_guard import get_guard
|
||||
guard = get_guard()
|
||||
|
||||
platform = self.account_data.get("platform", "Unknown")
|
||||
can_start, error_msg = guard.can_start("Profil-Export", platform)
|
||||
|
||||
if not can_start:
|
||||
# Zeige benutzerfreundliche Fehlermeldung
|
||||
from views.widgets.modern_message_box import show_error
|
||||
show_error(self, "Export blockiert", error_msg)
|
||||
return
|
||||
|
||||
self.export_requested.emit(self.account_data)
|
||||
|
||||
def _on_delete_clicked(self):
|
||||
"""Handler für Delete-Button"""
|
||||
# Feature 5: Prüfe Guard-Status vor Löschen
|
||||
from utils.process_guard import get_guard
|
||||
guard = get_guard()
|
||||
|
||||
platform = self.account_data.get("platform", "Unknown")
|
||||
can_start, error_msg = guard.can_start("Account-Löschen", platform)
|
||||
|
||||
if not can_start:
|
||||
# Zeige benutzerfreundliche Fehlermeldung
|
||||
from views.widgets.modern_message_box import show_error
|
||||
show_error(self, "Löschen blockiert", error_msg)
|
||||
return
|
||||
|
||||
self.delete_requested.emit(self.account_data)
|
||||
|
||||
def init_ui(self):
|
||||
"""Initialisiert die UI nach Styleguide"""
|
||||
@ -191,7 +246,7 @@ class AccountCard(QFrame):
|
||||
self.export_btn = QPushButton("Profil\nexportieren")
|
||||
self.export_btn.setCursor(Qt.PointingHandCursor)
|
||||
self.export_btn.setObjectName("account_export_btn") # For QSS targeting
|
||||
self.export_btn.clicked.connect(lambda: self.export_requested.emit(self.account_data))
|
||||
self.export_btn.clicked.connect(self._on_export_clicked)
|
||||
actions_layout.addWidget(self.export_btn)
|
||||
|
||||
actions_layout.addStretch()
|
||||
@ -200,7 +255,7 @@ class AccountCard(QFrame):
|
||||
self.delete_btn = QPushButton("Löschen")
|
||||
self.delete_btn.setCursor(Qt.PointingHandCursor)
|
||||
self.delete_btn.setObjectName("account_delete_btn") # For QSS targeting
|
||||
self.delete_btn.clicked.connect(lambda: self.delete_requested.emit(self.account_data))
|
||||
self.delete_btn.clicked.connect(self._on_delete_clicked)
|
||||
actions_layout.addWidget(self.delete_btn)
|
||||
|
||||
layout.addLayout(actions_layout)
|
||||
@ -239,7 +294,37 @@ class AccountCard(QFrame):
|
||||
# Timer starten um nach 2 Sekunden zurückzuwechseln
|
||||
self.email_copy_timer.stop()
|
||||
self.email_copy_timer.start(2000)
|
||||
|
||||
|
||||
def update_login_button_state(self):
|
||||
"""
|
||||
Feature 5: Aktualisiert ALLE Button-Status basierend auf Process Guard.
|
||||
Deaktiviert Login, Export und Delete wenn Guard locked ist oder Pause aktiv ist.
|
||||
"""
|
||||
from utils.process_guard import get_guard
|
||||
guard = get_guard()
|
||||
|
||||
# Prüfe ob blockiert
|
||||
is_locked = guard.is_locked()
|
||||
is_paused = guard.is_paused()
|
||||
is_blocked = is_locked or is_paused
|
||||
|
||||
# Alle Buttons entsprechend setzen
|
||||
self.login_btn.setEnabled(not is_blocked)
|
||||
self.export_btn.setEnabled(not is_blocked)
|
||||
self.delete_btn.setEnabled(not is_blocked)
|
||||
|
||||
# Tooltips setzen
|
||||
if is_blocked:
|
||||
status_msg = guard.get_status_message()
|
||||
self.login_btn.setToolTip(f"⚠ {status_msg}")
|
||||
self.export_btn.setToolTip(f"⚠ {status_msg}")
|
||||
self.delete_btn.setToolTip(f"⚠ {status_msg}")
|
||||
else:
|
||||
# Reset Tooltips
|
||||
self.login_btn.setToolTip("Login durchführen")
|
||||
self.export_btn.setToolTip("Profil exportieren")
|
||||
self.delete_btn.setToolTip("Account löschen")
|
||||
|
||||
def update_texts(self):
|
||||
"""Aktualisiert die Texte gemäß der aktuellen Sprache"""
|
||||
if not self.language_manager:
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren