mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-07-05 04:21:40 +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 */; };
|
EC0D14262BF7A8C9009BFE5F /* PenObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14252BF7A8C9009BFE5F /* PenObject.swift */; };
|
||||||
EC0D14282BF7BF20009BFE5F /* ContextMenuViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14272BF7BF20009BFE5F /* ContextMenuViewModifier.swift */; };
|
EC0D14282BF7BF20009BFE5F /* ContextMenuViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0D14272BF7BF20009BFE5F /* ContextMenuViewModifier.swift */; };
|
||||||
EC1815082C2D980B00541369 /* Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1815072C2D980B00541369 /* Sort.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 */; };
|
EC1B783D2BFA0AC9005A34E2 /* Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1B783C2BFA0AC9005A34E2 /* Toolbar.swift */; };
|
||||||
EC2106AD2C10C2A700FBE27C /* AnyStroke.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC2106AC2C10C2A700FBE27C /* AnyStroke.swift */; };
|
EC2106AD2C10C2A700FBE27C /* AnyStroke.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC2106AC2C10C2A700FBE27C /* AnyStroke.swift */; };
|
||||||
EC2BEBF42C0F5FF7005DB0AF /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC2BEBF32C0F5FF7005DB0AF /* RTree.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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
EC2BEBF32C0F5FF7005DB0AF /* RTree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RTree.swift; sourceTree = "<group>"; };
|
||||||
@@ -414,6 +416,7 @@
|
|||||||
children = (
|
children = (
|
||||||
ECA738792BE5EF0400A4542E /* MemosView.swift */,
|
ECA738792BE5EF0400A4542E /* MemosView.swift */,
|
||||||
EC1815072C2D980B00541369 /* Sort.swift */,
|
EC1815072C2D980B00541369 /* Sort.swift */,
|
||||||
|
EC1815092C2DA09E00541369 /* Filter.swift */,
|
||||||
);
|
);
|
||||||
path = Memos;
|
path = Memos;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -869,6 +872,7 @@
|
|||||||
files = (
|
files = (
|
||||||
ECA738B02BE60D0B00A4542E /* CanvasViewController.swift in Sources */,
|
ECA738B02BE60D0B00A4542E /* CanvasViewController.swift in Sources */,
|
||||||
ECD12A912C1B04EA00B96E12 /* PhotoRenderPass.swift in Sources */,
|
ECD12A912C1B04EA00B96E12 /* PhotoRenderPass.swift in Sources */,
|
||||||
|
EC18150A2C2DA09E00541369 /* Filter.swift in Sources */,
|
||||||
EC5D40812C21CE270067F090 /* PhotoBackgroundRenderPass.swift in Sources */,
|
EC5D40812C21CE270067F090 /* PhotoBackgroundRenderPass.swift in Sources */,
|
||||||
ECA738E42BE6110800A4542E /* Drawable.swift in Sources */,
|
ECA738E42BE6110800A4542E /* Drawable.swift in Sources */,
|
||||||
ECA738AD2BE60CC600A4542E /* DrawingView.swift in Sources */,
|
ECA738AD2BE60CC600A4542E /* DrawingView.swift in Sources */,
|
||||||
|
|||||||
@@ -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 = ""
|
@State var query: String = ""
|
||||||
|
|
||||||
@AppStorage("memola.memo-objects.sort") var sort: Sort = .recent
|
@AppStorage("memola.memo-objects.sort") var sort: Sort = .recent
|
||||||
|
@AppStorage("memola.memo-objects.filter") var filter: Filter = .none
|
||||||
|
|
||||||
let cellWidth: CGFloat = 250
|
let cellWidth: CGFloat = 250
|
||||||
let cellHeight: CGFloat = 150
|
let cellHeight: CGFloat = 150
|
||||||
@@ -23,9 +24,14 @@ struct MemosView: View {
|
|||||||
init() {
|
init() {
|
||||||
let standard = UserDefaults.standard
|
let standard = UserDefaults.standard
|
||||||
var descriptors: [SortDescriptor<MemoObject>] = []
|
var descriptors: [SortDescriptor<MemoObject>] = []
|
||||||
|
var predicate: NSPredicate?
|
||||||
let sort = Sort(rawValue: standard.value(forKey: "memola.memo-objects.sort") as? String ?? "") ?? .recent
|
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
|
descriptors = sort.memoSortDescriptors
|
||||||
_memoObjects = FetchRequest(sortDescriptors: descriptors)
|
_memoObjects = FetchRequest(sortDescriptors: descriptors, predicate: predicate)
|
||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -53,6 +59,17 @@ struct MemosView: View {
|
|||||||
Image(systemName: "arrow.up.arrow.down.circle")
|
Image(systemName: "arrow.up.arrow.down.circle")
|
||||||
}
|
}
|
||||||
.hoverEffect(.lift)
|
.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
|
.onChange(of: query) { oldValue, newValue in
|
||||||
updatePredicate()
|
updatePredicate()
|
||||||
}
|
}
|
||||||
|
.onChange(of: filter) { oldValue, newValue in
|
||||||
|
updatePredicate()
|
||||||
|
}
|
||||||
|
.onAppear {
|
||||||
|
memoObjects.sortDescriptors = sort.memoSortDescriptors
|
||||||
|
updatePredicate()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var memoGrid: some View {
|
var memoGrid: some View {
|
||||||
@@ -162,9 +186,9 @@ struct MemosView: View {
|
|||||||
if !query.isEmpty {
|
if !query.isEmpty {
|
||||||
predicates.append(NSPredicate(format: "title contains[c] %@", query))
|
predicates.append(NSPredicate(format: "title contains[c] %@", query))
|
||||||
}
|
}
|
||||||
// if filter == .favorites {
|
if filter == .favorites {
|
||||||
// predicates.append(NSPredicate(format: "isFavorite = YES"))
|
predicates.append(NSPredicate(format: "isFavorite = YES"))
|
||||||
// }
|
}
|
||||||
memoObjects.nsPredicate = NSCompoundPredicate(type: .and, subpredicates: predicates)
|
memoObjects.nsPredicate = NSCompoundPredicate(type: .and, subpredicates: predicates)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ final class MemoObject: NSManagedObject, Identifiable {
|
|||||||
@NSManaged var title: String
|
@NSManaged var title: String
|
||||||
@NSManaged var createdAt: Date
|
@NSManaged var createdAt: Date
|
||||||
@NSManaged var updatedAt: Date
|
@NSManaged var updatedAt: Date
|
||||||
|
@NSManaged var isFavorite: Bool
|
||||||
@NSManaged var tool: ToolObject
|
@NSManaged var tool: ToolObject
|
||||||
@NSManaged var canvas: CanvasObject
|
@NSManaged var canvas: CanvasObject
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
</entity>
|
</entity>
|
||||||
<entity name="MemoObject" representedClassName="MemoObject" syncable="YES">
|
<entity name="MemoObject" representedClassName="MemoObject" syncable="YES">
|
||||||
<attribute name="createdAt" attributeType="Date" usesScalarValueType="NO"/>
|
<attribute name="createdAt" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
|
<attribute name="isFavorite" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
|
||||||
<attribute name="title" attributeType="String"/>
|
<attribute name="title" attributeType="String"/>
|
||||||
<attribute name="updatedAt" attributeType="Date" usesScalarValueType="NO"/>
|
<attribute name="updatedAt" attributeType="Date" usesScalarValueType="NO"/>
|
||||||
<relationship name="canvas" maxCount="1" deletionRule="Cascade" destinationEntity="CanvasObject" inverseName="memo" inverseEntity="CanvasObject"/>
|
<relationship name="canvas" maxCount="1" deletionRule="Cascade" destinationEntity="CanvasObject" inverseName="memo" inverseEntity="CanvasObject"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user