mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-04-22 08:38:34 +02:00
feat: add context menu preview
This commit is contained in:
@@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user