init
This commit is contained in:
147
app/view/widgets/share_file_messageBox.py
Normal file
147
app/view/widgets/share_file_messageBox.py
Normal file
@@ -0,0 +1,147 @@
|
||||
# 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"
|
||||
Reference in New Issue
Block a user