Spaces:
Running
Running
| import re | |
| from pathlib import Path | |
| from PySide6.QtCore import QUrl, Qt | |
| from PySide6.QtGui import QDesktopServices | |
| from PySide6.QtWidgets import QLabel, QProgressBar, QHBoxLayout | |
| from videotrans.configure.config import tr | |
| from videotrans.util import tools | |
| class ClickableProgressBar(QLabel): | |
| def __init__(self, parent=None): | |
| super().__init__() | |
| self.target_dir = None | |
| self.msg = tr('running')#保存最后一条日志信息,当只有进度没有消息时显示 | |
| self.parent = parent | |
| self.basename = "" | |
| self.name = "" | |
| self.precent = 0 | |
| self.duration=0#已消耗的时间秒 | |
| self.paused = False | |
| self.ended = False | |
| self.error = '' | |
| self.progress_bar = QProgressBar(self) | |
| self.progress_bar.setFixedHeight(35) | |
| self.progress_bar.setRange(0, 100) # 设置进度范围 | |
| self.progress_bar.setTextVisible(True) | |
| self.progress_bar.setStyleSheet(""" | |
| QProgressBar { | |
| background-color: transparent; | |
| border:1px solid #32414B; | |
| color:#fff; | |
| height:35px; | |
| text-align:left; | |
| border-radius:3px; | |
| } | |
| QProgressBar::chunk { | |
| width: 8px; | |
| border-radius:0; | |
| } | |
| """) | |
| layout = QHBoxLayout(self) | |
| layout.addWidget(self.progress_bar) # 将进度条添加到布局 | |
| def setTarget(self, target_dir=None, name=None): | |
| self.target_dir = target_dir | |
| self.name = name | |
| self.basename = Path(name).name | |
| # 正常成功结束时,如果已有出错,则不处理 | |
| def setEnd(self): | |
| if self.error: | |
| return | |
| self.ended = True | |
| self.precent = 100 | |
| self.progress_bar.setValue(100) | |
| self.setCursor(Qt.PointingHandCursor) | |
| self.progress_bar.setFormat(f' {self.basename} {tr("endandopen")}') | |
| self.error = '' | |
| # 暂停,仅针对未完成的 | |
| def setPause(self): | |
| if not self.ended: | |
| self.paused = True | |
| self.progress_bar.setFormat(f' {tr("haspaused")} [{self.precent}%] {self.basename}') | |
| # 进度,如果进度已大于100则结束,如果小于,则取消暂停 | |
| def setPrecent(self, p): | |
| self.paused = False | |
| if p >= 100: | |
| self.precent = 100 | |
| self.error = '' | |
| self.setEnd() | |
| else: | |
| self.precent = p if p > self.precent else self.precent | |
| self.progress_bar.setValue(self.precent) | |
| self.progress_bar.setFormat(f' [{self.precent}% {self.duration}] {self.msg} {self.basename}') | |
| # 出错时,设置状态,停止 完成 | |
| def setError(self, text=""): | |
| self.error = text | |
| self.ended = True | |
| self.progress_bar.setToolTip( | |
| tr("Click to view the detailed error report")) | |
| self.progress_bar.setFormat(f' [{self.precent}%] {text[:90].strip()} {self.basename}') | |
| # 设置按钮显示文字,如果已结束,则不设置,直接返回 | |
| # 进度 set_precent 后将仅传进来时间,此时使用上次保留的msg消息 | |
| def setText(self, text=''): | |
| if self.progress_bar: | |
| if self.ended or self.paused: | |
| return | |
| if re.match(r'^\d+?$',text): | |
| # 更新时间 | |
| self.duration=text | |
| if self.precent < 60 and int(text)%5==0: | |
| self.precent+=0.001 | |
| elif text.strip(): | |
| self.msg=text[:150].replace("\n",'') | |
| self.progress_bar.setFormat(f' [{self.precent:.2f}% {self.duration}s] {self.msg} {self.basename}') # set text format | |
| def mousePressEvent(self, event): | |
| if self.target_dir and event.button() == Qt.LeftButton: | |
| if self.error: | |
| tools.show_error(self.error) | |
| QDesktopServices.openUrl(QUrl.fromLocalFile(self.target_dir)) | |