148 lines
5.4 KiB
Python
148 lines
5.4 KiB
Python
# 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"
|