Files
VoidLink/Limelight/Input/KeyManager.swift
T

127 lines
4.0 KiB
Swift

//
// KeyManager.swift
// Moonlight-ZWM
//
// Created by ZWM on 2024/7/23.
// Copyright © 2024 Moonlight Game Streaming Project. All rights reserved.
//
import Foundation
import UIKit
@objc public class KeyManager: NSObject {
@objc public static let shared = KeyManager()
private var strings: [String] = []
private let keyMappings: [String: UInt16] = [
"CTRL": 0x11,
"ALT": 0x12,
"DEL": 0x2E,
"F1": 0x70,
"F2": 0x71
]
private weak var viewController: KeyManagerViewController?
private override init() {
super.init()
loadStrings()
}
@objc public func createTestKeyMappings() -> [String: UInt16] {
return keyMappings
}
@objc public func extractKeyStrings(from input: String) -> [String]? {
let keys = keyMappings.keys.joined(separator: "|")
let pattern = "^((?:\(keys))(?:\\+\(keys))*)$"
guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else {
return nil
}
let range = NSRange(location: 0, length: input.utf16.count)
guard let match = regex.firstMatch(in: input, options: [], range: range) else {
return nil
}
let matchedString = (input as NSString).substring(with: match.range(at: 1))
let keyStrings = matchedString.split(separator: "+").map { String($0) }
return keyStrings
}
@objc public func addString(_ string: String) {
/* guard isValidString(string) else {
return
} */
strings.append(string)
saveStrings()
viewController?.reloadTableView()
}
@objc public func deleteString(at index: Int) {
guard index >= 0 && index < strings.count else {
return
}
strings.remove(at: index)
saveStrings()
viewController?.reloadTableView()
}
@objc public func getAllStrings() -> [String] {
return strings
}
private func isValidString(_ string: String) -> Bool {
let keys = keyMappings.keys.joined(separator: "|")
let pattern = "^((?:\(keys))(?:\\+\(keys))*)$"
guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else {
return false
}
let range = NSRange(location: 0, length: string.utf16.count)
return regex.firstMatch(in: string, options: [], range: range) != nil
}
private func loadStrings() {
if let savedStrings = UserDefaults.standard.array(forKey: "savedStrings") as? [String] {
strings = savedStrings
}
}
private func saveStrings() {
UserDefaults.standard.set(strings, forKey: "savedStrings")
}
@objc public func setupViewController(_ viewController: KeyManagerViewController) {
self.viewController = viewController
let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(promptForNewString))
viewController.navigationItem.rightBarButtonItem = addButton
viewController.navigationItem.title = "Manage Strings"
viewController.tableView.delegate = viewController
viewController.tableView.dataSource = viewController
//viewController.tableView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
}
@objc private func promptForNewString() {
guard let topController = UIApplication.shared.keyWindow?.rootViewController else {
return
}
let alert = UIAlertController(title: "New String", message: "Enter a new string", preferredStyle: .alert)
alert.addTextField()
let submitAction = UIAlertAction(title: "Add", style: .default) { [unowned alert] _ in
let newString = alert.textFields![0].text ?? ""
self.addString(newString)
}
alert.addAction(submitAction)
topController.present(alert, animated: true)
}
}