From 78ac70e4cbc5378447fddbcf7ecdbfa5248627f9 Mon Sep 17 00:00:00 2001 From: dscyrescotti Date: Sun, 19 May 2024 13:49:09 +0700 Subject: [PATCH] feat: add context menu preview --- Memola/Canvas/Tool/Core/Tool.swift | 11 ++++++++--- .../ViewModifiers/ContextMenuViewModifier.swift | 9 +++++---- Memola/Features/Memo/PenDock/PenDockView.swift | 13 +++++++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Memola/Canvas/Tool/Core/Tool.swift b/Memola/Canvas/Tool/Core/Tool.swift index 1988068..5d05c80 100644 --- a/Memola/Canvas/Tool/Core/Tool.swift +++ b/Memola/Canvas/Tool/Core/Tool.swift @@ -18,6 +18,9 @@ public class Tool: NSObject, ObservableObject { @Published var draggedPen: Pen? let scrollPublisher = PassthroughSubject() + var markers: [Pen] { + pens.filter { $0.strokeStyle == .marker } + } init(object: ToolObject) { self.object = object @@ -93,12 +96,14 @@ public class Tool: NSObject, ObservableObject { let deletedPen = withAnimation { pens.remove(at: index) } + unselectPen(deletedPen) if let _pen = deletedPen.object { _pen.tool = nil object.pens.remove(_pen) - } - withPersistence(\.viewContext) { context in - try context.saveIfNeeded() + withPersistence(\.viewContext) { context in + context.delete(_pen) + try context.saveIfNeeded() + } } } } diff --git a/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift b/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift index 9c7a335..ee1a3f2 100644 --- a/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift +++ b/Memola/Components/ViewModifiers/ContextMenuViewModifier.swift @@ -8,14 +8,15 @@ import SwiftUI import Foundation -struct ContextMenuViewModifier: ViewModifier { +struct ContextMenuViewModifier: ViewModifier { let condition: Bool let menuItems: () -> MenuContent + let preview: () -> Preview @ViewBuilder func body(content: Content) -> some View { if condition { - content.contextMenu(menuItems: menuItems) + content.contextMenu(menuItems: menuItems, preview: preview) } else { content } @@ -23,7 +24,7 @@ struct ContextMenuViewModifier: ViewModifier { } public extension View { - func contextMenu(if condition: Bool, @ViewBuilder menuItems: @escaping () -> MenuContent) -> some View { - modifier(ContextMenuViewModifier(condition: condition, menuItems: menuItems)) + func contextMenu(if condition: Bool, @ViewBuilder menuItems: @escaping () -> MenuContent, @ViewBuilder preview: @escaping () -> Preview) -> some View { + modifier(ContextMenuViewModifier(condition: condition, menuItems: menuItems, preview: preview)) } } diff --git a/Memola/Features/Memo/PenDock/PenDockView.swift b/Memola/Features/Memo/PenDock/PenDockView.swift index cfa81de..4d4cbf3 100644 --- a/Memola/Features/Memo/PenDock/PenDockView.swift +++ b/Memola/Features/Memo/PenDock/PenDockView.swift @@ -104,6 +104,14 @@ struct PenDockView: View { .padding(.leading, 10) .contextMenu(if: pen.strokeStyle != .eraser) { ControlGroup { + Button { + tool.selectPen(pen) + } label: { + Label( + title: { Text("Select") }, + icon: { Image(systemName: "pencil.tip.crop.circle") } + ) + } Button { let originalPen = pen let pen = PenObject.createObject(\.viewContext, penStyle: originalPen.style) @@ -126,8 +134,13 @@ struct PenDockView: View { icon: { Image(systemName: "trash") } ) } + .disabled(tool.markers.count <= 1) } .controlGroupStyle(.menu) + } preview: { + penPreviewView(pen) + .drawingGroup() + .contentShape(.contextMenuPreview, .rect(cornerRadius: 10)) } .onDrag(if: pen.strokeStyle != .eraser) { tool.draggedPen = pen