Persist media browser view options per source

Save sort order, sort direction, and show-only-playable filter to
UserDefaults keyed by source ID so preferences survive navigation.
This commit is contained in:
Arkadiusz Fal
2026-02-12 08:30:45 +01:00
parent a8c59e61cd
commit bcbd8f3350

View File

@@ -19,8 +19,8 @@ struct MediaBrowserView: View {
@State private var isLoading = false
@State private var error: MediaSourceError?
@State private var showOnlyPlayable: Bool
@State private var sortOrder: MediaBrowserSortOrder = .name
@State private var sortAscending = true
@State private var sortOrder: MediaBrowserSortOrder
@State private var sortAscending: Bool
@State private var showViewOptions = false
private var listStyle: VideoListStyle {
@@ -31,7 +31,19 @@ struct MediaBrowserView: View {
self.source = source
self.initialPath = path
_currentPath = State(initialValue: path)
_showOnlyPlayable = State(initialValue: showOnlyPlayable)
let defaults = UserDefaults.standard
let key = "mediaBrowser.\(source.id.uuidString)"
if let raw = defaults.string(forKey: "\(key).sortOrder"),
let saved = MediaBrowserSortOrder(rawValue: raw) {
_sortOrder = State(initialValue: saved)
} else {
_sortOrder = State(initialValue: .name)
}
_sortAscending = State(initialValue: defaults.object(forKey: "\(key).sortAscending") as? Bool ?? true)
_showOnlyPlayable = State(initialValue: defaults.object(forKey: "\(key).showOnlyPlayable") as? Bool ?? showOnlyPlayable)
}
/// Files filtered and sorted based on current settings.
@@ -114,6 +126,15 @@ struct MediaBrowserView: View {
.task {
await loadFiles()
}
.onChange(of: sortOrder) { _, newValue in
savePreference(newValue.rawValue, forKey: "sortOrder")
}
.onChange(of: sortAscending) { _, newValue in
savePreference(newValue, forKey: "sortAscending")
}
.onChange(of: showOnlyPlayable) { _, newValue in
savePreference(newValue, forKey: "showOnlyPlayable")
}
}
private var navigationTitle: String {
@@ -173,6 +194,12 @@ struct MediaBrowserView: View {
}
}
// MARK: - Preferences
private func savePreference(_ value: Any, forKey suffix: String) {
UserDefaults.standard.set(value, forKey: "mediaBrowser.\(source.id.uuidString).\(suffix)")
}
// MARK: - Loading
@MainActor