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? @Published var draggedPen: Pen?
let scrollPublisher = PassthroughSubject<String, Never>() let scrollPublisher = PassthroughSubject<String, Never>()
var markers: [Pen] {
pens.filter { $0.strokeStyle == .marker }
}
init(object: ToolObject) { init(object: ToolObject) {
self.object = object self.object = object
@@ -93,12 +96,14 @@ public class Tool: NSObject, ObservableObject {
let deletedPen = withAnimation { let deletedPen = withAnimation {
pens.remove(at: index) pens.remove(at: index)
} }
unselectPen(deletedPen)
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) { context in context.delete(_pen)
try context.saveIfNeeded() try context.saveIfNeeded()
}
} }
} }
} }

View File

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

View File

@@ -104,6 +104,14 @@ struct PenDockView: View {
.padding(.leading, 10) .padding(.leading, 10)
.contextMenu(if: pen.strokeStyle != .eraser) { .contextMenu(if: pen.strokeStyle != .eraser) {
ControlGroup { ControlGroup {
Button {
tool.selectPen(pen)
} label: {
Label(
title: { Text("Select") },
icon: { Image(systemName: "pencil.tip.crop.circle") }
)
}
Button { Button {
let originalPen = pen let originalPen = pen
let pen = PenObject.createObject(\.viewContext, penStyle: originalPen.style) let pen = PenObject.createObject(\.viewContext, penStyle: originalPen.style)
@@ -126,8 +134,13 @@ struct PenDockView: View {
icon: { Image(systemName: "trash") } icon: { Image(systemName: "trash") }
) )
} }
.disabled(tool.markers.count <= 1)
} }
.controlGroupStyle(.menu) .controlGroupStyle(.menu)
} preview: {
penPreviewView(pen)
.drawingGroup()
.contentShape(.contextMenuPreview, .rect(cornerRadius: 10))
} }
.onDrag(if: pen.strokeStyle != .eraser) { .onDrag(if: pen.strokeStyle != .eraser) {
tool.draggedPen = pen tool.draggedPen = pen