From efbfc27e0c813c31b570d72fded40eb91d07f2db Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Thu, 28 May 2026 21:01:19 +0800
Subject: [PATCH] Add AppKit tag navigation reordering

---
 Apptag/QuickSearch.swift |   36 ++++++++++++++++++++++++++++++------
 1 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/Apptag/QuickSearch.swift b/Apptag/QuickSearch.swift
index 6056150..140861f 100644
--- a/Apptag/QuickSearch.swift
+++ b/Apptag/QuickSearch.swift
@@ -379,15 +379,14 @@
     ) -> [QuickSearchIndexedField] {
         let names = uniqueOrdered([appName] + localizedNames)
         let nameFields = names.map {
-            let allowsRomanizedFuzzy = containsNonLatinLetter($0)
             return QuickSearchIndexedField(
                 kind: .name,
                 text: $0,
                 normalized: normalizeField($0),
                 acronym: acronym(for: $0),
-                pinyinCandidates: pinyinCandidates(for: $0),
-                allowPinyinSubstring: allowsRomanizedFuzzy,
-                allowPinyinFuzzySubsequence: allowsRomanizedFuzzy
+                pinyinCandidates: pinyinCandidates(for: $0, includeLatin: true),
+                allowPinyinSubstring: true,
+                allowPinyinFuzzySubsequence: true
             )
         }
         let tagFields = tagNames.map {
@@ -605,8 +604,8 @@
             .lowercased()
     }
 
-    private static func pinyinCandidates(for value: String) -> [String] {
-        guard containsNonLatinLetter(value) else { return [] }
+    private static func pinyinCandidates(for value: String, includeLatin: Bool = false) -> [String] {
+        guard includeLatin || containsNonLatinLetter(value) else { return [] }
         let mutable = NSMutableString(string: value)
         CFStringTransform(mutable, nil, kCFStringTransformToLatin, false)
         CFStringTransform(mutable, nil, kCFStringTransformStripCombiningMarks, false)
@@ -966,6 +965,7 @@
         field.placeholderString = placeholder
         field.delegate = context.coordinator
         field.onCommand = onCommand
+        context.coordinator.onCommand = onCommand
         field.setAccessibilityLabel(tr("quickSearch.inputAccessibility"))
         context.coordinator.field = field
         requestFocus(field)
@@ -978,6 +978,7 @@
         }
         field.placeholderString = placeholder
         field.onCommand = onCommand
+        context.coordinator.onCommand = onCommand
         if context.coordinator.lastFocusToken != focusToken {
             context.coordinator.lastFocusToken = focusToken
             requestFocus(field)
@@ -1000,6 +1001,7 @@
     final class Coordinator: NSObject, NSTextFieldDelegate {
         var text: Binding<String>
         var lastFocusToken = 0
+        var onCommand: ((QuickSearchCommand) -> Void)?
         weak var field: NSTextField?
 
         init(text: Binding<String>) {
@@ -1010,6 +1012,28 @@
             guard let field = obj.object as? NSTextField else { return }
             text.wrappedValue = field.stringValue
         }
+
+        func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
+            switch commandSelector {
+            case #selector(NSResponder.moveUp(_:)):
+                onCommand?(.moveUp)
+                return true
+            case #selector(NSResponder.moveDown(_:)):
+                onCommand?(.moveDown)
+                return true
+            case #selector(NSResponder.insertNewline(_:)):
+                onCommand?(.submit)
+                return true
+            case #selector(NSResponder.insertNewlineIgnoringFieldEditor(_:)):
+                onCommand?(.submit)
+                return true
+            case #selector(NSResponder.cancelOperation(_:)):
+                onCommand?(.dismiss)
+                return true
+            default:
+                return false
+            }
+        }
     }
 }
 

--
Gitblit v1.9.3