From 2a2582ea5edbe51cd7dd835ed08104ac45a2741c Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Fri, 24 Apr 2026 22:21:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=8F=9C=E5=8D=95=E9=A1=B9=E7=81=B0?= =?UTF-8?q?=E8=89=B2=20=E2=80=94=20=E5=85=B3=E9=97=AD=E6=89=80=E6=9C=89?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=20autoenablesItems=20+=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=20validateMenuItem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/App/MenuBarController.swift | 43 +++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/Sources/App/MenuBarController.swift b/Sources/App/MenuBarController.swift index 65f1ad4..2e82226 100644 --- a/Sources/App/MenuBarController.swift +++ b/Sources/App/MenuBarController.swift @@ -78,10 +78,18 @@ final class MenuBarController: NSObject { languageMenuItems.append(item) } + // 禁用 autoenablesItems,防止系统自动禁用菜单项 + languageMenu.autoenablesItems = false + let languageSubmenuItem = NSMenuItem() languageSubmenuItem.title = "Language" languageSubmenuItem.submenu = languageMenu menu.addItem(languageSubmenuItem) + + // 调试:打印每个语言菜单项的状态 + for item in languageMenuItems { + print("[Menu Debug] Language item: '\(item.title)' enabled=\(item.isEnabled) target=\(String(describing: item.target)) action=\(String(describing: item.action))") + } menu.addItem(.separator()) @@ -109,10 +117,18 @@ final class MenuBarController: NSObject { modeMenuItems.append(assistModeItem) modeMenu.addItem(assistModeItem) + // 禁用 autoenablesItems,防止系统自动禁用菜单项 + modeMenu.autoenablesItems = false + let modeSubmenuItem = NSMenuItem() modeSubmenuItem.title = "Mode" modeSubmenuItem.submenu = modeMenu menu.addItem(modeSubmenuItem) + + // 调试:打印每个模式菜单项的状态 + for item in modeMenuItems { + print("[Menu Debug] Mode item: '\(item.title)' enabled=\(item.isEnabled) target=\(String(describing: item.target)) action=\(String(describing: item.action))") + } menu.addItem(.separator()) @@ -167,9 +183,24 @@ final class MenuBarController: NSObject { quitItem.target = self menu.addItem(quitItem) + // 关闭所有菜单的自动验证,改为手动管理 + menu.autoenablesItems = false + languageMenu.autoenablesItems = false + modeMenu.autoenablesItems = false + inputLLMSubmenu.autoenablesItems = false + assistLLMSubmenu.autoenablesItems = false + statusItem.menu = menu } + // MARK: - NSMenuItemValidation + + /// 手动验证所有菜单项(替代系统的自动验证) + @objc func validateMenuItem(_ menuItem: NSMenuItem) -> Bool { + // 所有菜单项统一启用,由 target/action 决定是否响应 + return true + } + private func updateInputLLMMenuState() { inputLLMEnabledItem.state = Config.shared.inputLLM.enabled ? .on : .off } @@ -196,14 +227,22 @@ final class MenuBarController: NSObject { } @objc private func selectLanguage(_ sender: NSMenuItem) { - guard let lang = sender.representedObject as? RecognitionLanguage else { return } + print("[Menu Debug] selectLanguage called! sender.title=\(sender.title) sender.representedObject=\(String(describing: sender.representedObject))") + guard let lang = sender.representedObject as? RecognitionLanguage else { + print("[Menu Debug] selectLanguage FAILED: representedObject is not RecognitionLanguage, actual type: \(type(of: sender.representedObject))") + return + } Config.shared.language = lang updateLanguageMenuState() print("[Menu] Language switched to: \(lang.displayName)") } @objc private func selectMode(_ sender: NSMenuItem) { - guard let mode = sender.representedObject as? TriggerMode else { return } + print("[Menu Debug] selectMode called! sender.title=\(sender.title) sender.representedObject=\(String(describing: sender.representedObject))") + guard let mode = sender.representedObject as? TriggerMode else { + print("[Menu Debug] selectMode FAILED: representedObject is not TriggerMode, actual type: \(type(of: sender.representedObject))") + return + } Config.shared.triggerMode = mode updateModeMenuState() print("[Menu] Mode switched to: \(mode)")