Files
cmshoppe/app/gui/activation_dialog.py
T

162 lines
5.9 KiB
Python

"""First-run membership activation dialog."""
from __future__ import annotations
from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import (
QCheckBox,
QDialog,
QHBoxLayout,
QLabel,
QLineEdit,
QPushButton,
QVBoxLayout,
)
from .widgets import (
BUTTON_BASE_STYLE,
COLOR_DANGER,
COLOR_INFO,
COLOR_MUTED,
COLOR_SUCCESS,
_primary_button_style,
)
class MembershipActivationDialog(QDialog):
"""Collect one membership API key and report asynchronous validation state."""
validationRequested = Signal(str)
memberCenterRequested = Signal()
def __init__(self, parent=None):
super().__init__(parent)
self._validating = False
self.setObjectName("membershipActivationDialog")
self.setWindowTitle("激活蝦皮圈优化助手")
self.setModal(True)
self.setWindowModality(Qt.WindowModal)
self.setMinimumWidth(520)
self.setStyleSheet(BUTTON_BASE_STYLE)
layout = QVBoxLayout(self)
layout.setContentsMargins(24, 22, 24, 22)
layout.setSpacing(12)
heading = QLabel("首次使用需要绑定会员账号")
heading.setObjectName("membershipActivationHeading")
heading.setStyleSheet("font-size: 16px; font-weight: 600; color: #24292f;")
layout.addWidget(heading)
description = QLabel(
"请从线上会员中心复制会员 API Key。程序会先验证账号和套餐,"
"验证通过后再开放业务功能。"
)
description.setObjectName("membershipActivationDescription")
description.setWordWrap(True)
description.setStyleSheet(f"color: {COLOR_MUTED};")
layout.addWidget(description)
key_label = QLabel("会员 API Key")
key_label.setObjectName("membershipApiKeyLabel")
layout.addWidget(key_label)
self.api_key_edit = QLineEdit()
self.api_key_edit.setObjectName("membershipApiKeyEdit")
self.api_key_edit.setEchoMode(QLineEdit.Password)
self.api_key_edit.setPlaceholderText("粘贴会员 API Key")
self.api_key_edit.setClearButtonEnabled(True)
self.api_key_edit.returnPressed.connect(self._request_validation)
key_label.setBuddy(self.api_key_edit)
layout.addWidget(self.api_key_edit)
self.show_key_checkbox = QCheckBox("显示 API Key")
self.show_key_checkbox.setObjectName("showMembershipApiKeyCheckbox")
self.show_key_checkbox.toggled.connect(self._toggle_key_visibility)
layout.addWidget(self.show_key_checkbox)
storage_hint = QLabel(
"API Key 在输入框和设置页中打码显示,但会以本机明文配置保存,"
"仅用于会员验证和默认网关请求。"
)
storage_hint.setObjectName("membershipApiKeyStorageHint")
storage_hint.setWordWrap(True)
storage_hint.setStyleSheet(f"color: {COLOR_MUTED};")
layout.addWidget(storage_hint)
self.status_label = QLabel("")
self.status_label.setObjectName("membershipActivationStatusLabel")
self.status_label.setWordWrap(True)
self.status_label.setMinimumHeight(36)
layout.addWidget(self.status_label)
button_layout = QHBoxLayout()
button_layout.setSpacing(8)
self.member_center_button = QPushButton("前往会员中心获取 API Key")
self.member_center_button.setObjectName("membershipCenterButton")
self.member_center_button.clicked.connect(self.memberCenterRequested.emit)
button_layout.addWidget(self.member_center_button)
button_layout.addStretch(1)
self.exit_button = QPushButton("退出程序")
self.exit_button.setObjectName("membershipActivationExitButton")
self.exit_button.clicked.connect(self.reject)
button_layout.addWidget(self.exit_button)
self.validate_button = QPushButton("验证并开始使用")
self.validate_button.setObjectName("membershipActivationValidateButton")
self.validate_button.setDefault(True)
self.validate_button.setStyleSheet(
_primary_button_style("membershipActivationValidateButton")
)
self.validate_button.clicked.connect(self._request_validation)
button_layout.addWidget(self.validate_button)
layout.addLayout(button_layout)
self.api_key_edit.setFocus()
def api_key(self) -> str:
return self.api_key_edit.text().strip()
def set_validating(self, validating: bool) -> None:
self._validating = bool(validating)
self.api_key_edit.setEnabled(not self._validating)
self.show_key_checkbox.setEnabled(not self._validating)
self.validate_button.setEnabled(not self._validating)
self.validate_button.setText(
"正在验证会员账号..." if self._validating else "验证并开始使用"
)
if self._validating:
self.set_status("正在验证会员账号,请稍候。", level="info")
def set_status(self, message: str, *, level: str = "muted") -> None:
color = {
"danger": COLOR_DANGER,
"info": COLOR_INFO,
"success": COLOR_SUCCESS,
}.get(str(level), COLOR_MUTED)
self.status_label.setStyleSheet(f"color: {color};")
self.status_label.setText(str(message or ""))
def focus_api_key(self) -> None:
self.api_key_edit.setFocus()
self.api_key_edit.selectAll()
def accept_activation(self) -> None:
self.set_validating(False)
self.accept()
def _request_validation(self) -> None:
if self._validating:
return
key = self.api_key()
if not key:
self.set_status("请输入会员 API Key。", level="danger")
self.focus_api_key()
return
self.validationRequested.emit(key)
def _toggle_key_visibility(self, checked: bool) -> None:
mode = QLineEdit.Normal if checked else QLineEdit.Password
self.api_key_edit.setEchoMode(mode)