feat: add filter options

This commit is contained in:
dscyrescotti
2024-06-27 20:40:51 +07:00
parent b5b12f6540
commit f9c9179491
5 changed files with 60 additions and 4 deletions
+26
View File
@@ -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]
}
+28 -4
View File
@@ -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<MemoObject>] = []
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)
}
}
@@ -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
}
@@ -29,6 +29,7 @@
</entity>
<entity name="MemoObject" representedClassName="MemoObject" syncable="YES">
<attribute name="createdAt" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="isFavorite" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="title" attributeType="String"/>
<attribute name="updatedAt" attributeType="Date" usesScalarValueType="NO"/>
<relationship name="canvas" maxCount="1" deletionRule="Cascade" destinationEntity="CanvasObject" inverseName="memo" inverseEntity="CanvasObject"/>