Skip to content

Commit 11da49c

Browse files
committed
feat(bittorrent): 完善BitTorrent功能实现
- 实现了种子文件类型识别和分类功能,支持视频、音频、图片等7种文件类型 - 添加了种子文件选择对话框的批量操作功能,包括全选、反选、按类型选择等 - 集成了本地种子文件路径解析支持,允许直接打开本地.torrent文件 - 优化了种子任务状态显示,增加了上传速度、分享率、做种时间等信息 - 重构了AutoSizingEdit组件,改进了文本编辑器的尺寸
1 parent f8c69c9 commit 11da49c

File tree

7 files changed

+310
-140
lines changed

7 files changed

+310
-140
lines changed

app/view/components/add_task_dialog.py

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@
33
from pathlib import Path
44
from typing import Any, Self
55

6-
from PySide6.QtCore import QEvent, Qt, QPoint, QTimer, Signal, QSize
6+
from PySide6.QtCore import QEvent, Qt, QPoint, QTimer, Signal
77
from PySide6.QtGui import QTextOption
8-
from PySide6.QtWidgets import QDialog, QFileDialog, QSizePolicy
8+
from PySide6.QtWidgets import QDialog, QFileDialog
99
from loguru import logger
1010
from qfluentwidgets import (
1111
MessageBoxBase,
1212
SubtitleLabel,
1313
LineEdit,
1414
Action,
1515
FluentIcon,
16-
PlainTextEdit,
1716
InfoBar,
1817
InfoBarPosition,
1918
)
@@ -28,6 +27,7 @@
2827
ParseSettingHeaderCardWidget,
2928
)
3029
from app.view.components.cards import ParseSettingCard, ResultCard
30+
from app.view.components.editors import AutoSizingEdit
3131

3232

3333
class SelectFolderCard(ParseSettingCard):
@@ -76,44 +76,6 @@ class _AcceptedPendingParse:
7676
payload: dict[str, Any]
7777

7878

79-
class AutoSizingEdit(PlainTextEdit):
80-
def __init__(self, parent=None, minimumVisibleLines: int = 5):
81-
super().__init__(parent)
82-
self._minimumVisibleLines = minimumVisibleLines
83-
self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Maximum)
84-
self.document().blockCountChanged.connect(self.updateGeometry)
85-
86-
def _lineHeight(self) -> int:
87-
return self.fontMetrics().lineSpacing()
88-
89-
def _editorChromeHeight(self) -> int:
90-
margins = self.contentsMargins()
91-
viewportMargins = self.viewportMargins()
92-
documentMargin = round(self.document().documentMargin() * 2)
93-
return (
94-
margins.top()
95-
+ margins.bottom()
96-
+ viewportMargins.top()
97-
+ viewportMargins.bottom()
98-
+ self.frameWidth() * 2
99-
+ documentMargin
100-
)
101-
102-
def _sizeHintForLineCount(self, lineCount: int) -> QSize:
103-
size = super().sizeHint()
104-
height = self._editorChromeHeight() + self._lineHeight() * lineCount
105-
return QSize(size.width(), height)
106-
107-
def minimumSizeHint(self) -> QSize:
108-
return self._sizeHintForLineCount(min(self._minimumVisibleLines, self.document().blockCount()))
109-
110-
def maximumSizeHint(self) -> QSize:
111-
return self._sizeHintForLineCount(self.document().blockCount())
112-
113-
def sizeHint(self) -> QSize:
114-
return self.maximumSizeHint().expandedTo(self.minimumSizeHint())
115-
116-
11779
class AddTaskDialog(MessageBoxBase):
11880
taskConfirmed = Signal(object)
11981

app/view/components/editors.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from PySide6.QtCore import QSize
2+
from PySide6.QtWidgets import QSizePolicy
3+
from qfluentwidgets import PlainTextEdit
4+
5+
6+
class AutoSizingEdit(PlainTextEdit):
7+
def __init__(self, parent=None, minimumVisibleLines: int = 5):
8+
super().__init__(parent)
9+
self._minimumVisibleLines = minimumVisibleLines
10+
self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Maximum)
11+
self.document().blockCountChanged.connect(self.updateGeometry)
12+
13+
def _lineHeight(self) -> int:
14+
return self.fontMetrics().lineSpacing()
15+
16+
def _editorChromeHeight(self) -> int:
17+
margins = self.contentsMargins()
18+
viewportMargins = self.viewportMargins()
19+
documentMargin = round(self.document().documentMargin() * 2)
20+
return (
21+
margins.top()
22+
+ margins.bottom()
23+
+ viewportMargins.top()
24+
+ viewportMargins.bottom()
25+
+ self.frameWidth() * 2
26+
+ documentMargin
27+
)
28+
29+
def _sizeHintForLineCount(self, lineCount: int) -> QSize:
30+
size = super().sizeHint()
31+
height = self._editorChromeHeight() + self._lineHeight() * lineCount
32+
return QSize(size.width(), height)
33+
34+
def minimumSizeHint(self) -> QSize:
35+
return self._sizeHintForLineCount(min(self._minimumVisibleLines, self.document().blockCount()))
36+
37+
def maximumSizeHint(self) -> QSize:
38+
return self._sizeHintForLineCount(self.document().blockCount())
39+
40+
def sizeHint(self) -> QSize:
41+
return self.maximumSizeHint().expandedTo(self.minimumSizeHint())

app/view/components/labels.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@ def __init__(self, text: str, icon: "FluentIconBase", parent=None, size: int = 1
1414
super().__init__(parent)
1515
self.size = size
1616
self.setText(text)
17-
self.icon = icon
1817
self.setContentsMargins(size + 4, 0, 0, 2) # 给 Icon 和 Text 之间留出 4px 的间距
1918
self.setMinimumHeight(size)
19+
self.setIcon(icon)
20+
21+
def setIcon(self, icon: "FluentIconBase"):
22+
self.icon = icon
2023
self.cachedIconKey = self.preCacheIcon()
24+
self.update()
2125

2226
def preCacheIcon(self):
2327
"""预缓存图标并返回缓存键"""

0 commit comments

Comments
 (0)