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

View File

@@ -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 = "<group>"; };
EC0D14272BF7BF20009BFE5F /* ContextMenuViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuViewModifier.swift; sourceTree = "<group>"; };
EC1815072C2D980B00541369 /* Sort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sort.swift; sourceTree = "<group>"; };
EC1815092C2DA09E00541369 /* Filter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Filter.swift; sourceTree = "<group>"; };
EC1B783C2BFA0AC9005A34E2 /* Toolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toolbar.swift; sourceTree = "<group>"; };
EC2106AC2C10C2A700FBE27C /* AnyStroke.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyStroke.swift; sourceTree = "<group>"; };
EC2BEBF32C0F5FF7005DB0AF /* RTree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RTree.swift; sourceTree = "<group>"; };
@@ -414,6 +416,7 @@
children = (
ECA738792BE5EF0400A4542E /* MemosView.swift */,
EC1815072C2D980B00541369 /* Sort.swift */,
EC1815092C2DA09E00541369 /* Filter.swift */,
);
path = Memos;
sourceTree = "<group>";
@@ -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 */,

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]
}

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)
}
}

View File

@@ -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
}

View File

@@ -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"/>