summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-09-12 02:14:30 -0700
committerFuwn <[email protected]>2025-09-12 02:14:30 -0700
commite64905a7751ecc06495a58614738747d6c4cc9c7 (patch)
tree8c832fc1b5a01fb3fc0e6c743c4e79a8640a24e2
parentfeat: Development commit (diff)
downloadsora-testing-e64905a7751ecc06495a58614738747d6c4cc9c7.tar.xz
sora-testing-e64905a7751ecc06495a58614738747d6c4cc9c7.zip
feat: Development commit
-rw-r--r--Sora/Data/CollectionPickerOption.swift7
-rw-r--r--Sora/Views/FavoritesView.swift69
-rw-r--r--Sora/Views/Generic/GenericListView.swift81
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: {