feat: add context menu preview

This commit is contained in:
dscyrescotti
2024-05-19 13:49:09 +07:00
parent cfa9f14856
commit 78ac70e4cb
3 changed files with 26 additions and 7 deletions

View File

@@ -18,6 +18,9 @@ public class Tool: NSObject, ObservableObject {
@Published var draggedPen: Pen?
let scrollPublisher = PassthroughSubject<String, Never>()
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()
}
}
}
}

View File

@@ -8,14 +8,15 @@
import SwiftUI
import Foundation
struct ContextMenuViewModifier<MenuContent: View>: ViewModifier {
struct ContextMenuViewModifier<MenuContent: View, Preview: View>: 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<MenuContent: View>: ViewModifier {
}
public extension View {
func contextMenu<MenuContent: View>(if condition: Bool, @ViewBuilder menuItems: @escaping () -> MenuContent) -> some View {
modifier(ContextMenuViewModifier(condition: condition, menuItems: menuItems))
func contextMenu<MenuContent: View, Preview: View>(if condition: Bool, @ViewBuilder menuItems: @escaping () -> MenuContent, @ViewBuilder preview: @escaping () -> Preview) -> some View {
modifier(ContextMenuViewModifier(condition: condition, menuItems: menuItems, preview: preview))
}
}

View File

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