mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-03-26 03:11:19 +01:00
feat: update updated date of memo when if there are changes
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user