Files
leonpan-pc/app/view/components/file_deal_cards.py
2025-10-29 22:20:21 +08:00

264 lines
8.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# coding: utf-8
import os
from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtGui import QPixmap
from PyQt6.QtWidgets import QHBoxLayout, QVBoxLayout
from qfluentwidgets import (BodyLabel, CardWidget, FluentIcon, ImageLabel, InfoBar, InfoBarPosition, PrimaryToolButton,
ProgressBar, SubtitleLabel)
from app.core import (DownloadShareThread, DownloadThread, formatSize, getFileIcon, signalBus, UploadThread)
class UploadCard(CardWidget):
def __init__(self, fileType, filePath, parent=None):
super().__init__(parent=parent)
self.fileType = fileType
self.filePath = filePath
self.fileName = os.path.basename(filePath)
self.setFixedHeight(75)
self.hBoxLayout = QHBoxLayout(self)
self.infomationLayout = QVBoxLayout()
self.iconLabel = ImageLabel(self)
self.fileNameLabel = SubtitleLabel(self.fileName, self)
self.currentStatusLabel = BodyLabel("等待中...", self)
self.progressBar = ProgressBar(self)
self.progressBar.setValue(0)
self.cancelButton = PrimaryToolButton(FluentIcon.DELETE, self)
self.retryButton = PrimaryToolButton(FluentIcon.RETURN, self)
self.retryButton.clicked.connect(self.retryUpload)
self.cancelButton.clicked.connect(self.cancelUpload)
self.hBoxLayout.addWidget(
self.iconLabel, 0, Qt.AlignmentFlag.AlignCenter | Qt.AlignmentFlag.AlignLeft
)
self.hBoxLayout.addSpacing(5)
self.infomationLayout.addWidget(
self.fileNameLabel,
0,
Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft,
)
self.infomationLayout.addWidget(
self.currentStatusLabel,
0,
Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft,
)
self.infomationLayout.addWidget(self.progressBar)
self.hBoxLayout.addLayout(self.infomationLayout)
self.hBoxLayout.addSpacing(10)
self.hBoxLayout.addWidget(
self.retryButton,
0,
Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter,
)
self.hBoxLayout.addWidget(
self.cancelButton,
0,
Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter,
)
self.setIcon()
self.uploadThread = None
self.startUpload()
def startUpload(self):
self.retryButton.setEnabled(False)
self.uploadThread = UploadThread(self.filePath)
self.uploadThread.uploadApplicationApprovedSignal.connect(
self.uploadApplication
)
self.uploadThread.uploadFinished.connect(self.uploadFinished)
self.uploadThread.uploadFailed.connect(self.uploadFailed)
self.uploadThread.uploadProgress.connect(self.uploadProgress)
self.uploadThread.start()
def retryUpload(self):
self.currentStatusLabel.setText("重试...")
self.startUpload()
def cancelUpload(self):
if self.uploadThread:
self.progressBar.setValue(0)
self.selfDelete()
else:
self.selfDelete()
def selfDelete(self):
self.currentStatusLabel.setText("取消中...")
self.cancelButton.setEnabled(False)
self.retryButton.setEnabled(False)
if self.uploadThread:
self.uploadThread.cancelUpload()
self.uploadThread.terminate()
self.uploadThread = None
QTimer.singleShot(1000, self.deleteLater)
def uploadApplication(self):
self.currentStatusLabel.setText("已向服务器提交任务,读取文件中...")
def uploadFinished(self):
self.currentStatusLabel.setText("上传成功")
InfoBar.success(
"成功",
f"{self.fileName}上传成功,请注意查看~",
Qt.Orientation.Horizontal,
True,
5000,
InfoBarPosition.BOTTOM_RIGHT,
InfoBar.desktopView(),
)
signalBus.refreshFolderListSignal.emit()
self.retryButton.setEnabled(False)
self.progressBar.setValue(100)
def uploadProgress(self, progress, uploaded_size, total_size):
self.progressBar.setValue(int(progress))
self.currentStatusLabel.setText(
f"上传中...({formatSize(uploaded_size)}/{formatSize(total_size)})"
)
def uploadFailed(self, error_message):
self.currentStatusLabel.setText(f"上传失败:{error_message}")
self.progressBar.setValue(0)
self.retryButton.setEnabled(True)
self.uploadThread.terminate()
self.uploadThread = None
def setIcon(self):
icon_name = getFileIcon("file", self.fileName)
self.iconLabel.setImage(QPixmap(f":app/icons/{icon_name}"))
self.iconLabel.scaledToHeight(50)
self.iconLabel.scaledToWidth(50)
class DownloadCard(CardWidget):
def __init__(self, suffix, fileName, _id, parent=None):
super().__init__(parent=parent)
self._id = _id
self.suffix = suffix
self.setFixedHeight(75)
self.hBoxLayout = QHBoxLayout(self)
self.infomationLayout = QVBoxLayout()
self.iconLabel = ImageLabel(self)
self.fileNameLabel = SubtitleLabel(fileName, self)
self.currentStatusLabel = BodyLabel("请求中...", self)
self.progressBar = ProgressBar(self)
self.progressBar.setValue(0)
self.cancelButton = PrimaryToolButton(FluentIcon.DELETE, self)
self.cancelButton.clicked.connect(self.cancelDownload)
self.hBoxLayout.addWidget(
self.iconLabel, 0, Qt.AlignmentFlag.AlignCenter | Qt.AlignmentFlag.AlignLeft
)
self.hBoxLayout.addSpacing(5)
self.infomationLayout.addWidget(
self.fileNameLabel,
0,
Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft,
)
self.infomationLayout.addWidget(
self.currentStatusLabel,
0,
Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft,
)
self.infomationLayout.addWidget(self.progressBar)
self.hBoxLayout.addLayout(self.infomationLayout)
self.hBoxLayout.addSpacing(10)
self.hBoxLayout.addWidget(
self.cancelButton,
0,
Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter,
)
suffix = self.suffix.split(".")[1].lower()
self._type = self.suffix.split(".")[0].lower()
self.setIcon(suffix)
self.downloadThread = None
self.startUpload()
def startUpload(self):
if self._type == "own":
# 同时传递file_id和file_path确保file_path不为空
# 对于own类型使用self._id作为file_path因为它已经包含了完整的cloudreve://格式路径
self.downloadThread = DownloadThread(self._id, self._id)
elif self._type == "share":
self.downloadThread = DownloadShareThread(self._id)
self.downloadThread.downloadUrlAcquired.connect(self.downloadUrlAcquired)
self.downloadThread.downloadFinished.connect(self.downloadFinished)
self.downloadThread.downloadFailed.connect(self.downloadFailed)
self.downloadThread.downloadProgress.connect(self.downloadProgress)
self.downloadThread.start()
def cancelDownload(self):
if self.downloadThread:
self.progressBar.setValue(0)
self.selfDelete()
else:
self.selfDelete()
def selfDelete(self):
self.currentStatusLabel.setText("取消中...")
self.cancelButton.setEnabled(False)
if self.downloadThread:
self.downloadThread.cancelDownload()
self.downloadThread.terminate()
self.downloadThread = None
QTimer.singleShot(1000, self.deleteLater)
def downloadUrlAcquired(self):
self.currentStatusLabel.setText("成功获取下载链接,准备下载...")
def downloadFinished(self):
self.currentStatusLabel.setText("下载成功")
InfoBar.success(
"成功",
f"{self._id}下载成功,请注意查看~",
Qt.Orientation.Horizontal,
True,
5000,
InfoBarPosition.BOTTOM_RIGHT,
InfoBar.desktopView(),
)
self.progressBar.setValue(100)
def downloadProgress(self, progress, uploaded_size, total_size):
self.progressBar.setValue(int(progress))
self.currentStatusLabel.setText(
f"下载中...({formatSize(uploaded_size)}/{formatSize(total_size)})"
)
def downloadFailed(self, error_message):
self.currentStatusLabel.setText(f"下载失败:{error_message}")
self.progressBar.setValue(0)
self.downloadThread.terminate()
self.downloadThread = None
def setIcon(self, fileName):
icon_name = getFileIcon("file", fileName)
self.iconLabel.setImage(QPixmap(f":app/icons/{icon_name}"))
self.iconLabel.scaledToHeight(50)
self.iconLabel.scaledToWidth(50)