mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-03-13 05:45:23 +01:00
feat: add context menu preview
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user