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()
.persistence(\.viewContext)
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification)) { _ in
withPersistenceSync(\.viewContext) { context in
try context.saveIfNeeded()
}
withPersistenceSync(\.backgroundContext) { context in
try context.saveIfNeeded()
}

View File

@@ -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() {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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