Files
leonpan-pc/app/view/widgets/share_file_messageBox.py

148 lines
5.4 KiB
Python
Raw Normal View History

2025-10-29 22:20:21 +08:00
# 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"