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)