Files
WorterBuch/WorterBuch/FieldEditorView.swift

128 lines
3.8 KiB
Swift

//
// FieldEditorView.swift
// WorterBuch
//
// Created by Oliver Hnát on 01.12.2025.
//
import SwiftUI
import PencilKit
enum FieldType {
case germanWord
case germanExplanation
case englishTranslation
var title: String {
switch self {
case .germanWord: return "German Word"
case .germanExplanation: return "German Explanation"
case .englishTranslation: return "English Translation"
}
}
}
struct FieldEditorView: View {
@Environment(\.dismiss) private var dismiss
@Binding var drawing: PKDrawing
@Binding var text: String
let fieldType: FieldType
@State private var isRecognizing = false
var body: some View {
NavigationView {
VStack(spacing: 0) {
// Handwriting canvas
HandwritingCanvasView(
drawing: $drawing,
onDrawingChanged: { newDrawing in
recognizeHandwriting(newDrawing)
},
isEditable: true
)
.frame(maxWidth: .infinity)
.frame(height: 400)
.background(Color(.systemGray6))
.cornerRadius(12)
.padding()
// Transcribed text section
VStack(alignment: .leading, spacing: 8) {
HStack {
Text("Transcribed Text")
.font(.headline)
.foregroundColor(.secondary)
if isRecognizing {
ProgressView()
.scaleEffect(0.8)
}
Spacer()
}
TextEditor(text: $text)
.font(.body)
.frame(minHeight: 100)
.padding(8)
.background(Color(.systemGray6))
.cornerRadius(8)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(Color.gray.opacity(0.3), lineWidth: 1)
)
}
.padding()
Spacer()
}
.navigationTitle(fieldType.title)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("Clear") {
drawing = PKDrawing()
text = ""
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button("Done") {
dismiss()
}
.fontWeight(.semibold)
}
}
}
.navigationViewStyle(.stack)
}
private func recognizeHandwriting(_ drawing: PKDrawing) {
print("=== recognizeHandwriting called ===")
print("Drawing bounds: \(drawing.bounds)")
print("Drawing is empty: \(drawing.bounds.isEmpty)")
guard !drawing.bounds.isEmpty else {
print("Drawing bounds are empty, skipping recognition")
return
}
print("Starting recognition...")
isRecognizing = true
Task {
if let recognizedText = await HandwritingRecognizer.recognizeTextAsync(from: drawing) {
print("Recognition successful: \(recognizedText)")
await MainActor.run {
text = recognizedText
isRecognizing = false
}
} else {
print("Recognition returned nil")
await MainActor.run {
isRecognizing = false
}
}
}
}
}