mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-04-24 17:48:39 +02: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()
|
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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user