# coding: utf-8 from loguru import logger from PyQt6.QtCore import Qt, QTimer, QUrl from PyQt6.QtGui import QPixmap from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkReply, QNetworkRequest from PyQt6.QtWidgets import QHBoxLayout from qfluentwidgets import (BodyLabel, HorizontalSeparator, ImageLabel, InfoBar, InfoBarPosition, MessageBoxBase, SubtitleLabel) from app.core import formatDate, formatSize, GetShareFileInfoThread, signalBus class ShareFileMessageBox(MessageBoxBase): def __init__(self, _id, fileIcon=None, suffix="", parent=None): super().__init__(parent=parent) self.widget.setFixedWidth(350) self.suffix = suffix self._id = _id self.fileTypeImageLabel = ImageLabel(parent=self) self.fileTypeImageLabel.setImage(fileIcon) self.fileTypeImageLabel.scaledToHeight(60) self.fileTypeImageLabel.scaledToWidth(60) self.fileNameLabel = SubtitleLabel(parent=self) self.fileSizeLabel = BodyLabel(parent=self) self.fileInformationLabel = BodyLabel(parent=self) self.fileInformationLabel.setAlignment(Qt.AlignmentFlag.AlignHCenter) self.userImageLabel = ImageLabel(":app/images/logo.png", parent=self) self.userImageLabel.setBorderRadius(20, 20, 20, 20) self.userImageLabel.setFixedSize(30, 30) self.userImageLabel.scaledToHeight(30) self.userImageLabel.scaledToWidth(30) self.userNameLabel = SubtitleLabel(parent=self) self.userLayout = QHBoxLayout() self.userLayout.addWidget(self.userImageLabel) self.userLayout.addWidget(self.userNameLabel) self.viewLayout.addWidget( self.fileTypeImageLabel, 0, Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignHCenter, ) self.viewLayout.addWidget( self.fileNameLabel, 0, Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignHCenter, ) self.viewLayout.addWidget( self.fileSizeLabel, 0, Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignHCenter, ) self.viewLayout.addWidget( self.fileInformationLabel, 0, Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignHCenter, ) self.viewLayout.addWidget(HorizontalSeparator(parent=self)) self.viewLayout.addLayout(self.userLayout) self.yesButton.setText("下载") self.yesButton.clicked.connect(self.downloadFile) self.cancelButton.setText("取消") self.apiWorker = GetShareFileInfoThread(_id) self.apiWorker.shareFileInfoSignal.connect(self.handleApiResponse) self.apiWorker.errorSignal.connect(self.handleError) self.apiWorker.start() self.networkManager = QNetworkAccessManager(self) self.networkManager.finished.connect(self.onAvatarDownloaded) def downloadFile(self): signalBus.addDownloadFileTask.emit( f"share.{self.suffix}", self.fileNameLabel.text(), f"undefined/undefined.{self._id}", ) self.accept() def handleApiResponse(self, response_data): response_data = response_data["data"] self.fileNameLabel.setText(response_data["source"]["name"]) self.fileSizeLabel.setText( f"大小: {formatSize(response_data['source']['size'])}" ) infoLabel = f"创建时间: {formatDate(response_data['create_date'])}\n浏览次数: {response_data['views']}\n下载次数: {response_data['downloads']}" self.fileInformationLabel.setText(infoLabel) self.userNameLabel.setText(response_data["creator"]["nick"]) self.loadAvatarFromId(response_data["creator"]["key"]) def handleError(self, msg): InfoBar.error( "失败", msg, Qt.Orientation.Horizontal, True, 1000, InfoBarPosition.TOP_RIGHT, self.window(), ) QTimer.singleShot(1000, self.accept) def loadAvatarFromId(self, _id): """从网络URL加载头像""" # 使用V4 API获取头像 - 假设格式变为/api/v4/user/avatar/{_id}/l url = f"/user/avatar/{_id}/l" logger.info(f"开始从网络加载头像") request = QNetworkRequest(QUrl(url)) self.networkManager.get(request) def onAvatarDownloaded(self, reply): """处理头像下载完成""" if reply.error() == QNetworkReply.NetworkError.NoError: # 读取下载的数据 data = reply.readAll() # 创建QPixmap并加载数据 pixmap = QPixmap() if pixmap.loadFromData(data): # 更新头像 self.userImageLabel.setImage(pixmap) logger.info("网络头像加载成功") else: logger.error("头像数据格式不支持") else: logger.error(f"头像下载失败: {reply.errorString()}") pixmap = QPixmap(":app/images/logo.png") self.userImageLabel.setImage(pixmap) logger.info("使用默认头像") self.userImageLabel.scaledToHeight(30) self.userImageLabel.scaledToWidth(30) reply.deleteLater() def format_size(self, size): """格式化文件大小""" for unit in ["B", "KB", "MB", "GB", "TB"]: if size < 1024: return f"{size:.2f} {unit}" size /= 1024 return f"{size:.2f} PB"