feat: update updated date of memo when if there are changes

This commit is contained in:
dscyrescotti
2024-06-27 16:47:13 +07:00
parent deada8b48c
commit 89c5a62612
9 changed files with 58 additions and 15 deletions

View File

@@ -14,6 +14,9 @@ struct MemolaApp: App {
MemosView() MemosView()
.persistence(\.viewContext) .persistence(\.viewContext)
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification)) { _ in .onReceive(NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification)) { _ in
withPersistenceSync(\.viewContext) { context in
try context.saveIfNeeded()
}
withPersistenceSync(\.backgroundContext) { context in withPersistenceSync(\.backgroundContext) { context in
try context.saveIfNeeded() try context.saveIfNeeded()
} }

View File

@@ -9,6 +9,12 @@ import Combine
import Foundation import Foundation
class History: ObservableObject { class History: ObservableObject {
var memo: MemoObject?
init(memo: MemoObject?) {
self.memo = memo
}
@Published var undoStack: [HistoryEvent] = [] @Published var undoStack: [HistoryEvent] = []
@Published var redoStack: [HistoryEvent] = [] @Published var redoStack: [HistoryEvent] = []
@@ -41,10 +47,18 @@ class History: ObservableObject {
func addUndo(_ event: HistoryEvent) { func addUndo(_ event: HistoryEvent) {
undoStack.append(event) undoStack.append(event)
withPersistence(\.viewContext) { [weak memo] context in
memo?.updatedAt = .now
try context.saveIfNeeded()
}
} }
func addRedo(_ event: HistoryEvent) { func addRedo(_ event: HistoryEvent) {
redoStack.append(event) redoStack.append(event)
withPersistence(\.viewContext) { [weak memo] context in
memo?.updatedAt = .now
try context.saveIfNeeded()
}
} }
func resetRedo() { func resetRedo() {
@@ -87,6 +101,10 @@ class History: ObservableObject {
} }
} }
redoStack.removeAll() redoStack.removeAll()
withPersistence(\.viewContext) { [weak memo] context in
memo?.updatedAt = .now
try context.saveIfNeeded()
}
} }
func restoreUndo() { func restoreUndo() {

View File

@@ -38,6 +38,7 @@ public class Tool: NSObject, ObservableObject {
self.selection = selection self.selection = selection
withPersistence(\.viewContext) { [weak object] context in withPersistence(\.viewContext) { [weak object] context in
object?.selection = selection.rawValue object?.selection = selection.rawValue
object?.memo?.updatedAt = .now
try context.saveIfNeeded() try context.saveIfNeeded()
} }
} }
@@ -85,10 +86,11 @@ public class Tool: NSObject, ObservableObject {
pens.insert(pen, at: index + 1) pens.insert(pen, at: index + 1)
} }
selectPen(pen) selectPen(pen)
withPersistence(\.viewContext) { [pens] context in withPersistence(\.viewContext) { [pens, weak object] context in
for (index, pen) in pens.enumerated() { for (index, pen) in pens.enumerated() {
pen.object?.orderIndex = Int16(index) pen.object?.orderIndex = Int16(index)
} }
object?.memo?.updatedAt = .now
try context.saveIfNeeded() try context.saveIfNeeded()
} }
} }
@@ -102,7 +104,8 @@ public class Tool: NSObject, ObservableObject {
object.pens.add(_pen) object.pens.add(_pen)
} }
scrollPublisher.send(pen.id) scrollPublisher.send(pen.id)
withPersistence(\.viewContext) { context in withPersistence(\.viewContext) { [weak object] context in
object?.memo?.updatedAt = .now
try context.saveIfNeeded() try context.saveIfNeeded()
} }
} }
@@ -116,8 +119,9 @@ public class Tool: NSObject, ObservableObject {
if let _pen = deletedPen.object { if let _pen = deletedPen.object {
_pen.tool = nil _pen.tool = nil
object.pens.remove(_pen) object.pens.remove(_pen)
withPersistence(\.viewContext) { context in withPersistence(\.viewContext) { [weak object] context in
context.delete(_pen) context.delete(_pen)
object?.memo?.updatedAt = .now
try context.saveIfNeeded() try context.saveIfNeeded()
} }
} }

View File

@@ -16,21 +16,25 @@ class Pen: NSObject, ObservableObject, Identifiable {
@Published var style: any PenStyle { @Published var style: any PenStyle {
didSet { didSet {
object?.style = strokeStyle.rawValue object?.style = strokeStyle.rawValue
object?.tool?.memo?.updatedAt = .now
} }
} }
@Published var rgba: [CGFloat] { @Published var rgba: [CGFloat] {
didSet { didSet {
object?.color = rgba object?.color = rgba
object?.tool?.memo?.updatedAt = .now
} }
} }
@Published var thickness: CGFloat { @Published var thickness: CGFloat {
didSet { didSet {
object?.thickness = thickness object?.thickness = thickness
object?.tool?.memo?.updatedAt = .now
} }
} }
@Published var isSelected: Bool { @Published var isSelected: Bool {
didSet { didSet {
object?.isSelected = isSelected object?.isSelected = isSelected
object?.tool?.memo?.updatedAt = .now
} }
} }
var color: Color { var color: Color {

View File

@@ -259,7 +259,6 @@ extension CanvasViewController: UIScrollViewDelegate {
func scrollViewDidZoom(_ scrollView: UIScrollView) { func scrollViewDidZoom(_ scrollView: UIScrollView) {
canvas.setZoomScale(scrollView.zoomScale) canvas.setZoomScale(scrollView.zoomScale)
// renderer.resize(on: renderView, to: renderView.drawableSize)
renderView.draw() renderView.draw()
} }
@@ -274,7 +273,6 @@ extension CanvasViewController: UIScrollViewDelegate {
} }
func scrollViewDidScroll(_ scrollView: UIScrollView) { func scrollViewDidScroll(_ scrollView: UIScrollView) {
// renderer.resize(on: renderView, to: renderView.drawableSize)
renderView.draw() renderView.draw()
} }

View File

@@ -11,7 +11,7 @@ import CoreData
struct MemoView: View { struct MemoView: View {
@StateObject var tool: Tool @StateObject var tool: Tool
@StateObject var canvas: Canvas @StateObject var canvas: Canvas
@StateObject var history = History() @StateObject var history: History
@State var memo: MemoObject @State var memo: MemoObject
@State var title: String @State var title: String
@@ -24,6 +24,7 @@ struct MemoView: View {
self.title = memo.title self.title = memo.title
self._tool = StateObject(wrappedValue: Tool(object: memo.tool)) self._tool = StateObject(wrappedValue: Tool(object: memo.tool))
self._canvas = StateObject(wrappedValue: Canvas(size: memo.canvas.size, canvasID: memo.canvas.objectID, gridMode: memo.canvas.gridMode)) self._canvas = StateObject(wrappedValue: Canvas(size: memo.canvas.size, canvasID: memo.canvas.objectID, gridMode: memo.canvas.gridMode))
self._history = StateObject(wrappedValue: History(memo: memo))
} }
var body: some View { var body: some View {

View File

@@ -29,10 +29,11 @@ struct PenDropDelegate: DropDelegate {
tool.pens.move(fromOffsets: IndexSet(integer: fromIndex), toOffset: toIndex > fromIndex ? toIndex + 1 : toIndex) tool.pens.move(fromOffsets: IndexSet(integer: fromIndex), toOffset: toIndex > fromIndex ? toIndex + 1 : toIndex)
tool.objectWillChange.send() tool.objectWillChange.send()
} }
withPersistence(\.viewContext) { context in withPersistence(\.viewContext) { [weak object = tool.object] context in
for (index, pen) in tool.pens.enumerated() { for (index, pen) in tool.pens.enumerated() {
pen.object?.orderIndex = Int16(index) pen.object?.orderIndex = Int16(index)
} }
object?.memo?.updatedAt = .now
try context.saveIfNeeded() try context.saveIfNeeded()
} }
} }

View File

@@ -123,6 +123,7 @@ struct Toolbar: View {
if !newValue { if !newValue {
if !title.isEmpty { if !title.isEmpty {
memo.title = title memo.title = title
memo.updatedAt = .now
} else { } else {
title = memo.title title = memo.title
} }
@@ -313,8 +314,11 @@ struct Toolbar: View {
withAnimation { withAnimation {
canvas.state = .closing canvas.state = .closing
} }
withPersistenceSync(\.viewContext) { context in
try context.saveIfNeeded()
}
withPersistence(\.backgroundContext) { context in withPersistence(\.backgroundContext) { context in
try? context.saveIfNeeded() try context.saveIfNeeded()
context.refreshAllObjects() context.refreshAllObjects()
DispatchQueue.main.async { DispatchQueue.main.async {
withAnimation { withAnimation {

View File

@@ -14,6 +14,9 @@ struct MemosView: View {
@State var memo: MemoObject? @State var memo: MemoObject?
let cellWidth: CGFloat = 250
let cellHeight: CGFloat = 150
var body: some View { var body: some View {
NavigationStack { NavigationStack {
memoGrid memoGrid
@@ -41,21 +44,28 @@ struct MemosView: View {
} }
var memoGrid: some View { var memoGrid: some View {
ScrollView { GeometryReader { proxy in
LazyVGrid(columns: .init(repeating: GridItem(.flexible()), count: 3)) { let count = Int(proxy.size.width / cellWidth)
ForEach(memoObjects) { memo in let columns: [GridItem] = .init(repeating: GridItem(.flexible(), spacing: 15), count: count)
memoCard(memo) ScrollView {
LazyVGrid(columns: columns, spacing: 15) {
ForEach(memoObjects) { memo in
memoCard(memo)
}
} }
.padding()
} }
.padding()
} }
} }
func memoCard(_ memoObject: MemoObject) -> some View { func memoCard(_ memoObject: MemoObject) -> some View {
VStack(alignment: .leading) { VStack(alignment: .leading, spacing: 5) {
Rectangle() Rectangle()
.frame(height: 150) .frame(height: cellHeight)
.clipShape(RoundedRectangle(cornerRadius: 10))
Text(memoObject.title) Text(memoObject.title)
.font(.headline)
.fontWeight(.semibold)
} }
.onTapGesture { .onTapGesture {
openMemo(for: memoObject) openMemo(for: memoObject)