From 89c5a62612786095cd9a201765d0bd049cb3b4fd Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Thu, 27 Jun 2024 16:47:13 +0700 Subject: [PATCH] feat: update updated date of memo when if there are changes --- Memola/App/MemolaApp.swift | 3 +++ Memola/Canvas/History/History.swift | 18 ++++++++++++++ Memola/Canvas/Tool/Core/Tool.swift | 10 +++++--- Memola/Canvas/Tool/Pen/Core/Pen.swift | 4 ++++ .../ViewController/CanvasViewController.swift | 2 -- Memola/Features/Memo/Memo/MemoView.swift | 3 ++- .../Memo/PenDock/PenDropDelegate.swift | 3 ++- Memola/Features/Memo/Toolbar/Toolbar.swift | 6 ++++- Memola/Features/Memos/MemosView.swift | 24 +++++++++++++------ 9 files changed, 58 insertions(+), 15 deletions(-) diff --git a/Memola/App/MemolaApp.swift b/Memola/App/MemolaApp.swift index 4804ebc..7ee7826 100644 --- a/Memola/App/MemolaApp.swift +++ b/Memola/App/MemolaApp.swift @@ -14,6 +14,9 @@ struct MemolaApp: App { MemosView() .persistence(\.viewContext) .onReceive(NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification)) { _ in + withPersistenceSync(\.viewContext) { context in + try context.saveIfNeeded() + } withPersistenceSync(\.backgroundContext) { context in try context.saveIfNeeded() } diff --git a/Memola/Canvas/History/History.swift b/Memola/Canvas/History/History.swift index a6d152b..a23b8eb 100644 --- a/Memola/Canvas/History/History.swift +++ b/Memola/Canvas/History/History.swift @@ -9,6 +9,12 @@ import Combine import Foundation class History: ObservableObject { + var memo: MemoObject? + + init(memo: MemoObject?) { + self.memo = memo + } + @Published var undoStack: [HistoryEvent] = [] @Published var redoStack: [HistoryEvent] = [] @@ -41,10 +47,18 @@ class History: ObservableObject { func addUndo(_ event: HistoryEvent) { undoStack.append(event) + withPersistence(\.viewContext) { [weak memo] context in + memo?.updatedAt = .now + try context.saveIfNeeded() + } } func addRedo(_ event: HistoryEvent) { redoStack.append(event) + withPersistence(\.viewContext) { [weak memo] context in + memo?.updatedAt = .now + try context.saveIfNeeded() + } } func resetRedo() { @@ -87,6 +101,10 @@ class History: ObservableObject { } } redoStack.removeAll() + withPersistence(\.viewContext) { [weak memo] context in + memo?.updatedAt = .now + try context.saveIfNeeded() + } } func restoreUndo() { diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index 18502f7..38d9b9e 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -38,6 +38,7 @@ public class Tool: NSObject, ObservableObject { self.selection = selection withPersistence(\.viewContext) { [weak object] context in object?.selection = selection.rawValue + object?.memo?.updatedAt = .now try context.saveIfNeeded() } } @@ -85,10 +86,11 @@ public class Tool: NSObject, ObservableObject { pens.insert(pen, at: index + 1) } selectPen(pen) - withPersistence(\.viewContext) { [pens] context in + withPersistence(\.viewContext) { [pens, weak object] context in for (index, pen) in pens.enumerated() { pen.object?.orderIndex = Int16(index) } + object?.memo?.updatedAt = .now try context.saveIfNeeded() } } @@ -102,7 +104,8 @@ public class Tool: NSObject, ObservableObject { object.pens.add(_pen) } scrollPublisher.send(pen.id) - withPersistence(\.viewContext) { context in + withPersistence(\.viewContext) { [weak object] context in + object?.memo?.updatedAt = .now try context.saveIfNeeded() } } @@ -116,8 +119,9 @@ public class Tool: NSObject, ObservableObject { if let _pen = deletedPen.object { _pen.tool = nil object.pens.remove(_pen) - withPersistence(\.viewContext) { context in + withPersistence(\.viewContext) { [weak object] context in context.delete(_pen) + object?.memo?.updatedAt = .now try context.saveIfNeeded() } } diff --git a/Memola/Canvas/Tool/Pen/Core/Pen.swift b/Memola/Canvas/Tool/Pen/Core/Pen.swift index 81f461a..9195a6c 100644 --- a/Memola/Canvas/Tool/Pen/Core/Pen.swift +++ b/Memola/Canvas/Tool/Pen/Core/Pen.swift @@ -16,21 +16,25 @@ class Pen: NSObject, ObservableObject, Identifiable { @Published var style: any PenStyle { didSet { object?.style = strokeStyle.rawValue + object?.tool?.memo?.updatedAt = .now } } @Published var rgba: [CGFloat] { didSet { object?.color = rgba + object?.tool?.memo?.updatedAt = .now } } @Published var thickness: CGFloat { didSet { object?.thickness = thickness + object?.tool?.memo?.updatedAt = .now } } @Published var isSelected: Bool { didSet { object?.isSelected = isSelected + object?.tool?.memo?.updatedAt = .now } } var color: Color { diff --git a/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift b/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift index 395b096..6ec4d48 100644 --- a/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift +++ b/Memola/Canvas/View/Bridge/ViewController/CanvasViewController.swift @@ -259,7 +259,6 @@ extension CanvasViewController: UIScrollViewDelegate { func scrollViewDidZoom(_ scrollView: UIScrollView) { canvas.setZoomScale(scrollView.zoomScale) -// renderer.resize(on: renderView, to: renderView.drawableSize) renderView.draw() } @@ -274,7 +273,6 @@ extension CanvasViewController: UIScrollViewDelegate { } func scrollViewDidScroll(_ scrollView: UIScrollView) { -// renderer.resize(on: renderView, to: renderView.drawableSize) renderView.draw() } diff --git a/Memola/Features/Memo/Memo/MemoView.swift b/Memola/Features/Memo/Memo/MemoView.swift index afc3b56..4a7a384 100644 --- a/Memola/Features/Memo/Memo/MemoView.swift +++ b/Memola/Features/Memo/Memo/MemoView.swift @@ -11,7 +11,7 @@ import CoreData struct MemoView: View { @StateObject var tool: Tool @StateObject var canvas: Canvas - @StateObject var history = History() + @StateObject var history: History @State var memo: MemoObject @State var title: String @@ -24,6 +24,7 @@ struct MemoView: View { self.title = memo.title 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._history = StateObject(wrappedValue: History(memo: memo)) } var body: some View { diff --git a/Memola/Features/Memo/PenDock/PenDropDelegate.swift b/Memola/Features/Memo/PenDock/PenDropDelegate.swift index 7d91630..8557f34 100644 --- a/Memola/Features/Memo/PenDock/PenDropDelegate.swift +++ b/Memola/Features/Memo/PenDock/PenDropDelegate.swift @@ -29,10 +29,11 @@ struct PenDropDelegate: DropDelegate { tool.pens.move(fromOffsets: IndexSet(integer: fromIndex), toOffset: toIndex > fromIndex ? toIndex + 1 : toIndex) tool.objectWillChange.send() } - withPersistence(\.viewContext) { context in + withPersistence(\.viewContext) { [weak object = tool.object] context in for (index, pen) in tool.pens.enumerated() { pen.object?.orderIndex = Int16(index) } + object?.memo?.updatedAt = .now try context.saveIfNeeded() } } diff --git a/Memola/Features/Memo/Toolbar/Toolbar.swift b/Memola/Features/Memo/Toolbar/Toolbar.swift index 3139d53..bb99cac 100644 --- a/Memola/Features/Memo/Toolbar/Toolbar.swift +++ b/Memola/Features/Memo/Toolbar/Toolbar.swift @@ -123,6 +123,7 @@ struct Toolbar: View { if !newValue { if !title.isEmpty { memo.title = title + memo.updatedAt = .now } else { title = memo.title } @@ -313,8 +314,11 @@ struct Toolbar: View { withAnimation { canvas.state = .closing } + withPersistenceSync(\.viewContext) { context in + try context.saveIfNeeded() + } withPersistence(\.backgroundContext) { context in - try? context.saveIfNeeded() + try context.saveIfNeeded() context.refreshAllObjects() DispatchQueue.main.async { withAnimation { diff --git a/Memola/Features/Memos/MemosView.swift b/Memola/Features/Memos/MemosView.swift index 680f278..bdf4e07 100644 --- a/Memola/Features/Memos/MemosView.swift +++ b/Memola/Features/Memos/MemosView.swift @@ -14,6 +14,9 @@ struct MemosView: View { @State var memo: MemoObject? + let cellWidth: CGFloat = 250 + let cellHeight: CGFloat = 150 + var body: some View { NavigationStack { memoGrid @@ -41,21 +44,28 @@ struct MemosView: View { } var memoGrid: some View { - ScrollView { - LazyVGrid(columns: .init(repeating: GridItem(.flexible()), count: 3)) { - ForEach(memoObjects) { memo in - memoCard(memo) + GeometryReader { proxy in + let count = Int(proxy.size.width / cellWidth) + let columns: [GridItem] = .init(repeating: GridItem(.flexible(), spacing: 15), count: count) + ScrollView { + LazyVGrid(columns: columns, spacing: 15) { + ForEach(memoObjects) { memo in + memoCard(memo) + } } + .padding() } - .padding() } } func memoCard(_ memoObject: MemoObject) -> some View { - VStack(alignment: .leading) { + VStack(alignment: .leading, spacing: 5) { Rectangle() - .frame(height: 150) + .frame(height: cellHeight) + .clipShape(RoundedRectangle(cornerRadius: 10)) Text(memoObject.title) + .font(.headline) + .fontWeight(.semibold) } .onTapGesture { openMemo(for: memoObject)