diff --git a/Memola.xcodeproj/project.pbxproj b/Memola.xcodeproj/project.pbxproj index 131c62d..f2e3a84 100644 --- a/Memola.xcodeproj/project.pbxproj +++ b/Memola.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ EC0D14262BF7A8C9009BFE5F /* PenObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14252BF7A8C9009BFE5F /* PenObject.swift */; }; EC0D14282BF7BF20009BFE5F /* ContextMenuViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14272BF7BF20009BFE5F /* ContextMenuViewModifier.swift */; }; EC1815082C2D980B00541369 /* Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1815072C2D980B00541369 /* Sort.swift */; }; + EC18150A2C2DA09E00541369 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1815092C2DA09E00541369 /* Filter.swift */; }; EC1B783D2BFA0AC9005A34E2 /* Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1B783C2BFA0AC9005A34E2 /* Toolbar.swift */; }; EC2106AD2C10C2A700FBE27C /* AnyStroke.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC2106AC2C10C2A700FBE27C /* AnyStroke.swift */; }; EC2BEBF42C0F5FF7005DB0AF /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC2BEBF32C0F5FF7005DB0AF /* RTree.swift */; }; @@ -119,6 +120,7 @@ EC0D14252BF7A8C9009BFE5F /* PenObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PenObject.swift; sourceTree = ""; }; EC0D14272BF7BF20009BFE5F /* ContextMenuViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuViewModifier.swift; sourceTree = ""; }; EC1815072C2D980B00541369 /* Sort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sort.swift; sourceTree = ""; }; + EC1815092C2DA09E00541369 /* Filter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Filter.swift; sourceTree = ""; }; EC1B783C2BFA0AC9005A34E2 /* Toolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toolbar.swift; sourceTree = ""; }; EC2106AC2C10C2A700FBE27C /* AnyStroke.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyStroke.swift; sourceTree = ""; }; EC2BEBF32C0F5FF7005DB0AF /* RTree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RTree.swift; sourceTree = ""; }; @@ -414,6 +416,7 @@ children = ( ECA738792BE5EF0400A4542E /* MemosView.swift */, EC1815072C2D980B00541369 /* Sort.swift */, + EC1815092C2DA09E00541369 /* Filter.swift */, ); path = Memos; sourceTree = ""; @@ -869,6 +872,7 @@ files = ( ECA738B02BE60D0B00A4542E /* CanvasViewController.swift in Sources */, ECD12A912C1B04EA00B96E12 /* PhotoRenderPass.swift in Sources */, + EC18150A2C2DA09E00541369 /* Filter.swift in Sources */, EC5D40812C21CE270067F090 /* PhotoBackgroundRenderPass.swift in Sources */, ECA738E42BE6110800A4542E /* Drawable.swift in Sources */, ECA738AD2BE60CC600A4542E /* DrawingView.swift in Sources */, diff --git a/Memola/Features/Memos/Filter.swift b/Memola/Features/Memos/Filter.swift new file mode 100644 index 0000000..4a874f5 --- /dev/null +++ b/Memola/Features/Memos/Filter.swift @@ -0,0 +1,26 @@ +// +// Filter.swift +// Memola +// +// Created by Dscyre Scotti on 6/27/24. +// + +import Foundation + +enum Filter: String, Identifiable, Hashable, Equatable { + var id: String { + rawValue + } + + case none + case favorites + + var name: String { + switch self { + case .none: return "All" + case .favorites: return "Favorites" + } + } + + static let all: [Filter] = [.none, .favorites] +} diff --git a/Memola/Features/Memos/MemosView.swift b/Memola/Features/Memos/MemosView.swift index 9790539..53cec28 100644 --- a/Memola/Features/Memos/MemosView.swift +++ b/Memola/Features/Memos/MemosView.swift @@ -16,6 +16,7 @@ struct MemosView: View { @State var query: String = "" @AppStorage("memola.memo-objects.sort") var sort: Sort = .recent + @AppStorage("memola.memo-objects.filter") var filter: Filter = .none let cellWidth: CGFloat = 250 let cellHeight: CGFloat = 150 @@ -23,9 +24,14 @@ struct MemosView: View { init() { let standard = UserDefaults.standard var descriptors: [SortDescriptor] = [] + var predicate: NSPredicate? let sort = Sort(rawValue: standard.value(forKey: "memola.memo-objects.sort") as? String ?? "") ?? .recent + let filter = Filter(rawValue: standard.value(forKey: "memola.memo-objects.filter") as? String ?? "") ?? .none + if filter == .favorites { + predicate = NSPredicate(format: "isFavorite = YES") + } descriptors = sort.memoSortDescriptors - _memoObjects = FetchRequest(sortDescriptors: descriptors) + _memoObjects = FetchRequest(sortDescriptors: descriptors, predicate: predicate) } var body: some View { @@ -53,6 +59,17 @@ struct MemosView: View { Image(systemName: "arrow.up.arrow.down.circle") } .hoverEffect(.lift) + Menu { + Picker("", selection: $filter) { + ForEach(Filter.all) { filter in + Text(filter.name) + .tag(filter) + } + } + .pickerStyle(.automatic) + } label: { + Image(systemName: "line.3.horizontal.decrease.circle") + } } } } @@ -72,6 +89,13 @@ struct MemosView: View { .onChange(of: query) { oldValue, newValue in updatePredicate() } + .onChange(of: filter) { oldValue, newValue in + updatePredicate() + } + .onAppear { + memoObjects.sortDescriptors = sort.memoSortDescriptors + updatePredicate() + } } var memoGrid: some View { @@ -162,9 +186,9 @@ struct MemosView: View { if !query.isEmpty { predicates.append(NSPredicate(format: "title contains[c] %@", query)) } -// if filter == .favorites { -// predicates.append(NSPredicate(format: "isFavorite = YES")) -// } + if filter == .favorites { + predicates.append(NSPredicate(format: "isFavorite = YES")) + } memoObjects.nsPredicate = NSCompoundPredicate(type: .and, subpredicates: predicates) } } diff --git a/Memola/Persistence/Objects/MemoObject.swift b/Memola/Persistence/Objects/MemoObject.swift index ad74aa9..724bc9e 100644 --- a/Memola/Persistence/Objects/MemoObject.swift +++ b/Memola/Persistence/Objects/MemoObject.swift @@ -14,6 +14,7 @@ final class MemoObject: NSManagedObject, Identifiable { @NSManaged var title: String @NSManaged var createdAt: Date @NSManaged var updatedAt: Date + @NSManaged var isFavorite: Bool @NSManaged var tool: ToolObject @NSManaged var canvas: CanvasObject } diff --git a/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents b/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents index 5e6773c..69dfb37 100644 --- a/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents +++ b/Memola/Resources/Models/MemolaModel.xcdatamodeld/MemolaModel.xcdatamodel/contents @@ -29,6 +29,7 @@ +