Hide keyboard on tap, more robust search algorithm, option to search by dictionary word or definition
This commit is contained in:
15
Toki Trainer/Extensions/ViewExtensions.swift
Normal file
15
Toki Trainer/Extensions/ViewExtensions.swift
Normal file
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// ViewExtensions.swift
|
||||
// Toki Trainer
|
||||
//
|
||||
// Created by maddiefuzz on 10/28/22.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
extension View {
|
||||
func hideKeyboard() {
|
||||
let resign = #selector(UIResponder.resignFirstResponder)
|
||||
UIApplication.shared.sendAction(resign, to: nil, from: nil, for: nil)
|
||||
}
|
||||
}
|
@@ -52,11 +52,21 @@ class TokiDictionaryViewModel: ObservableObject {
|
||||
entryMatch = true
|
||||
}
|
||||
|
||||
// Check if any part of the word definitions match in English, even partially
|
||||
// Check if any part of the word definitions match in English, even partially, but
|
||||
// only by prefix (if one of the definition words matches the beginning of the word with
|
||||
// the search term)
|
||||
for definition in value.definitions {
|
||||
if definition.definition.contains(input) {
|
||||
entryMatch = true
|
||||
let capturePattern = #"(\w+)"#
|
||||
let captures = self.searchStringForRegex(string: definition.definition, regex: capturePattern)
|
||||
for capture in captures {
|
||||
if capture.hasPrefix(input) {
|
||||
entryMatch = true
|
||||
}
|
||||
}
|
||||
// Commented out, less strict matching that will match on any substring match
|
||||
// if definition.definition.contains(input) {
|
||||
// entryMatch = true
|
||||
// }
|
||||
}
|
||||
|
||||
// Add to dictionary
|
||||
|
@@ -7,11 +7,19 @@
|
||||
|
||||
import SwiftUI
|
||||
|
||||
enum SearchMode {
|
||||
case Dictionary
|
||||
case Definitions
|
||||
}
|
||||
|
||||
struct DictionaryView: View {
|
||||
@ObservedObject var tokiDictViewModel = TokiDictionaryViewModel()
|
||||
|
||||
@State private var tokiInput: String = ""
|
||||
@State private var selectedPartOfSpeech: String?
|
||||
@State var searchMode: SearchMode = .Dictionary
|
||||
|
||||
@FocusState private var searchInputIsForuced: Bool
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
@@ -21,8 +29,22 @@ struct DictionaryView: View {
|
||||
.disableAutocorrection(true)
|
||||
.padding(8)
|
||||
.onSubmit {
|
||||
tokiDictViewModel.filterDictionary(tokiInput)
|
||||
filterByInput()
|
||||
//tokiDictViewModel.filterDictionaryEnglishMode(tokiInput)
|
||||
}
|
||||
Picker("Language", selection: $searchMode) {
|
||||
Text("Dictionary").tag(SearchMode.Dictionary)
|
||||
Text("Definitions").tag(SearchMode.Definitions)
|
||||
}
|
||||
.pickerStyle(SegmentedPickerStyle())
|
||||
.onTapGesture {
|
||||
if self.searchMode == SearchMode.Dictionary {
|
||||
self.searchMode = SearchMode.Definitions
|
||||
} else {
|
||||
self.searchMode = SearchMode.Dictionary
|
||||
}
|
||||
filterByInput()
|
||||
}
|
||||
List(tokiDictViewModel.dictionary, id: \.word) { entry in
|
||||
TokiWordsListEntryView(entry: entry, selectedPartOfSpeech: $selectedPartOfSpeech)
|
||||
}
|
||||
@@ -30,12 +52,25 @@ struct DictionaryView: View {
|
||||
PartsOfSpeechView(selectedPartOfSpeech: selectedPOS)
|
||||
}
|
||||
.onChange(of: tokiInput) { newValue in
|
||||
tokiDictViewModel.filterDictionaryEnglishMode(newValue)
|
||||
filterByInput()
|
||||
//tokiDictViewModel.filterDictionaryEnglishMode(newValue)
|
||||
}
|
||||
}
|
||||
.onTapGesture {
|
||||
hideKeyboard()
|
||||
}
|
||||
}
|
||||
|
||||
func filterByInput() {
|
||||
if self.searchMode == SearchMode.Dictionary {
|
||||
tokiDictViewModel.filterDictionary(tokiInput)
|
||||
} else {
|
||||
tokiDictViewModel.filterDictionaryEnglishMode(tokiInput)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct DictionaryView_Previews: PreviewProvider {
|
||||
|
||||
static var previews: some View {
|
||||
|
@@ -53,6 +53,9 @@ struct TranslatorView: View {
|
||||
.onChange(of: tokiInput) { newValue in
|
||||
tokiDictViewModel.translatePhrase(newValue)
|
||||
}
|
||||
.onTapGesture {
|
||||
hideKeyboard()
|
||||
}
|
||||
}
|
||||
|
||||
func changeTranslationDirection() {
|
||||
|
Reference in New Issue
Block a user