262 Zeilen
8.6 KiB
Python
262 Zeilen
8.6 KiB
Python
"""
|
||
License Activation Dialog für die Lizenz-Eingabe beim Start.
|
||
"""
|
||
|
||
from PyQt5.QtWidgets import (
|
||
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit,
|
||
QPushButton, QTextEdit, QGroupBox, QSizePolicy
|
||
)
|
||
from PyQt5.QtCore import Qt, pyqtSignal, QThread
|
||
from PyQt5.QtGui import QFont, QPixmap
|
||
import logging
|
||
import os
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class ActivationWorker(QThread):
|
||
"""Worker Thread für die Lizenz-Aktivierung."""
|
||
|
||
finished = pyqtSignal(dict)
|
||
progress = pyqtSignal(str)
|
||
|
||
def __init__(self, license_manager, license_key):
|
||
super().__init__()
|
||
self.license_manager = license_manager
|
||
self.license_key = license_key
|
||
|
||
def run(self):
|
||
"""Führt die Aktivierung im Hintergrund aus."""
|
||
try:
|
||
self.progress.emit("Verbinde mit License Server...")
|
||
result = self.license_manager.activate_license(self.license_key)
|
||
self.finished.emit(result)
|
||
except Exception as e:
|
||
logger.error(f"Fehler bei der Aktivierung: {e}")
|
||
self.finished.emit({
|
||
"success": False,
|
||
"error": f"Unerwarteter Fehler: {str(e)}"
|
||
})
|
||
|
||
|
||
class LicenseActivationDialog(QDialog):
|
||
"""Dialog für die Lizenz-Aktivierung beim Start."""
|
||
|
||
activation_successful = pyqtSignal()
|
||
|
||
def __init__(self, license_manager, parent=None):
|
||
super().__init__(parent)
|
||
self.license_manager = license_manager
|
||
self.worker = None
|
||
self.init_ui()
|
||
|
||
def init_ui(self):
|
||
"""Initialisiert die UI."""
|
||
self.setWindowTitle("Lizenz-Aktivierung")
|
||
self.setModal(True)
|
||
self.setMinimumWidth(500)
|
||
self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
|
||
|
||
# Main Layout
|
||
layout = QVBoxLayout()
|
||
layout.setSpacing(20)
|
||
|
||
# Header mit Logo/Icon
|
||
header_layout = QHBoxLayout()
|
||
|
||
# App Icon
|
||
icon_label = QLabel()
|
||
icon_path = os.path.join("resources", "icons", "app_icon.png")
|
||
if os.path.exists(icon_path):
|
||
pixmap = QPixmap(icon_path).scaled(64, 64, Qt.KeepAspectRatio, Qt.SmoothTransformation)
|
||
icon_label.setPixmap(pixmap)
|
||
else:
|
||
icon_label.setText("🔐")
|
||
icon_label.setStyleSheet("font-size: 48px;")
|
||
|
||
# Title
|
||
title_layout = QVBoxLayout()
|
||
title_label = QLabel("Account Forger")
|
||
title_label.setStyleSheet("font-size: 24px; font-weight: bold;")
|
||
|
||
subtitle_label = QLabel("Bitte geben Sie Ihren Lizenzschlüssel ein")
|
||
subtitle_label.setStyleSheet("color: #666;")
|
||
|
||
title_layout.addWidget(title_label)
|
||
title_layout.addWidget(subtitle_label)
|
||
|
||
header_layout.addWidget(icon_label)
|
||
header_layout.addSpacing(20)
|
||
header_layout.addLayout(title_layout)
|
||
header_layout.addStretch()
|
||
|
||
layout.addLayout(header_layout)
|
||
|
||
# License Key Input
|
||
key_group = QGroupBox("Lizenzschlüssel")
|
||
key_layout = QVBoxLayout()
|
||
|
||
self.key_input = QLineEdit()
|
||
self.key_input.setPlaceholderText("XXXX-XXXX-XXXX-XXXX")
|
||
self.key_input.setStyleSheet("""
|
||
QLineEdit {
|
||
padding: 10px;
|
||
font-size: 16px;
|
||
font-family: monospace;
|
||
letter-spacing: 2px;
|
||
}
|
||
""")
|
||
|
||
# Format helper
|
||
format_label = QLabel("Format: AF-F-202506-XXXX-XXXX-XXXX")
|
||
format_label.setStyleSheet("color: #999; font-size: 12px;")
|
||
|
||
key_layout.addWidget(self.key_input)
|
||
key_layout.addWidget(format_label)
|
||
key_group.setLayout(key_layout)
|
||
|
||
layout.addWidget(key_group)
|
||
|
||
# Status/Error Display
|
||
self.status_text = QTextEdit()
|
||
self.status_text.setReadOnly(True)
|
||
self.status_text.setMaximumHeight(100)
|
||
self.status_text.hide()
|
||
self.status_text.setStyleSheet("""
|
||
QTextEdit {
|
||
border: 1px solid #ddd;
|
||
border-radius: 4px;
|
||
padding: 8px;
|
||
background-color: #f8f8f8;
|
||
}
|
||
""")
|
||
|
||
layout.addWidget(self.status_text)
|
||
|
||
# Buttons
|
||
button_layout = QHBoxLayout()
|
||
|
||
self.activate_button = QPushButton("Aktivieren")
|
||
self.activate_button.setDefault(True)
|
||
self.activate_button.setStyleSheet("""
|
||
QPushButton {
|
||
padding: 10px 30px;
|
||
font-size: 14px;
|
||
font-weight: bold;
|
||
background-color: #2196F3;
|
||
color: white;
|
||
border: none;
|
||
border-radius: 4px;
|
||
}
|
||
QPushButton:hover {
|
||
background-color: #1976D2;
|
||
}
|
||
QPushButton:disabled {
|
||
background-color: #ccc;
|
||
}
|
||
""")
|
||
self.activate_button.clicked.connect(self.activate_license)
|
||
|
||
self.exit_button = QPushButton("Beenden")
|
||
self.exit_button.setStyleSheet("""
|
||
QPushButton {
|
||
padding: 10px 30px;
|
||
font-size: 14px;
|
||
}
|
||
""")
|
||
self.exit_button.clicked.connect(self.reject)
|
||
|
||
button_layout.addStretch()
|
||
button_layout.addWidget(self.exit_button)
|
||
button_layout.addWidget(self.activate_button)
|
||
|
||
layout.addLayout(button_layout)
|
||
|
||
# Info Text
|
||
info_label = QLabel(
|
||
"Sie benötigen einen gültigen Lizenzschlüssel, um diese Software zu nutzen.\n"
|
||
"Kontaktieren Sie den Support, falls Sie noch keinen Lizenzschlüssel haben."
|
||
)
|
||
info_label.setWordWrap(True)
|
||
info_label.setStyleSheet("color: #666; font-size: 12px; padding: 10px;")
|
||
info_label.setAlignment(Qt.AlignCenter)
|
||
|
||
layout.addWidget(info_label)
|
||
|
||
self.setLayout(layout)
|
||
|
||
# Focus auf Input
|
||
self.key_input.setFocus()
|
||
|
||
# Enter zum Aktivieren
|
||
self.key_input.returnPressed.connect(self.activate_license)
|
||
|
||
def activate_license(self):
|
||
"""Startet die Lizenz-Aktivierung."""
|
||
license_key = self.key_input.text().strip()
|
||
|
||
if not license_key:
|
||
self.show_error("Bitte geben Sie einen Lizenzschlüssel ein.")
|
||
return
|
||
|
||
# UI für Aktivierung vorbereiten
|
||
self.activate_button.setEnabled(False)
|
||
self.key_input.setEnabled(False)
|
||
self.status_text.clear()
|
||
self.status_text.show()
|
||
self.status_text.append("🔄 Aktivierung läuft...")
|
||
|
||
# Worker Thread starten
|
||
self.worker = ActivationWorker(self.license_manager, license_key)
|
||
self.worker.progress.connect(self.update_status)
|
||
self.worker.finished.connect(self.activation_finished)
|
||
self.worker.start()
|
||
|
||
def update_status(self, message):
|
||
"""Aktualisiert den Status-Text."""
|
||
self.status_text.append(f"📡 {message}")
|
||
|
||
def activation_finished(self, result):
|
||
"""Verarbeitet das Ergebnis der Aktivierung."""
|
||
self.activate_button.setEnabled(True)
|
||
self.key_input.setEnabled(True)
|
||
|
||
if result.get("success"):
|
||
self.status_text.append("✅ Lizenz erfolgreich aktiviert!")
|
||
|
||
# Update Info anzeigen
|
||
if result.get("update_available"):
|
||
self.status_text.append(
|
||
f"ℹ️ Update verfügbar: Version {result.get('latest_version')}"
|
||
)
|
||
|
||
# Signal senden und Dialog schließen
|
||
self.activation_successful.emit()
|
||
self.accept()
|
||
else:
|
||
error = result.get("error", "Unbekannter Fehler")
|
||
self.show_error(error)
|
||
self.key_input.setFocus()
|
||
self.key_input.selectAll()
|
||
|
||
def show_error(self, error):
|
||
"""Zeigt eine Fehlermeldung an."""
|
||
self.status_text.show()
|
||
self.status_text.clear()
|
||
self.status_text.append(f"❌ Fehler: {error}")
|
||
self.status_text.setStyleSheet("""
|
||
QTextEdit {
|
||
border: 1px solid #f44336;
|
||
border-radius: 4px;
|
||
padding: 8px;
|
||
background-color: #ffebee;
|
||
color: #c62828;
|
||
}
|
||
""")
|
||
|
||
def closeEvent(self, event):
|
||
"""Verhindert das Schließen während der Aktivierung."""
|
||
if self.worker and self.worker.isRunning():
|
||
event.ignore()
|
||
else:
|
||
event.accept() |