293 lines
9.9 KiB
Python
293 lines
9.9 KiB
Python
# coding:utf-8
|
|
|
|
from loguru import logger
|
|
from PyQt6.QtCore import Qt, QTimer, pyqtSignal
|
|
from PyQt6.QtGui import (
|
|
QColor,
|
|
QIcon,
|
|
)
|
|
from PyQt6.QtWidgets import QApplication, QHBoxLayout, QVBoxLayout, QWidget
|
|
from qfluentwidgets import (
|
|
ImageLabel,
|
|
InfoBar,
|
|
InfoBarPosition,
|
|
isDarkTheme,
|
|
MSFluentTitleBar,
|
|
Pivot,
|
|
PopUpAniStackedWidget,
|
|
setThemeColor,
|
|
VerticalSeparator
|
|
)
|
|
from qframelesswindow import FramelessWindow as Window
|
|
|
|
from app.core import LoginThread, RegisterThread
|
|
from app.view.widgets.login_widget import LoginWidget
|
|
from app.view.widgets.register_widget import RegisterWidget
|
|
from welcome_video import WelcomeVideoPlayer
|
|
|
|
|
|
class RegisterWindow(Window):
|
|
"""登录注册页面"""
|
|
|
|
loginSignal = pyqtSignal()
|
|
|
|
def __init__(self, parent=None):
|
|
logger.info("初始化注册窗口")
|
|
super().__init__(parent=parent)
|
|
setThemeColor("#1976d2")
|
|
self.setTitleBar(MSFluentTitleBar(self))
|
|
|
|
self.verificationCode = ""
|
|
|
|
self.hBoxLayout = QHBoxLayout(self)
|
|
|
|
self.loginLayout = QVBoxLayout()
|
|
|
|
self.promotionalImageLabel = ImageLabel(self)
|
|
self.logoImage = ImageLabel(self)
|
|
|
|
self.pivot = Pivot(self)
|
|
self.stackedWidget = PopUpAniStackedWidget(self)
|
|
|
|
self.loginWidget = LoginWidget(self)
|
|
self.registerWidget = RegisterWidget(self)
|
|
self.videoPlayer = WelcomeVideoPlayer(self)
|
|
|
|
self.__initWidgets()
|
|
logger.info("注册窗口初始化完成")
|
|
|
|
def __initWidgets(self):
|
|
logger.debug("初始化注册窗口组件")
|
|
self.titleBar.maxBtn.hide()
|
|
self.titleBar.setDoubleClickEnabled(False)
|
|
|
|
self.__initLayout()
|
|
|
|
color = QColor(25, 33, 42) if isDarkTheme() else QColor(240, 244, 249)
|
|
self.setStyleSheet(f"RegisterWindow{{background: {color.name()}}}")
|
|
self.setWindowIcon(QIcon(":app/images/logo.png"))
|
|
self.setFixedSize(690, 470)
|
|
|
|
# 设置视频播放器为全窗口大小
|
|
self.videoPlayer.setGeometry(0, 0, 690, 470)
|
|
# 初始时隐藏视频播放器
|
|
self.videoPlayer.hide()
|
|
|
|
# self.promotionalImageLabel.setImage(":app/images/background.png")
|
|
# self.promotionalImageLabel.scaledToWidth(300)
|
|
|
|
self.logoImage.setImage(":app/images/logolong.png")
|
|
self.logoImage.scaledToWidth(130)
|
|
|
|
self
|
|
|
|
self.pivot.addItem("LoginWidget", "登录", icon=":app/icons/login.svg")
|
|
|
|
# TODO: 内测版本隐藏注册页面
|
|
self.pivot.addItem("RegisterWidget", "注册", icon=":app/icons/register.svg")
|
|
self.pivot.setCurrentItem("LoginWidget")
|
|
|
|
self.pivot.currentItemChanged.connect(
|
|
lambda routeKey: self.stackedWidget.setCurrentWidget(
|
|
self.findChild(QWidget, routeKey)
|
|
)
|
|
)
|
|
|
|
self.loginWidget.loginButton.clicked.connect(self.login)
|
|
self.registerWidget.registerButton.clicked.connect(self.register)
|
|
|
|
self.stackedWidget.setMaximumWidth(300)
|
|
self.stackedWidget.addWidget(self.loginWidget)
|
|
self.stackedWidget.addWidget(self.registerWidget)
|
|
|
|
def show_welcome_video(self):
|
|
"""显示欢迎视频"""
|
|
# 确保视频播放器显示在最前面
|
|
self.videoPlayer.raise_()
|
|
# 开始播放视频
|
|
self.videoPlayer.start_playback()
|
|
# 再次确保跳过按钮在最顶层
|
|
self.videoPlayer.skip_button.raise_()
|
|
# 连接视频完成信号
|
|
self.videoPlayer.videoFinished.connect(self.hide_welcome_video)
|
|
|
|
def hide_welcome_video(self):
|
|
"""隐藏欢迎视频,显示登录界面"""
|
|
self.videoPlayer.stop_playback()
|
|
# 确保登录界面元素可见
|
|
self.pivot.show()
|
|
self.stackedWidget.show()
|
|
self.logoImage.show()
|
|
|
|
self.titleBar.titleLabel.setStyleSheet(
|
|
"""
|
|
QLabel{
|
|
background: transparent;
|
|
font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC';
|
|
padding: 0 4px;
|
|
color: black
|
|
}
|
|
"""
|
|
)
|
|
|
|
desktop = QApplication.screens()[0].availableGeometry()
|
|
w, h = desktop.width(), desktop.height()
|
|
self.move(w // 2 - self.width() // 2, h // 2 - self.height() // 2)
|
|
|
|
self.titleBar.raise_()
|
|
logger.debug("注册窗口组件初始化完成")
|
|
|
|
def __initLayout(self):
|
|
logger.debug("初始化注册窗口布局")
|
|
self.loginLayout.setContentsMargins(10, 40, 10, 40)
|
|
self.hBoxLayout.setContentsMargins(25, 30, 15, 0)
|
|
self.loginLayout.addWidget(
|
|
self.logoImage, 0, Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignCenter,
|
|
)
|
|
|
|
self.loginLayout.addWidget(
|
|
self.pivot, 0, Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignCenter,
|
|
)
|
|
|
|
self.loginLayout.addSpacing(10)
|
|
self.loginLayout.addWidget(self.stackedWidget)
|
|
|
|
# self.hBoxLayout.addWidget(
|
|
# self.promotionalImageLabel, 0, Qt.AlignmentFlag.AlignBottom
|
|
# )
|
|
self.hBoxLayout.addSpacing(10)
|
|
# self.hBoxLayout.addWidget(VerticalSeparator(self))
|
|
self.hBoxLayout.addSpacing(10)
|
|
self.hBoxLayout.addLayout(self.loginLayout)
|
|
logger.debug("注册窗口布局初始化完成")
|
|
|
|
def keyPressEvent(self, event):
|
|
if event.key() == Qt.Key.Key_Return or event.key() == Qt.Key.Key_Enter:
|
|
if self.stackedWidget.currentWidget() == self.loginWidget:
|
|
self.login()
|
|
elif self.stackedWidget.currentWidget() == self.registerWidget:
|
|
self.register()
|
|
else:
|
|
super().keyPressEvent(event)
|
|
|
|
def login(self):
|
|
"""登录"""
|
|
self.loginWidget.loginButton.setEnabled(False)
|
|
userName = self.loginWidget.emailLineEdit.text()
|
|
password = self.loginWidget.passwordLineEdit.text()
|
|
captcha = self.loginWidget.verificationCodeLineEdit.text()
|
|
if not userName or not password or not captcha:
|
|
InfoBar.warning(
|
|
"提示",
|
|
"你需要填写所有项",
|
|
Qt.Orientation.Horizontal,
|
|
True,
|
|
2000,
|
|
InfoBarPosition.TOP_RIGHT,
|
|
self.window(),
|
|
)
|
|
return
|
|
self.loginThread = LoginThread(userName, password, captcha)
|
|
self.loginThread.successLogin.connect(self._loginSuccess)
|
|
self.loginThread.errorLogin.connect(self._loginFailed)
|
|
self.loginThread.start()
|
|
|
|
def _loginSuccess(self):
|
|
InfoBar.success(
|
|
"成功",
|
|
"登录成功,正在跳转",
|
|
Qt.Orientation.Horizontal,
|
|
True,
|
|
1000,
|
|
InfoBarPosition.TOP_RIGHT,
|
|
self.window(),
|
|
)
|
|
|
|
QTimer.singleShot(500, self.loginSignal.emit)
|
|
|
|
def _loginFailed(self, msg):
|
|
InfoBar.error(
|
|
"失败",
|
|
msg,
|
|
Qt.Orientation.Horizontal,
|
|
True,
|
|
1000,
|
|
InfoBarPosition.TOP_RIGHT,
|
|
self.window(),
|
|
)
|
|
self.loginWidget.refreshVerificationCode()
|
|
self.loginWidget.verificationCodeLineEdit.clear()
|
|
self.loginWidget.loginButton.setEnabled(True)
|
|
|
|
def register(self):
|
|
"""注册"""
|
|
self.registerWidget.registerButton.setEnabled(False)
|
|
userName = self.registerWidget.emailLineEdit.text()
|
|
password = self.registerWidget.passwordLineEdit.text()
|
|
confirmPassword = self.registerWidget.confirmPasswordLineEdit.text()
|
|
captchaCode = self.registerWidget.verificationCodeLineEdit.text()
|
|
if not userName or not password or not confirmPassword:
|
|
InfoBar.warning(
|
|
"提示",
|
|
"你需要填写所有项",
|
|
Qt.Orientation.Horizontal,
|
|
True,
|
|
2000,
|
|
InfoBarPosition.TOP_RIGHT,
|
|
self.window(),
|
|
)
|
|
self.registerWidget.registerButton.setEnabled(True)
|
|
return
|
|
if password != confirmPassword:
|
|
InfoBar.warning(
|
|
"提示",
|
|
"两次输入的密码不一致",
|
|
Qt.Orientation.Horizontal,
|
|
True,
|
|
2000,
|
|
InfoBarPosition.TOP_RIGHT,
|
|
self.window(),
|
|
)
|
|
self.registerWidget.confirmPasswordLineEdit.clear()
|
|
self.registerWidget.registerButton.setEnabled(True)
|
|
return
|
|
self.registerThread = RegisterThread(userName, password, captchaCode)
|
|
self.registerThread.successRegister.connect(self._registerSuccess)
|
|
self.registerThread.errorRegister.connect(self._registerFailed)
|
|
self.registerThread.start()
|
|
|
|
def _registerSuccess(self):
|
|
InfoBar.info(
|
|
"成功",
|
|
"注册成功,请前往邮箱激活账号",
|
|
Qt.Orientation.Horizontal,
|
|
True,
|
|
-1,
|
|
InfoBarPosition.TOP_RIGHT,
|
|
self.window(),
|
|
)
|
|
|
|
self.stackedWidget.setCurrentWidget(self.loginWidget)
|
|
self.loginWidget.emailLineEdit.setText(self.registerWidget.emailLineEdit.text())
|
|
self.registerWidget.emailLineEdit.clear()
|
|
self.registerWidget.passwordLineEdit.clear()
|
|
self.registerWidget.confirmPasswordLineEdit.clear()
|
|
self.registerWidget.registerButton.setEnabled(True)
|
|
|
|
def _registerFailed(self, msg):
|
|
InfoBar.error(
|
|
"失败",
|
|
msg,
|
|
Qt.Orientation.Horizontal,
|
|
True,
|
|
1000,
|
|
InfoBarPosition.TOP_RIGHT,
|
|
self.window(),
|
|
)
|
|
self.registerWidget.refreshVerificationCode()
|
|
self.registerWidget.verificationCodeLineEdit.clear()
|
|
self.registerWidget.passwordLineEdit.clear()
|
|
self.registerWidget.confirmPasswordLineEdit.clear()
|
|
self.registerWidget.emailLineEdit.clear()
|
|
self.registerWidget.registerButton.setEnabled(True)
|