mirror of
https://github.com/narrrl/proton-stream.git
synced 2026-11-04 00:47:00 +01:00
feat(core,app,android,ios): filter the library on every client, including by download
The library filter moves from the desktop into pstr_core::browse and gains a Downloaded filter: titles with at least one episode kept on the device. The bridge's arrangement() takes the filter. Android and iOS get a row of filter chips above the grid. The choice is remembered per device, and shelves stay hidden under a filter, as on the desktop.
This commit is contained in:
1 parent
fdf6b0359b
commit
eb67df0aa0
11 files changed
+292
-88
No files matched your search
@@ -47,6 +47,7 @@ final class AppModel {
|
||||
/// when the grid falls back to `titles` as they are.
|
||||
var arrangement: ArrangementRecord?
|
||||
/// As the viewer last left them.
|
||||
var filter: LibraryFilter = SettingsStore().libraryFilter
|
||||
var sort: LibrarySort = SettingsStore().librarySort
|
||||
var grouped = SettingsStore().libraryGrouped
|
||||
var shares: [ShareRecord] = []
|
||||
@@ -118,6 +119,13 @@ final class AppModel {
|
||||
Task { await reloadLibrary(query) }
|
||||
}
|
||||
|
||||
/// Narrow the grid to some titles, and keep the choice for the next launch.
|
||||
func setFilter(_ filter: LibraryFilter) {
|
||||
self.filter = filter
|
||||
SettingsStore().libraryFilter = filter
|
||||
Task { await reloadLibrary(query) }
|
||||
}
|
||||
|
||||
func search(_ query: String) {
|
||||
self.query = query
|
||||
searchTask?.cancel()
|
||||
@@ -787,6 +795,7 @@ final class AppModel {
|
||||
/// `reload`, for a caller that goes on to read what it loaded.
|
||||
func reloadNow() async {
|
||||
let query = query.trimmingCharacters(in: .whitespaces).isEmpty ? nil : self.query
|
||||
let filter = filter
|
||||
let sort = sort
|
||||
let grouped = grouped
|
||||
do {
|
||||
@@ -798,7 +807,7 @@ final class AppModel {
|
||||
return Reloaded(
|
||||
shares: try engine.shares(),
|
||||
titles: try engine.library(search: query),
|
||||
arrangement: try engine.arrangement(search: query, sort: sort, grouped: grouped),
|
||||
arrangement: try engine.arrangement(search: query, filter: filter, sort: sort, grouped: grouped),
|
||||
offline: try engine.offlineFiles(),
|
||||
metadataSettings: try engine.metadataSettings(),
|
||||
storage: try engine.storageUsage()
|
||||
@@ -819,11 +828,12 @@ final class AppModel {
|
||||
|
||||
private func reloadLibrary(_ query: String) async {
|
||||
let search = query.trimmingCharacters(in: .whitespaces).isEmpty ? nil : query
|
||||
let filter = filter
|
||||
let sort = sort
|
||||
let grouped = grouped
|
||||
do {
|
||||
let (titles, arrangement) = try await run { engine in
|
||||
(try engine.library(search: search), try engine.arrangement(search: search, sort: sort, grouped: grouped))
|
||||
(try engine.library(search: search), try engine.arrangement(search: search, filter: filter, sort: sort, grouped: grouped))
|
||||
}
|
||||
self.titles = titles
|
||||
self.arrangement = arrangement
|
||||
|
||||
Reference in new issue
Block a user