mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-05-11 02:10:05 +02:00
feat: add filter options
This commit is contained in:
@@ -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 */,
|
||||
|
||||
26
Memola/Features/Memos/Filter.swift
Normal file
26
Memola/Features/Memos/Filter.swift
Normal 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]
|
||||
}
|
||||
@@ -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