123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- //
- // Copyright © 2025 osy. All rights reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- //
- import SwiftUI
- struct VMKeyboardShortcutsView: View {
- let onShortcut: ([QEMUKeyCode]) -> Void
- @Environment(\.presentationMode) var presentationMode
- @State private var keyboardShortcuts: [[QEMUKeyCode]] = []
- var body: some View {
- NavigationView {
- List {
- ForEach(keyboardShortcuts, id: \.self) { element in
- Button(element.title) {
- onShortcut(element)
- presentationMode.wrappedValue.dismiss()
- }
- }.onDelete { indexSet in
- keyboardShortcuts.remove(atOffsets: indexSet)
- }.onMove { indexSet, offset in
- keyboardShortcuts.move(fromOffsets: indexSet, toOffset: offset)
- }
- NavigationLink("Add…") {
- NewKeyboardShortcutView(keyboardShortcuts: $keyboardShortcuts)
- }
- }.navigationTitle("Keyboard Shortcut")
- .toolbar {
- ToolbarItemGroup(placement: .navigationBarTrailing) {
- EditButton()
- Button("Close") {
- presentationMode.wrappedValue.dismiss()
- }
- }
- }
- }
- .onAppear {
- keyboardShortcuts = UTMKeyboardShortcuts.shared.loadKeyboardShortcuts()
- }
- .onChange(of: keyboardShortcuts) { newValue in
- UTMKeyboardShortcuts.shared.saveKeyboardShortcuts(newValue)
- }
- }
- }
- private struct NewKeyboardShortcutView: View {
- @Environment(\.presentationMode) var presentationMode
- @Binding var keyboardShortcuts: [[QEMUKeyCode]]
- @State private var newShortcut: [QEMUKeyCode] = []
- @State private var newKey: QEMUKeyCode?
- var body: some View {
- List {
- DetailedSection("Keys") {
- ForEach(newShortcut, id: \.self) { element in
- Text(element.title)
- }.onDelete { indexSet in
- newShortcut.remove(atOffsets: indexSet)
- }.onMove { indexSet, offset in
- newShortcut.move(fromOffsets: indexSet, toOffset: offset)
- }
- }
- DetailedSection("New Key") {
- Picker("", selection: $newKey) {
- Text("").tag(nil as QEMUKeyCode?)
- ForEach(QEMUKeyCode.allCases) { keyCode in
- if !newShortcut.contains(keyCode) {
- Text(keyCode.title).tag(keyCode)
- }
- }
- }.pickerStyle(.wheel)
- Button("Add") {
- if let key = newKey {
- newShortcut.append(key)
- }
- newKey = nil
- }.disabled(newKey == nil)
- }
- }.navigationTitle("New Keyboard Shortcut")
- .toolbar {
- ToolbarItemGroup(placement: .navigationBarTrailing) {
- EditButton()
- Button("Save") {
- if !newShortcut.isEmpty {
- keyboardShortcuts.append(newShortcut)
- }
- presentationMode.wrappedValue.dismiss()
- }.disabled(newShortcut.isEmpty)
- }
- }
- .onAppear {
- newShortcut = []
- newKey = nil
- }
- }
- }
- #Preview {
- VMKeyboardShortcutsView() { _ in }
- }
|