mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-06-12 09:24:26 +02:00
feat: add filter options
This commit is contained in:
@@ -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]
|
||||
}
|
||||
@@ -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"/>
|
||||
|
||||
Reference in New Issue
Block a user