+/*
+ Copyright (C) 2024 Rubén Beltrán del Río
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see https://map.tranquil.systems.
+ */
+import SwiftUI
+
+struct SearchBar: View {
+
+ @Binding var term: String
+ @FocusState var isSearchFocused: Bool
+ var onNext: () -> Void = {}
+ var onPrevious: () -> Void = {}
+ var onSubmit: () -> Void = {}
+ var onDismiss: () -> Void = {}
+
+ var body: some View {
+ HStack(spacing: 2.0) {
+ ZStack {
+ TextField("Search", text: $term)
+ .textFieldStyle(.roundedBorder)
+ .padding(.trailing, 16.0)
+ .focused($isSearchFocused)
+ .onAppear {
+ isSearchFocused = true
+ }
+ .onKeyPress { press in
+ if press.key == .return {
+ if press.modifiers.contains(.shift) {
+ onPrevious()
+ return .handled
+ }
+ onNext()
+ return .handled
+ }
+ return .ignored
+ }
+ }
+ Spacer()
+ Button(action: onPrevious) {
+ Image(systemName: "chevron.left")
+ .font(.theme.smallControl)
+ }.keyboardShortcut(
+ "g", modifiers: EventModifiers([.command, .shift])
+ ).help("Find Previous (⇧⌘G)")
+ Button(action: onNext) {
+ Image(systemName: "chevron.right")
+ .font(.theme.smallControl)
+ }.keyboardShortcut(
+ "g", modifiers: EventModifiers([.command])
+ ).help("Find Next (⌘G)")
+ Button(action: onDismiss) {
+ Text("Done")
+ .font(.theme.smallControl)
+ }.keyboardShortcut(.escape, modifiers: EventModifiers())
+ .help("Done (⎋)")
+ }.padding(4.0)
+ }
+}
+
+#Preview {
+ SearchBar(term: .constant("Hello"))
+}