128 lines
3.8 KiB
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|