fix(worterbuch): blank screen when opening canvas
This commit is contained in:
@@ -29,11 +29,13 @@ struct FieldEditorView: View {
|
|||||||
let fieldType: FieldType
|
let fieldType: FieldType
|
||||||
|
|
||||||
@State private var isRecognizing = false
|
@State private var isRecognizing = false
|
||||||
|
@State private var viewAppeared = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationView {
|
NavigationView {
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
// Handwriting canvas
|
// Handwriting canvas
|
||||||
|
if viewAppeared {
|
||||||
HandwritingCanvasView(
|
HandwritingCanvasView(
|
||||||
drawing: $drawing,
|
drawing: $drawing,
|
||||||
onDrawingChanged: { newDrawing in
|
onDrawingChanged: { newDrawing in
|
||||||
@@ -46,6 +48,20 @@ struct FieldEditorView: View {
|
|||||||
.background(Color(.systemGray6))
|
.background(Color(.systemGray6))
|
||||||
.cornerRadius(12)
|
.cornerRadius(12)
|
||||||
.padding()
|
.padding()
|
||||||
|
} else {
|
||||||
|
// Placeholder while loading
|
||||||
|
Rectangle()
|
||||||
|
.fill(Color(.systemGray6))
|
||||||
|
.frame(height: 400)
|
||||||
|
.cornerRadius(12)
|
||||||
|
.padding()
|
||||||
|
.onAppear {
|
||||||
|
// Show canvas after a brief delay to ensure window is ready
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) {
|
||||||
|
viewAppeared = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Transcribed text section
|
// Transcribed text section
|
||||||
VStack(alignment: .leading, spacing: 8) {
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
|
|||||||
@@ -22,15 +22,8 @@ struct HandwritingCanvasView: UIViewRepresentable {
|
|||||||
canvasView.backgroundColor = .clear
|
canvasView.backgroundColor = .clear
|
||||||
canvasView.isUserInteractionEnabled = isEditable
|
canvasView.isUserInteractionEnabled = isEditable
|
||||||
|
|
||||||
// Use the shared tool picker and show it after a delay
|
// Store canvas in coordinator for later access
|
||||||
DispatchQueue.main.async {
|
context.coordinator.canvasView = canvasView
|
||||||
if isEditable, let window = canvasView.window {
|
|
||||||
let toolPicker = PKToolPicker.shared(for: window)
|
|
||||||
toolPicker?.setVisible(true, forFirstResponder: canvasView)
|
|
||||||
toolPicker?.addObserver(canvasView)
|
|
||||||
canvasView.becomeFirstResponder()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return canvasView
|
return canvasView
|
||||||
}
|
}
|
||||||
@@ -41,15 +34,9 @@ struct HandwritingCanvasView: UIViewRepresentable {
|
|||||||
}
|
}
|
||||||
canvasView.isUserInteractionEnabled = isEditable
|
canvasView.isUserInteractionEnabled = isEditable
|
||||||
|
|
||||||
// Ensure tool picker is visible when editable
|
// Set up tool picker when window becomes available
|
||||||
if isEditable {
|
if isEditable && canvasView.window != nil && !context.coordinator.toolPickerSetup {
|
||||||
DispatchQueue.main.async {
|
context.coordinator.setupToolPicker()
|
||||||
if let window = canvasView.window {
|
|
||||||
let toolPicker = PKToolPicker.shared(for: window)
|
|
||||||
toolPicker?.setVisible(true, forFirstResponder: canvasView)
|
|
||||||
canvasView.becomeFirstResponder()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,10 +47,32 @@ struct HandwritingCanvasView: UIViewRepresentable {
|
|||||||
class Coordinator: NSObject, PKCanvasViewDelegate {
|
class Coordinator: NSObject, PKCanvasViewDelegate {
|
||||||
var drawing: Binding<PKDrawing>
|
var drawing: Binding<PKDrawing>
|
||||||
var onDrawingChanged: ((PKDrawing) -> Void)?
|
var onDrawingChanged: ((PKDrawing) -> Void)?
|
||||||
|
var canvasView: PKCanvasView?
|
||||||
|
var toolPicker: PKToolPicker?
|
||||||
|
var toolPickerSetup = false
|
||||||
|
|
||||||
init(drawing: Binding<PKDrawing>, onDrawingChanged: ((PKDrawing) -> Void)?) {
|
init(drawing: Binding<PKDrawing>, onDrawingChanged: ((PKDrawing) -> Void)?) {
|
||||||
self.drawing = drawing
|
self.drawing = drawing
|
||||||
self.onDrawingChanged = onDrawingChanged
|
self.onDrawingChanged = onDrawingChanged
|
||||||
|
super.init()
|
||||||
|
// Create a dedicated tool picker instance
|
||||||
|
self.toolPicker = PKToolPicker()
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupToolPicker() {
|
||||||
|
guard let canvasView = canvasView,
|
||||||
|
let toolPicker = toolPicker,
|
||||||
|
canvasView.window != nil,
|
||||||
|
!toolPickerSetup else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
toolPickerSetup = true
|
||||||
|
|
||||||
|
// Set visible and add observer immediately
|
||||||
|
toolPicker.setVisible(true, forFirstResponder: canvasView)
|
||||||
|
toolPicker.addObserver(canvasView)
|
||||||
|
canvasView.becomeFirstResponder()
|
||||||
}
|
}
|
||||||
|
|
||||||
func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
|
func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
|
||||||
|
|||||||
@@ -9,6 +9,12 @@ import SwiftUI
|
|||||||
import PencilKit
|
import PencilKit
|
||||||
import CoreData
|
import CoreData
|
||||||
|
|
||||||
|
struct FieldSelection: Identifiable {
|
||||||
|
let id = UUID()
|
||||||
|
let entry: VocabularyEntry
|
||||||
|
let fieldType: FieldType
|
||||||
|
}
|
||||||
|
|
||||||
struct VocabularyGridView: View {
|
struct VocabularyGridView: View {
|
||||||
@Environment(\.managedObjectContext) private var viewContext
|
@Environment(\.managedObjectContext) private var viewContext
|
||||||
@FetchRequest(
|
@FetchRequest(
|
||||||
@@ -18,13 +24,7 @@ struct VocabularyGridView: View {
|
|||||||
private var entries: FetchedResults<VocabularyEntry>
|
private var entries: FetchedResults<VocabularyEntry>
|
||||||
|
|
||||||
@State private var searchText = ""
|
@State private var searchText = ""
|
||||||
@State private var selectedEntry: VocabularyEntry?
|
@State private var fieldSelection: FieldSelection?
|
||||||
@State private var selectedFieldType: FieldType?
|
|
||||||
@State private var showingFieldEditor = false
|
|
||||||
|
|
||||||
// Temporary bindings for editing
|
|
||||||
@State private var editingDrawing: PKDrawing = PKDrawing()
|
|
||||||
@State private var editingText: String = ""
|
|
||||||
|
|
||||||
var filteredEntries: [VocabularyEntry] {
|
var filteredEntries: [VocabularyEntry] {
|
||||||
if searchText.isEmpty {
|
if searchText.isEmpty {
|
||||||
@@ -111,26 +111,22 @@ struct VocabularyGridView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.sheet(isPresented: $showingFieldEditor) {
|
.sheet(item: $fieldSelection) { selection in
|
||||||
if let entry = selectedEntry, let fieldType = selectedFieldType {
|
|
||||||
FieldEditorView(
|
FieldEditorView(
|
||||||
drawing: bindingForDrawing(entry: entry, fieldType: fieldType),
|
drawing: bindingForDrawing(entry: selection.entry, fieldType: selection.fieldType),
|
||||||
text: bindingForText(entry: entry, fieldType: fieldType),
|
text: bindingForText(entry: selection.entry, fieldType: selection.fieldType),
|
||||||
fieldType: fieldType
|
fieldType: selection.fieldType
|
||||||
)
|
)
|
||||||
.onDisappear {
|
.onDisappear {
|
||||||
saveContext()
|
saveContext()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
.navigationViewStyle(.stack)
|
.navigationViewStyle(.stack)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func openFieldEditor(for entry: VocabularyEntry, fieldType: FieldType) {
|
private func openFieldEditor(for entry: VocabularyEntry, fieldType: FieldType) {
|
||||||
selectedEntry = entry
|
fieldSelection = FieldSelection(entry: entry, fieldType: fieldType)
|
||||||
selectedFieldType = fieldType
|
|
||||||
showingFieldEditor = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func bindingForDrawing(entry: VocabularyEntry, fieldType: FieldType) -> Binding<PKDrawing> {
|
private func bindingForDrawing(entry: VocabularyEntry, fieldType: FieldType) -> Binding<PKDrawing> {
|
||||||
|
|||||||
Reference in New Issue
Block a user