diff --git a/AutoCat/AppDelegate.swift b/AutoCat/AppDelegate.swift index 3954792..0e35db4 100644 --- a/AutoCat/AppDelegate.swift +++ b/AutoCat/AppDelegate.swift @@ -192,5 +192,26 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } + + // MARK: - Global menu + + override func buildMenu(with builder: UIMenuBuilder) { + super.buildMenu(with: builder) + + let command = UIKeyCommand(title: NSLocalizedString("Add new number", comment: ""), + action: #selector(openAddNumberPanel), + input: "n", + modifierFlags: .command) + let menu = UIMenu(options: .displayInline, children: [command]) + builder.insertChild(menu, atEndOfMenu: .file) + } + + @objc func openAddNumberPanel() { + guard let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate else { + return + } + + sceneDelegate.showAddNumberPanel() + } } diff --git a/AutoCat/Controllers/NewNumberController.swift b/AutoCat/Controllers/NewNumberController.swift index 5965cc3..a5cbfea 100644 --- a/AutoCat/Controllers/NewNumberController.swift +++ b/AutoCat/Controllers/NewNumberController.swift @@ -59,6 +59,8 @@ class NewNumberController: UIViewController { view.addSubview(mainStackView) mainStackView.pin(to: view, insets: .all(16)) + + addKeyCommand(UIKeyCommand(input: "v", modifierFlags: .command, action: #selector(pasteText))) } func check() { @@ -81,3 +83,57 @@ extension NewNumberController: PNKeyboardDelegate { check() } } + +#if targetEnvironment(macCatalyst) + +extension NewNumberController { + + override func pressesBegan(_ presses: Set, with event: UIPressesEvent?) { + + let ruLetters = Constants.pnLettersMap.keys.map(String.init) + let enLetters = Constants.pnLettersMap.values.map(String.init) + let numbers = Array((0..<10).map(String.init)) + + var didHandleEvent = true + + for press in presses { + guard let key = press.key else { + continue + } + + switch key.keyCode { + case .keyboardReturnOrEnter: + check() + case .keyboardEscape: + dismiss(animated: true) + case .keyboardDeleteOrBackspace: + plateView.deleteBackward() + default: + let c = key.charactersIgnoringModifiers.uppercased() + if ruLetters.contains(c) || numbers.contains(c) { + plateView.insertText(c) + } else if enLetters.contains(c) { + if let ruChar = Constants.pnLettersMap.first(where: { $0.value == c.first })?.key { + plateView.insertText(String(ruChar)) + } + } else { + didHandleEvent = false + } + } + } + + if didHandleEvent == false { + super.pressesBegan(presses, with: event) + } + } + + @objc func pasteText() { + guard let text = UIPasteboard.general.string else { + return + } + + plateView.setNumber(text) + } +} + +#endif diff --git a/AutoCat/SceneDelegate.swift b/AutoCat/SceneDelegate.swift index 77613bd..f64609a 100644 --- a/AutoCat/SceneDelegate.swift +++ b/AutoCat/SceneDelegate.swift @@ -48,7 +48,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { if let titlebar = windowScene.titlebar { titlebar.toolbar = toolbar if #available(macCatalyst 14.0, *) { - titlebar.toolbarStyle = .automatic + titlebar.toolbarStyle = .unifiedCompact } } @@ -180,11 +180,16 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { #if targetEnvironment(macCatalyst) +extension NSToolbarItem.Identifier { + + static let addNumber = NSToolbarItem.Identifier("pro.aliencat.add.number") +} + extension SceneDelegate: NSToolbarDelegate { func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { let identifiers: [NSToolbarItem.Identifier] = [ - .toggleSidebar + .addNumber ] return identifiers } @@ -192,6 +197,56 @@ extension SceneDelegate: NSToolbarDelegate { func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { return toolbarDefaultItemIdentifiers(toolbar) } + + func toolbar(_ toolbar: NSToolbar, + itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, + willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { + + var toolbarItem: NSToolbarItem? + + switch itemIdentifier { + case .addNumber: + let item = NSToolbarItem(itemIdentifier: itemIdentifier) + item.image = UIImage(systemName: "plus") + item.label = "Add" + item.target = self + item.action = #selector(showAddNumberPanel) + toolbarItem = item + + default: + toolbarItem = nil + } + + return toolbarItem + } + + @objc func showAddNumberPanel() { + let controller = NewNumberController() + controller.preferredContentSize = CGSize(width: 400, height: 350) + controller.onCheck = { number in + controller.dismiss(animated: true) { [weak self] in + self?.checkNewNumber(number) + } + } + + self.window?.rootViewController?.present(controller, animated: true) + } + + func checkNewNumber(_ number: String) { + guard let split = self.window?.rootViewController as? MainSplitController, + let tabvc = split.viewControllers.first as? UITabBarController + else { + return + } + + tabvc.selectedIndex = 0 + + if let nav = tabvc.selectedViewController as? UINavigationController, + let checkController = nav.viewControllers.first as? CheckController { + + checkController.checkTapped(number: number) + } + } } #endif diff --git a/AutoCat/Views/PlateView.swift b/AutoCat/Views/PlateView.swift index 0005294..0af4e2c 100644 --- a/AutoCat/Views/PlateView.swift +++ b/AutoCat/Views/PlateView.swift @@ -161,6 +161,12 @@ class PlateView: UIView { print("") return CGSize(width: width, height: height) } + + func setNumber(_ number: String) { + self.number?.setNumber(number) + layoutSubviews() + onChange?() + } } extension PlateView: UIKeyInput {