diff options
| author | Fuwn <[email protected]> | 2025-09-12 02:14:30 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-09-12 02:14:30 -0700 |
| commit | e64905a7751ecc06495a58614738747d6c4cc9c7 (patch) | |
| tree | 8c832fc1b5a01fb3fc0e6c743c4e79a8640a24e2 /Sora | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-e64905a7751ecc06495a58614738747d6c4cc9c7.tar.xz sora-testing-e64905a7751ecc06495a58614738747d6c4cc9c7.zip | |
feat: Development commit
Diffstat (limited to 'Sora')
| -rw-r--r-- | Sora/Data/CollectionPickerOption.swift | 7 | ||||
| -rw-r--r-- | Sora/Views/FavoritesView.swift | 69 | ||||
| -rw-r--r-- | Sora/Views/Generic/GenericListView.swift | 81 |
3 files changed, 102 insertions, 55 deletions
diff --git a/Sora/Data/CollectionPickerOption.swift b/Sora/Data/CollectionPickerOption.swift index 751e71c..930797a 100644 --- a/Sora/Data/CollectionPickerOption.swift +++ b/Sora/Data/CollectionPickerOption.swift @@ -3,6 +3,7 @@ import Foundation enum CollectionPickerOption: Identifiable, Hashable { case all case folder(UUID) + case topLevelFolder(String) case uncategorized var id: String { @@ -13,6 +14,9 @@ enum CollectionPickerOption: Identifiable, Hashable { case .folder(let id): return id.uuidString + case .topLevelFolder(let name): + return "topLevel_\(name)" + case .uncategorized: return "uncategorized" } @@ -27,6 +31,9 @@ enum CollectionPickerOption: Identifiable, Hashable { case .folder(let id): return settings.folderName(forID: id) ?? "Unknown Folder" + case .topLevelFolder(let name): + return name + case .uncategorized: return "Uncategorised" } diff --git a/Sora/Views/FavoritesView.swift b/Sora/Views/FavoritesView.swift index b7577f8..0a82ea1 100644 --- a/Sora/Views/FavoritesView.swift +++ b/Sora/Views/FavoritesView.swift @@ -35,6 +35,15 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length case .folder(let folderId): return favorite.folder == folderId + + case .topLevelFolder(let topLevelName): + guard let favoriteFolderId = favorite.folder, + let favoriteFolder = settings.folders.first(where: { $0.id == favoriteFolderId }) + else { + return false + } + + return favoriteFolder.topLevelName == topLevelName } }() let matchesSearch = @@ -203,38 +212,54 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length } Menu { - Picker("Collection", selection: $selectedCollectionOption) { - Text(CollectionPickerOption.all.name(settings: settings)) - .tag(CollectionPickerOption.all) + Button(action: { + selectedCollectionOption = .all + }) { + Label("All", systemImage: "folder") + } - if settings.favorites.contains(where: { $0.folder == nil }) { - Text(CollectionPickerOption.uncategorized.name(settings: settings)) - .tag(CollectionPickerOption.uncategorized) + if settings.favorites.contains(where: { $0.folder == nil }) { + Button(action: { + selectedCollectionOption = .uncategorized + }) { + Label("Uncategorised", systemImage: "folder.badge.questionmark") } + } - ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in - Text(folder.name).tag(CollectionPickerOption.folder(folder.id)) + ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in + Button(action: { + selectedCollectionOption = .folder(folder.id) + }) { + Label(folder.name, systemImage: "folder") } + } - let topLevelFolders = settings.folders - .reduce(into: [String: [SettingsFolder]]()) { result, folder in - guard let topLevelName = folder.topLevelName else { return } + let topLevelFolders = settings.folders + .reduce(into: [String: [SettingsFolder]]()) { result, folder in + guard let topLevelName = folder.topLevelName else { return } - result[topLevelName, default: []].append(folder) + result[topLevelName, default: []].append(folder) + } + + ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in + Menu { + Button(action: { + selectedCollectionOption = .topLevelFolder(topLevelName) + }) { + Label("All \(topLevelName)", systemImage: "folder.fill") } - ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in - Menu { - ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in - Button(action: { - selectedCollectionOption = .folder(folder.id) - }) { - Text(folder.shortName) - } + Divider() + + ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in + Button(action: { + selectedCollectionOption = .folder(folder.id) + }) { + Label(folder.shortName, systemImage: "folder") } - } label: { - Text(topLevelName) } + } label: { + Label(topLevelName, systemImage: "folder.fill") } } } label: { diff --git a/Sora/Views/Generic/GenericListView.swift b/Sora/Views/Generic/GenericListView.swift index 86559ee..eb2c153 100644 --- a/Sora/Views/Generic/GenericListView.swift +++ b/Sora/Views/Generic/GenericListView.swift @@ -43,6 +43,15 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View { case .folder(let folderId): return item.folder == folderId + + case .topLevelFolder(let topLevelName): + guard let itemFolderId = item.folder, + let itemFolder = settings.folders.first(where: { $0.id == itemFolderId }) + else { + return false + } + + return itemFolder.topLevelName == topLevelName } }() let matchesSearch = @@ -152,17 +161,7 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View { } ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in - Menu { - ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in - Button(action: { - selectedCollectionOption = .folder(folder.id) - }) { - Text(folder.shortName) - } - } - } label: { - Text(topLevelName) - } + Text(topLevelName).tag(CollectionPickerOption.topLevelFolder(topLevelName)) } } .padding(.bottom) @@ -235,38 +234,54 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View { } Menu { - Picker("Collection", selection: $selectedCollectionOption) { - Text(CollectionPickerOption.all.name(settings: settings)) - .tag(CollectionPickerOption.all) + Button(action: { + selectedCollectionOption = .all + }) { + Label("All", systemImage: "folder") + } - if items.contains(where: { $0.folder == nil }) { - Text(CollectionPickerOption.uncategorized.name(settings: settings)) - .tag(CollectionPickerOption.uncategorized) + if items.contains(where: { $0.folder == nil }) { + Button(action: { + selectedCollectionOption = .uncategorized + }) { + Label("Uncategorised", systemImage: "folder.badge.questionmark") } + } - ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in - Text(folder.name).tag(CollectionPickerOption.folder(folder.id)) + ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in + Button(action: { + selectedCollectionOption = .folder(folder.id) + }) { + Label(folder.name, systemImage: "folder") } + } - let topLevelFolders = settings.folders - .reduce(into: [String: [SettingsFolder]]()) { result, folder in - guard let topLevelName = folder.topLevelName else { return } + let topLevelFolders = settings.folders + .reduce(into: [String: [SettingsFolder]]()) { result, folder in + guard let topLevelName = folder.topLevelName else { return } - result[topLevelName, default: []].append(folder) + result[topLevelName, default: []].append(folder) + } + + ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in + Menu { + Button(action: { + selectedCollectionOption = .topLevelFolder(topLevelName) + }) { + Label("All \(topLevelName)", systemImage: "folder.fill") } - ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in - Menu { - ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in - Button(action: { - selectedCollectionOption = .folder(folder.id) - }) { - Text(folder.shortName) - } + Divider() + + ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in + Button(action: { + selectedCollectionOption = .folder(folder.id) + }) { + Label(folder.shortName, systemImage: "folder") } - } label: { - Text(topLevelName) } + } label: { + Label(topLevelName, systemImage: "folder.fill") } } } label: { |