From 2a53f6a862b55c0f901dc9b55987e322db346508 Mon Sep 17 00:00:00 2001 From: William Date: Tue, 30 Jun 2026 11:47:24 +0600 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E8=B7=A8=E9=A1=B5?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=92=8C=E6=89=B9=E9=87=8F=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=EF=BC=8C=E9=BB=98=E8=AE=A4=E6=AF=8F=E9=A1=B510=E6=9D=A1?= =?UTF-8?q?=EF=BC=8C=E5=85=A8=E9=80=89=E4=BD=9C=E7=94=A8=E4=BA=8E=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E5=8C=B9=E9=85=8D=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VODManager/Views/VideoListView.swift | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/apps/macos/VODManager/Sources/VODManager/Views/VideoListView.swift b/apps/macos/VODManager/Sources/VODManager/Views/VideoListView.swift index 960b226..f3db59e 100644 --- a/apps/macos/VODManager/Sources/VODManager/Views/VideoListView.swift +++ b/apps/macos/VODManager/Sources/VODManager/Views/VideoListView.swift @@ -12,11 +12,15 @@ struct VideoListView: View { @State private var showDownloadPanel = false @State private var downloadResults: [(video: VideoItem, playInfos: [PlayInfo])] = [] - private let pageSizes = [20, 50, 100] + private let pageSizes = [10, 20, 50, 100] @State private var pageSizeIndex = 0 private var pageSize: Int { pageSizes[pageSizeIndex] } @State private var pageNo = 1 private var totalPages: Int { max(1, (filteredVideos.count + pageSize - 1) / pageSize) } + private var currentPageSelectedCount: Int { + let currentPageIds = Set(displayVideos.map(\.videoId)) + return selectedVideos.intersection(currentPageIds).count + } var body: some View { VStack(spacing: 0) { @@ -54,10 +58,10 @@ struct VideoListView: View { .disabled(selectedVideos.isEmpty || isLoading) Button("全选") { - if selectedVideos.count == displayVideos.count { + if selectedVideos.count == filteredVideos.count { selectedVideos.removeAll() } else { - selectedVideos = Set(displayVideos.map(\.videoId)) + selectedVideos = Set(filteredVideos.map(\.videoId)) } } @@ -165,6 +169,15 @@ struct VideoListView: View { HStack { Text("共 \(filteredVideos.count) 条,已选 \(selectedVideos.count) 个") .foregroundStyle(.secondary) + + if !selectedVideos.isEmpty { + Button("取消选择") { + selectedVideos.removeAll() + } + .buttonStyle(.borderless) + .foregroundStyle(.secondary) + } + Spacer() Picker("每页", selection: $pageSizeIndex) { @@ -277,7 +290,7 @@ struct VideoListView: View { loadingStatus = "" var results: [(video: VideoItem, playInfos: [PlayInfo])] = [] var errors: [String] = [] - let selected = displayVideos.filter { selectedVideos.contains($0.videoId) } + let selected = filteredVideos.filter { selectedVideos.contains($0.videoId) } for (index, video) in selected.enumerated() { loadingStatus = "正在获取下载地址 (\(index + 1)/\(selected.count))「\(video.title)」..." let playInfos = await fetchPlayInfoWithRetry(videoId: video.videoId, title: video.title, maxRetries: 3)