From 119a3a18b15bb2a221bd3494f7810bdee35ef1d6 Mon Sep 17 00:00:00 2001 From: kingbri Date: Tue, 26 Jul 2022 11:06:23 -0400 Subject: [PATCH] SearchResults: Add source filtering Presenting all source results can be annoying to a user. Add filtering to filter by a specific source. Signed-off-by: kingbri --- Ferrite.xcodeproj/project.pbxproj | 4 + Ferrite/ViewModels/ScrapingViewModel.swift | 3 +- Ferrite/Views/ContentView.swift | 53 ++++++++++++- Ferrite/Views/SearchResultRDView.swift | 49 ++++++++++++ Ferrite/Views/SearchResultsView.swift | 88 ++++++++-------------- Ferrite/Views/SourceListView.swift | 2 +- 6 files changed, 137 insertions(+), 62 deletions(-) create mode 100644 Ferrite/Views/SearchResultRDView.swift diff --git a/Ferrite.xcodeproj/project.pbxproj b/Ferrite.xcodeproj/project.pbxproj index 2324834..3a9f869 100644 --- a/Ferrite.xcodeproj/project.pbxproj +++ b/Ferrite.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 0C0D50E2288DF7700035ECC8 /* TorrentSource+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C0D50E0288DF7700035ECC8 /* TorrentSource+CoreDataProperties.swift */; }; 0C0D50E5288DFE7F0035ECC8 /* SourceModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C0D50E4288DFE7F0035ECC8 /* SourceModels.swift */; }; 0C0D50E7288DFF850035ECC8 /* SourceListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C0D50E6288DFF850035ECC8 /* SourceListView.swift */; }; + 0C57D4CC289032ED008534E8 /* SearchResultRDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C57D4CB289032ED008534E8 /* SearchResultRDView.swift */; }; 0C64A4B4288903680079976D /* Base32 in Frameworks */ = {isa = PBXBuildFile; productRef = 0C64A4B3288903680079976D /* Base32 */; }; 0C64A4B7288903880079976D /* KeychainSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 0C64A4B6288903880079976D /* KeychainSwift */; }; 0C90E32C2888E5D000C0BC89 /* ActivityView in Frameworks */ = {isa = PBXBuildFile; productRef = 0C90E32B2888E5D000C0BC89 /* ActivityView */; }; @@ -52,6 +53,7 @@ 0C0D50E0288DF7700035ECC8 /* TorrentSource+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TorrentSource+CoreDataProperties.swift"; sourceTree = ""; }; 0C0D50E4288DFE7F0035ECC8 /* SourceModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceModels.swift; sourceTree = ""; }; 0C0D50E6288DFF850035ECC8 /* SourceListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceListView.swift; sourceTree = ""; }; + 0C57D4CB289032ED008534E8 /* SearchResultRDView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultRDView.swift; sourceTree = ""; }; 0CA05456288EE58200850554 /* SettingsSourceUrlView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSourceUrlView.swift; sourceTree = ""; }; 0CA05458288EE9E600850554 /* SourceManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceManager.swift; sourceTree = ""; }; 0CA0545A288EEA4E00850554 /* SourceListEditorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceListEditorView.swift; sourceTree = ""; }; @@ -179,6 +181,7 @@ 0CA148C0288903F000DE2211 /* CommonViews */, 0CA0545C288F7CB200850554 /* SettingsViews */, 0CA148D3288903F000DE2211 /* SearchResultsView.swift */, + 0C57D4CB289032ED008534E8 /* SearchResultRDView.swift */, 0CA148D4288903F000DE2211 /* ContentView.swift */, 0CA148D1288903F000DE2211 /* MainView.swift */, 0CA148BB288903F000DE2211 /* SettingsView.swift */, @@ -346,6 +349,7 @@ 0CA148E6288903F000DE2211 /* WebView.swift in Sources */, 0CA148E2288903F000DE2211 /* Data.swift in Sources */, 0C0D50E1288DF7700035ECC8 /* TorrentSource+CoreDataClass.swift in Sources */, + 0C57D4CC289032ED008534E8 /* SearchResultRDView.swift in Sources */, 0CA05459288EE9E600850554 /* SourceManager.swift in Sources */, 0CA05457288EE58200850554 /* SettingsSourceUrlView.swift in Sources */, 0CA148DE288903F000DE2211 /* RealDebridModels.swift in Sources */, diff --git a/Ferrite/ViewModels/ScrapingViewModel.swift b/Ferrite/ViewModels/ScrapingViewModel.swift index 2372c03..0062b38 100644 --- a/Ferrite/ViewModels/ScrapingViewModel.swift +++ b/Ferrite/ViewModels/ScrapingViewModel.swift @@ -27,9 +27,10 @@ class ScrapingViewModel: ObservableObject { @Published var debridHashes: [String] = [] @Published var searchText: String = "" @Published var selectedSearchResult: SearchResult? + @Published var filteredSource: TorrentSource? @MainActor - public func scanSources(sources: FetchedResults) async { + public func scanSources(sources: [TorrentSource]) async { if sources.isEmpty { print("Sources empty") } diff --git a/Ferrite/Views/ContentView.swift b/Ferrite/Views/ContentView.swift index 4451096..9a173fb 100644 --- a/Ferrite/Views/ContentView.swift +++ b/Ferrite/Views/ContentView.swift @@ -18,21 +18,70 @@ struct ContentView: View { sortDescriptors: [] ) var sources: FetchedResults + @State private var selectedSource: TorrentSource? { + didSet { + scrapingModel.filteredSource = selectedSource + } + } + var body: some View { NavView { - VStack { + VStack(spacing: 10) { + HStack { + Text("Filter") + .foregroundColor(.secondary) + + Menu { + Button { + selectedSource = nil + } label: { + Text("None") + + if (selectedSource == nil) { + Image(systemName: "checkmark") + } + } + + ForEach(sources, id: \.self) { source in + if let name = source.name, source.enabled { + Button { + selectedSource = source + } label: { + Text(name) + + if selectedSource == source { + Image(systemName: "checkmark") + } + } + } + } + } label: { + Text(selectedSource?.name ?? "Source") + .padding(.trailing, -3) + Image(systemName: "chevron.down") + } + .foregroundColor(.primary) + + Spacer() + } + .padding(.horizontal, 20) + SearchResultsView() } .searchable(text: $scrapingModel.searchText) .onSubmit(of: .search) { Task { - await scrapingModel.scanSources(sources: sources) + await scrapingModel.scanSources(sources: sources.compactMap { $0 }) await debridManager.populateDebridHashes(scrapingModel.searchResults) } } .navigationTitle("Search") } } + + func performSearch() { + + } } struct ContentView_Previews: PreviewProvider { diff --git a/Ferrite/Views/SearchResultRDView.swift b/Ferrite/Views/SearchResultRDView.swift new file mode 100644 index 0000000..0183285 --- /dev/null +++ b/Ferrite/Views/SearchResultRDView.swift @@ -0,0 +1,49 @@ +// +// SearchResultRDView.swift +// Ferrite +// +// Created by Brian Dashore on 7/26/22. +// + +import SwiftUI + +struct SearchResultRDView: View { + @EnvironmentObject var debridManager: DebridManager + + @AppStorage("RealDebrid.Enabled") var realDebridEnabled = false + + var result: SearchResult + + var body: some View { + HStack { + Text(result.source) + + Spacer() + + Text(result.size) + + if realDebridEnabled { + Text("RD") + .fontWeight(.bold) + .padding(2) + .background { + switch debridManager.matchSearchResult(result: result) { + case .full: + Color.green + .cornerRadius(4) + .opacity(0.5) + case .partial: + Color.orange + .cornerRadius(4) + .opacity(0.5) + case .none: + Color.red + .cornerRadius(4) + .opacity(0.5) + } + } + } + } + .font(.caption) + } +} diff --git a/Ferrite/Views/SearchResultsView.swift b/Ferrite/Views/SearchResultsView.swift index c860091..720860e 100644 --- a/Ferrite/Views/SearchResultsView.swift +++ b/Ferrite/Views/SearchResultsView.swift @@ -9,7 +9,6 @@ import SwiftUI struct SearchResultsView: View { @Environment(\.isSearching) var isSearching - @Environment(\.colorScheme) var colorScheme @EnvironmentObject var scrapingModel: ScrapingViewModel @EnvironmentObject var debridManager: DebridManager @@ -20,69 +19,42 @@ struct SearchResultsView: View { var body: some View { List { ForEach(scrapingModel.searchResults, id: \.self) { result in - VStack(alignment: .leading) { - Button { - scrapingModel.selectedSearchResult = result + if result.source == scrapingModel.filteredSource?.name || scrapingModel.filteredSource == nil { + VStack(alignment: .leading) { + Button { + scrapingModel.selectedSearchResult = result - switch debridManager.matchSearchResult(result: result) { - case .full: - Task { - await debridManager.fetchRdDownload(searchResult: result) + switch debridManager.matchSearchResult(result: result) { + case .full: + Task { + await debridManager.fetchRdDownload(searchResult: result) + navigationModel.currentChoiceSheet = .magnet + } + case .partial: + if debridManager.setSelectedRdResult(result: result) { + navigationModel.currentChoiceSheet = .batch + } + case .none: navigationModel.currentChoiceSheet = .magnet } - case .partial: - if debridManager.setSelectedRdResult(result: result) { - navigationModel.currentChoiceSheet = .batch + } label: { + Text(result.title) + .font(.callout) + .fixedSize(horizontal: false, vertical: true) + } + .sheet(item: $navigationModel.currentChoiceSheet) { item in + switch item { + case .magnet: + MagnetChoiceView() + case .batch: + BatchChoiceView() } - case .none: - navigationModel.currentChoiceSheet = .magnet } - } label: { - Text(result.title) - .font(.callout) - .fixedSize(horizontal: false, vertical: true) + .tint(.primary) + .padding(.bottom, 5) + + SearchResultRDView(result: result) } - .sheet(item: $navigationModel.currentChoiceSheet) { item in - switch item { - case .magnet: - MagnetChoiceView() - case .batch: - BatchChoiceView() - } - } - .tint(colorScheme == .light ? .black : .white) - .padding(.bottom, 5) - - HStack { - Text(result.source) - - Spacer() - - Text(result.size) - - if realDebridEnabled { - Text("RD") - .fontWeight(.bold) - .padding(2) - .background { - switch debridManager.matchSearchResult(result: result) { - case .full: - Color.green - .cornerRadius(4) - .opacity(0.5) - case .partial: - Color.orange - .cornerRadius(4) - .opacity(0.5) - case .none: - Color.red - .cornerRadius(4) - .opacity(0.5) - } - } - } - } - .font(.caption) } } } diff --git a/Ferrite/Views/SourceListView.swift b/Ferrite/Views/SourceListView.swift index 0a0e0c5..5feeca0 100644 --- a/Ferrite/Views/SourceListView.swift +++ b/Ferrite/Views/SourceListView.swift @@ -29,7 +29,7 @@ struct SourceListView: View { get: { source.enabled }, set: { source.enabled = $0 - PersistenceController.shared.save(backgroundContext) + PersistenceController.shared.save() })) { Text(source.name ?? "Unknown Source") }