From b9476d69e0bb3ef3a684454f70d27cb443cb704d Mon Sep 17 00:00:00 2001 From: ggbond268 Date: Mon, 27 Jul 2026 01:40:40 +0800 Subject: [PATCH 01/26] fix: stabilize settings window layout --- Sources/App/AppWindowRouter.swift | 12 +++++++----- Tests/App/AppWindowRouterTests.swift | 17 +++++++++++++---- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Sources/App/AppWindowRouter.swift b/Sources/App/AppWindowRouter.swift index b9668a83..e6731b12 100644 --- a/Sources/App/AppWindowRouter.swift +++ b/Sources/App/AppWindowRouter.swift @@ -163,10 +163,6 @@ final class AppWindowRouter: NSObject, NSWindowDelegate { hostingView.sizingOptions = [] window.contentView = hostingView window.toolbarStyle = .unified - window.setContentSize(SettingsWindowLayout.defaultContentSize) - window.layoutIfNeeded() - // SwiftUI installs its toolbar during layout and can reset window constraints. - window.contentMinSize = SettingsWindowLayout.minimumContentSize window.delegate = self window.isReleasedWhenClosed = false window.onLocalKeyboardCommand = { [weak self] command in @@ -195,8 +191,14 @@ final class AppWindowRouter: NSObject, NSWindowDelegate { settingsNavigationCoordinator?.navigate(to: .plugins(.configuration(pluginID))) } - show(window) + let contentSize = window.contentView?.bounds.size ?? SettingsWindowLayout.defaultContentSize settingsWindow = window + show(window) + // SwiftUI installs its toolbar when the window becomes visible. Finish that + // layout before restoring the content size. + window.layoutIfNeeded() + window.setContentSize(contentSize) + window.layoutIfNeeded() onProgrammaticSettingsPresentation() if let pendingAppUpdateVersion { diff --git a/Tests/App/AppWindowRouterTests.swift b/Tests/App/AppWindowRouterTests.swift index d54a9621..b1116634 100644 --- a/Tests/App/AppWindowRouterTests.swift +++ b/Tests/App/AppWindowRouterTests.swift @@ -41,7 +41,7 @@ final class AppWindowRouterTests: XCTestCase { actions.present(.featurePanel) } - func testSettingsWindowKeepsItsWidthAcrossDestinations() throws { + func testSettingsWindowKeepsItsWidthAcrossDestinations() async throws { let suiteName = "AppWindowRouterTests-\(UUID().uuidString)" let defaults = try XCTUnwrap(UserDefaults(suiteName: suiteName)) defer { defaults.removePersistentDomain(forName: suiteName) } @@ -52,6 +52,7 @@ final class AppWindowRouterTests: XCTestCase { let window = try XCTUnwrap(router.settingsWindow) let coordinator = try XCTUnwrap(router.settingsNavigationCoordinator) let hostingView = try XCTUnwrap(window.contentView as? NSHostingView) + await settleWindowLayout(window) let initialWidth = window.frame.width let initialToolbarItemCount = window.toolbar?.items.count @@ -61,7 +62,6 @@ final class AppWindowRouterTests: XCTestCase { window.toolbar?.items.contains { $0.itemIdentifier == .toggleSidebar } ?? false ) XCTAssertEqual(hostingView.sizingOptions, []) - XCTAssertEqual(window.contentMinSize, SettingsWindowLayout.minimumContentSize) XCTAssertEqual( hostingView.frame.width, SettingsWindowLayout.defaultContentSize.width, @@ -69,7 +69,7 @@ final class AppWindowRouterTests: XCTestCase { ) window.setContentSize(NSSize(width: 940, height: 640)) - window.layoutIfNeeded() + await settleWindowLayout(window) let resizedWidth = window.frame.width XCTAssertLessThan(resizedWidth, initialWidth) @@ -79,7 +79,7 @@ final class AppWindowRouterTests: XCTestCase { .general ] { coordinator.navigate(to: destination) - window.layoutIfNeeded() + await settleWindowLayout(window) XCTAssertEqual(window.frame.width, resizedWidth, accuracy: 0.5) XCTAssertEqual(window.toolbar?.items.count, initialToolbarItemCount) } @@ -87,6 +87,15 @@ final class AppWindowRouterTests: XCTestCase { window.close() } + private func settleWindowLayout(_ window: NSWindow) async { + await withCheckedContinuation { continuation in + DispatchQueue.main.async { + continuation.resume() + } + } + window.layoutIfNeeded() + } + func testSettingsWindowConstrainsLiveResizeToMinimumContentSize() throws { let suiteName = "AppWindowRouterTests-\(UUID().uuidString)" let defaults = try XCTUnwrap(UserDefaults(suiteName: suiteName)) From 619d807d194d1a9fda5e12ab2a9d9001eb7443f0 Mon Sep 17 00:00:00 2001 From: xcv58 Date: Sun, 26 Jul 2026 23:58:10 -0400 Subject: [PATCH 02/26] feat(settings): add plugin subpage keyboard navigation --- README.md | 2 +- .../App/SettingsNavigationCoordinator.swift | 55 +++++ Sources/App/SettingsView.swift | 192 +++++++++++++----- .../Resources/Localization/Settings.xcstrings | 16 ++ ...tingsDestinationShortcutButtonsTests.swift | 108 +++++++++- .../SettingsNavigationCoordinatorTests.swift | 136 +++++++++++++ .../PluginLocalizationCatalogAuditTests.swift | 1 + .../unreleased/native-settings-navigation.md | 2 +- 8 files changed, 461 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index c3222a80..652fb100 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ | Fix Damaged Apps | Remove quarantine attributes to resolve "damaged and can't be opened" prompts by selecting a .app in a file panel and running the fix with administrator privileges. | | Quit Apps | Select and quit running apps, or quit all at once; multiple instances of the same app are grouped into one stable entry, and reverse selection helps quickly choose the target set. | | zsh Config | View and edit zsh configuration files such as .zshrc and .zshenv inside the app, with syntax highlighting, common snippets, and automatic backup before saving. | -| Plugins & Settings | Switch between feature and component panels from the centered menu-bar toolbar or with ⌘1/⌘2, dismiss a menu-bar panel with Esc, and open or focus Settings from an active MacTools surface with ⌘,. Jump among General, Plugins, and About in Settings with ⌘1/⌘2/⌘3, and press ⌘F to focus search in the Marketplace, including installed plugins. Plugin settings use an always-visible native resizable sidebar; the Settings window keeps a consistent width across pages and a usable minimum size, and its Back/Forward toolbar controls (⌘[/⌘]) restore the exact Plugins subpage. Install, update, batch-update, and uninstall plugins in the Marketplace (filter by category/search; sort by not-installed first, installed first, or name using the selected app language). Dashboard and Feature Panel independently control which supported plugins appear there and their order. Double-click a button or switch row subtitle to copy it without invoking the primary control. Use a row’s icon to open settings, its eye control to show or hide it on that surface, and its contextual menu to view the Marketplace entry or uninstall without leaving the layout; manage permissions, plugin-specific settings, and global shortcuts—including standalone F1-F12 function keys plus optional shortcuts to open Settings, toggle Dashboard, or toggle Feature Panel—and export/import portable app preferences, plugin layout orders and visibility, and shortcut customizations as JSON. | +| Plugins & Settings | Switch between feature and component panels from the centered menu-bar toolbar or with ⌘1/⌘2, dismiss a menu-bar panel with Esc, and open or focus Settings from an active MacTools surface with ⌘,. Jump among General, Plugins, and About in Settings with ⌘1/⌘2/⌘3, move between visible Plugins subpages with ⌃⌘↑/⌃⌘↓, and press ⌘F to focus search in the Marketplace, including installed plugins. Plugin settings use an always-visible native resizable sidebar with focused ↑/↓ navigation; the Settings window keeps a consistent width across pages and a usable minimum size, and its Back/Forward toolbar controls (⌘[/⌘]) restore the exact Plugins subpage. Install, update, batch-update, and uninstall plugins in the Marketplace (filter by category/search; sort by not-installed first, installed first, or name using the selected app language). Dashboard and Feature Panel independently control which supported plugins appear there and their order. Double-click a button or switch row subtitle to copy it without invoking the primary control. Use a row’s icon to open settings, its eye control to show or hide it on that surface, and its contextual menu to view the Marketplace entry or uninstall without leaving the layout; manage permissions, plugin-specific settings, and global shortcuts—including standalone F1-F12 function keys plus optional shortcuts to open Settings, toggle Dashboard, or toggle Feature Panel—and export/import portable app preferences, plugin layout orders and visibility, and shortcut customizations as JSON. | | Menu Bar Icon Customization | Use local images or lightweight GIF/MP4 animations as the menu bar icon, choose static or animated icons from the online gallery with clear animation badges, preserve original colors and transparency on local import, automatically adapt monochrome gallery icons to the menu bar appearance, restore the default icon, and preview every source with the same standard icon height and content inset as the default. | | Localization | Follow the system language by default, or choose a fixed app language in Settings > General > Appearance; the picker shows each language in the system language and its native spelling, while menu-bar action buttons adapt to localized label lengths. | diff --git a/Sources/App/SettingsNavigationCoordinator.swift b/Sources/App/SettingsNavigationCoordinator.swift index aefd16e1..cf3830a4 100644 --- a/Sources/App/SettingsNavigationCoordinator.swift +++ b/Sources/App/SettingsNavigationCoordinator.swift @@ -41,6 +41,23 @@ enum SettingsSearchField: Equatable { case pluginMarketplace } +enum PluginSubpageMoveDirection { + case previous + case next +} + +extension FeatureSettingsPane { + static func settingsSidebarOrder( + configurationIDs: some Sequence + ) -> [FeatureSettingsPane] { + [ + .dashboardLayout, + .featurePanelLayout, + .marketplace + ] + configurationIDs.map(FeatureSettingsPane.configuration) + } +} + struct SettingsSearchFocusRequest: Equatable { let id: UInt let field: SettingsSearchField @@ -64,6 +81,7 @@ final class SettingsNavigationCoordinator: ObservableObject { private(set) var focusedSearchField: SettingsSearchField? private let pluginSettingsLandingPage: () -> FeatureSettingsPane + private let pluginSubpageOrder: () -> [FeatureSettingsPane] private let isPluginConfigurationAvailable: (String) -> Bool private let selectPluginSettingsPane: (FeatureSettingsPane) -> Bool private var nextSearchFocusRequestID: UInt = 0 @@ -72,6 +90,11 @@ final class SettingsNavigationCoordinator: ObservableObject { convenience init(pluginHost: PluginHost) { self.init( pluginSettingsLandingPage: { pluginHost.pluginSettingsLandingPage() }, + pluginSubpageOrder: { + FeatureSettingsPane.settingsSidebarOrder( + configurationIDs: pluginHost.pluginConfigurationItems.map(\.id) + ) + }, isPluginConfigurationAvailable: { pluginHost.hasPluginConfiguration(pluginID: $0) }, selectPluginSettingsPane: { pluginHost.selectFeatureSettingsPane($0) } ) @@ -80,6 +103,7 @@ final class SettingsNavigationCoordinator: ObservableObject { init( initialDestination: SettingsNavigationDestination = .general, pluginSettingsLandingPage: @escaping () -> FeatureSettingsPane = { .marketplace }, + pluginSubpageOrder: @escaping () -> [FeatureSettingsPane] = { [] }, isPluginConfigurationAvailable: @escaping (String) -> Bool = { _ in true }, selectPluginSettingsPane: @escaping (FeatureSettingsPane) -> Bool = { _ in true } ) { @@ -87,6 +111,7 @@ final class SettingsNavigationCoordinator: ObservableObject { self.history = [initialDestination] self.historyIndex = 0 self.pluginSettingsLandingPage = pluginSettingsLandingPage + self.pluginSubpageOrder = pluginSubpageOrder self.isPluginConfigurationAvailable = isPluginConfigurationAvailable self.selectPluginSettingsPane = selectPluginSettingsPane } @@ -131,6 +156,36 @@ final class SettingsNavigationCoordinator: ObservableObject { activate(destination) } + func movePluginSubpage( + _ direction: PluginSubpageMoveDirection, + in orderedPanes: [FeatureSettingsPane] + ) { + guard + case let .plugins(currentPane) = destination, + let currentIndex = orderedPanes.firstIndex(of: currentPane) + else { + return + } + + let adjacentIndex: Int + switch direction { + case .previous: + adjacentIndex = currentIndex - 1 + case .next: + adjacentIndex = currentIndex + 1 + } + + guard orderedPanes.indices.contains(adjacentIndex) else { + return + } + + navigate(to: .plugins(orderedPanes[adjacentIndex])) + } + + func movePluginSubpage(_ direction: PluginSubpageMoveDirection) { + movePluginSubpage(direction, in: pluginSubpageOrder()) + } + func requestAboutUpdateAction(version: String) { navigate(to: .about) nextAboutUpdateActionRequestID &+= 1 diff --git a/Sources/App/SettingsView.swift b/Sources/App/SettingsView.swift index c47b60b3..4972d7df 100644 --- a/Sources/App/SettingsView.swift +++ b/Sources/App/SettingsView.swift @@ -27,6 +27,9 @@ struct SettingsView: View { var body: some View { // Recreate native AppKit-backed controls when the shared locale changes. let _ = runtimeLocale.revision + let orderedPluginPanes = FeatureSettingsPane.settingsSidebarOrder( + configurationIDs: pluginHost.pluginConfigurationItems.map(\.id) + ) return TabView(selection: settingsDestinationBinding) { GeneralSettingsView( @@ -45,7 +48,8 @@ struct SettingsView: View { navigationCoordinator: navigationCoordinator, uninstallConfirmationSession: uninstallConfirmationSession, showDashboard: showDashboard, - showFeaturePanel: showFeaturePanel + showFeaturePanel: showFeaturePanel, + orderedPanes: orderedPluginPanes ) .tag(SettingsDestination.pluginConfiguration) .tabItem { @@ -104,6 +108,8 @@ struct SettingsDestinationShortcutButtons: View { shortcutButton(for: .about, key: "3") historyShortcutButton(key: "[") { coordinator.goBack() } historyShortcutButton(key: "]") { coordinator.goForward() } + pluginSubpageShortcutButton(key: .upArrow, direction: .previous) + pluginSubpageShortcutButton(key: .downArrow, direction: .next) } .frame(width: 0, height: 0) .opacity(0) @@ -129,6 +135,17 @@ struct SettingsDestinationShortcutButtons: View { .keyboardShortcut(key, modifiers: [.command]) .focusable(false) } + + private func pluginSubpageShortcutButton( + key: KeyEquivalent, + direction: PluginSubpageMoveDirection + ) -> some View { + Button("") { + coordinator.movePluginSubpage(direction) + } + .keyboardShortcut(key, modifiers: [.control, .command]) + .focusable(false) + } } struct SettingsHistoryNavigationControls: View { @@ -974,12 +991,17 @@ private struct FeatureSettingsView: View { @ObservedObject var uninstallConfirmationSession: PluginUninstallConfirmationSession let showDashboard: () -> Void let showFeaturePanel: () -> Void + let orderedPanes: [FeatureSettingsPane] var body: some View { HSplitView { FeatureSettingsSidebar( configurationItems: pluginHost.pluginConfigurationItems, - selection: selectionBinding + orderedPanes: orderedPanes, + selection: selectionBinding, + moveSelection: { direction in + navigationCoordinator.movePluginSubpage(direction, in: orderedPanes) + } ) .frame( minWidth: Layout.sidebarMinWidth, @@ -1022,61 +1044,133 @@ private struct FeatureSettingsView: View { private struct FeatureSettingsSidebar: View { let configurationItems: [PluginConfigurationItem] + let orderedPanes: [FeatureSettingsPane] @Binding var selection: FeatureSettingsPane + let moveSelection: (PluginSubpageMoveDirection) -> Void + @FocusState private var isSidebarFocused: Bool var body: some View { - List(selection: optionalSelectionBinding) { - Section(AppL10n.settings( - "plugins.sidebar.pluginsSection", - defaultValue: "插件" - )) { - FeatureSettingsSidebarRow( - title: AppL10n.settings("plugins.sidebar.dashboard", defaultValue: "仪表盘"), - systemImage: "square.grid.2x2", - iconTint: .blue - ) - .tag(FeatureSettingsPane.dashboardLayout) + ScrollViewReader { proxy in + List(selection: optionalSelectionBinding) { + Section(AppL10n.settings( + "plugins.sidebar.pluginsSection", + defaultValue: "插件" + )) { + ForEach(primaryPanes, id: \.self) { pane in + sidebarRow(for: pane) + } + } - FeatureSettingsSidebarRow( - title: AppL10n.settings("plugins.sidebar.featurePanel", defaultValue: "功能面板"), - systemImage: "switch.2", - iconTint: .purple - ) - .tag(FeatureSettingsPane.featurePanelLayout) + Section(AppL10n.settings( + "plugins.sidebar.configurationSection", + defaultValue: "插件设置" + )) { + if configurationPanes.isEmpty { + Text(AppL10n.settings("plugins.sidebar.emptyConfigurations", defaultValue: "暂无可设置插件")) + .font(PluginSettingsTheme.Typography.secondaryLabel) + .foregroundStyle(.secondary) + } else { + ForEach(configurationPanes, id: \.self) { pane in + sidebarRow(for: pane) + } + } + } + } + .listStyle(.sidebar) + .scrollContentBackground(.hidden) + .background { + SettingsSidebarMaterialBackground() + .allowsHitTesting(false) + } + .focusable(interactions: .activate) + .focused($isSidebarFocused) + .onMoveCommand { direction in + switch direction { + case .up: + moveSelection(.previous) + case .down: + moveSelection(.next) + default: + break + } + } + .onChange(of: selection) { + withAnimation { + proxy.scrollTo(selection, anchor: .center) + } + } + .overlay { + if isSidebarFocused { + RoundedRectangle(cornerRadius: 6, style: .continuous) + .stroke(Color.accentColor.opacity(0.55), lineWidth: 1) + .padding(2) + .allowsHitTesting(false) + .accessibilityHidden(true) + } + } + .accessibilityElement(children: .contain) + .accessibilityLabel(AppL10n.settings( + "plugins.sidebar.accessibilityLabel", + defaultValue: "插件导航" + )) + } + } - FeatureSettingsSidebarRow( - title: AppL10n.settings("plugins.sidebar.marketplace", defaultValue: "市场"), - systemImage: "shippingbox", - iconTint: .blue - ) - .tag(FeatureSettingsPane.marketplace) + private var primaryPanes: [FeatureSettingsPane] { + orderedPanes.filter { + guard case .configuration = $0 else { + return true } + return false + } + } - Section(AppL10n.settings( - "plugins.sidebar.configurationSection", - defaultValue: "插件设置" - )) { - if configurationItems.isEmpty { - Text(AppL10n.settings("plugins.sidebar.emptyConfigurations", defaultValue: "暂无可设置插件")) - .font(PluginSettingsTheme.Typography.secondaryLabel) - .foregroundStyle(.secondary) - } else { - ForEach(configurationItems) { item in - FeatureSettingsSidebarRow( - title: item.title, - systemImage: item.iconName, - iconTint: item.iconTint - ) - .tag(FeatureSettingsPane.configuration(item.id)) - } - } + private var configurationPanes: [FeatureSettingsPane] { + orderedPanes.filter { + if case .configuration = $0 { + return true } + return false } - .listStyle(.sidebar) - .scrollContentBackground(.hidden) - .background { - SettingsSidebarMaterialBackground() - .allowsHitTesting(false) + } + + @ViewBuilder + private func sidebarRow(for pane: FeatureSettingsPane) -> some View { + switch pane { + case .dashboardLayout: + FeatureSettingsSidebarRow( + title: AppL10n.settings("plugins.sidebar.dashboard", defaultValue: "仪表盘"), + systemImage: "square.grid.2x2", + iconTint: .blue + ) + .tag(pane) + .id(pane) + case .featurePanelLayout: + FeatureSettingsSidebarRow( + title: AppL10n.settings("plugins.sidebar.featurePanel", defaultValue: "功能面板"), + systemImage: "switch.2", + iconTint: .purple + ) + .tag(pane) + .id(pane) + case .marketplace: + FeatureSettingsSidebarRow( + title: AppL10n.settings("plugins.sidebar.marketplace", defaultValue: "市场"), + systemImage: "shippingbox", + iconTint: .blue + ) + .tag(pane) + .id(pane) + case let .configuration(pluginID): + if let item = configurationItems.first(where: { $0.id == pluginID }) { + FeatureSettingsSidebarRow( + title: item.title, + systemImage: item.iconName, + iconTint: item.iconTint + ) + .tag(pane) + .id(pane) + } } } @@ -1087,6 +1181,7 @@ private struct FeatureSettingsSidebar: View { guard let newSelection else { return } + isSidebarFocused = true selection = newSelection } ) @@ -1132,6 +1227,7 @@ private struct FeatureSettingsSidebarRow: View { .frame(width: Layout.iconWidth) } .font(.body) + .focusable(false) .help(title) } } diff --git a/Sources/Resources/Localization/Settings.xcstrings b/Sources/Resources/Localization/Settings.xcstrings index fec70a3a..2d797c3d 100644 --- a/Sources/Resources/Localization/Settings.xcstrings +++ b/Sources/Resources/Localization/Settings.xcstrings @@ -241,6 +241,22 @@ "zh-Hant": { "stringUnit": { "state": "translated", "value": "功能面板" } } } }, + "plugins.sidebar.accessibilityLabel": { + "extractionState": "manual", + "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "التنقل بين الإضافات" } }, + "de": { "stringUnit": { "state": "translated", "value": "Plugin-Navigation" } }, + "en": { "stringUnit": { "state": "translated", "value": "Plugin Navigation" } }, + "es": { "stringUnit": { "state": "translated", "value": "Navegación de complementos" } }, + "fr": { "stringUnit": { "state": "translated", "value": "Navigation des modules" } }, + "ja": { "stringUnit": { "state": "translated", "value": "プラグインナビゲーション" } }, + "ko": { "stringUnit": { "state": "translated", "value": "플러그인 탐색" } }, + "pt": { "stringUnit": { "state": "translated", "value": "Navegação de plug-ins" } }, + "ru": { "stringUnit": { "state": "translated", "value": "Навигация по плагинам" } }, + "zh-Hans": { "stringUnit": { "state": "translated", "value": "插件导航" } }, + "zh-Hant": { "stringUnit": { "state": "translated", "value": "外掛導覽" } } + } + }, "plugins.sidebar.pluginsSection": { "extractionState": "manual", "localizations": { diff --git a/Tests/App/SettingsDestinationShortcutButtonsTests.swift b/Tests/App/SettingsDestinationShortcutButtonsTests.swift index 80b0af64..b2870bd3 100644 --- a/Tests/App/SettingsDestinationShortcutButtonsTests.swift +++ b/Tests/App/SettingsDestinationShortcutButtonsTests.swift @@ -7,6 +7,89 @@ import MacToolsPluginKit @MainActor final class SettingsDestinationShortcutButtonsTests: XCTestCase { + func testControlCommandArrowShortcutsMoveBetweenPluginSubpages() { + let orderedPanes: [FeatureSettingsPane] = [ + .dashboardLayout, + .featurePanelLayout, + .marketplace, + .configuration("fan-control") + ] + let coordinator = SettingsNavigationCoordinator( + initialDestination: .plugins(.marketplace), + pluginSubpageOrder: { orderedPanes }, + isPluginConfigurationAvailable: { $0 == "fan-control" } + ) + let window = makeWindow(coordinator: coordinator) + + XCTAssertTrue(performPluginArrowShortcut(up: true, in: window)) + XCTAssertEqual(coordinator.destination, .plugins(.featurePanelLayout)) + + XCTAssertTrue(performPluginArrowShortcut(up: false, in: window)) + XCTAssertEqual(coordinator.destination, .plugins(.marketplace)) + + XCTAssertTrue(performPluginArrowShortcut(up: false, in: window)) + XCTAssertEqual(coordinator.destination, .plugins(.configuration("fan-control"))) + } + + func testControlCommandArrowShortcutsDoNothingOutsidePlugins() { + let coordinator = SettingsNavigationCoordinator( + initialDestination: .about, + pluginSubpageOrder: { + [.dashboardLayout, .featurePanelLayout, .marketplace] + } + ) + let window = makeWindow(coordinator: coordinator) + + XCTAssertTrue(performPluginArrowShortcut(up: true, in: window)) + XCTAssertTrue(performPluginArrowShortcut(up: false, in: window)) + XCTAssertEqual(coordinator.destination, .about) + XCTAssertEqual(coordinator.history, [.about]) + } + + func testControlCommandArrowShortcutsStopAtPluginBoundaries() { + let orderedPanes: [FeatureSettingsPane] = [ + .dashboardLayout, + .featurePanelLayout, + .marketplace + ] + let coordinator = SettingsNavigationCoordinator( + initialDestination: .plugins(.dashboardLayout), + pluginSubpageOrder: { orderedPanes } + ) + let window = makeWindow(coordinator: coordinator) + + XCTAssertTrue(performPluginArrowShortcut(up: true, in: window)) + XCTAssertEqual(coordinator.history, [.plugins(.dashboardLayout)]) + + coordinator.navigate(to: .plugins(.marketplace)) + XCTAssertTrue(performPluginArrowShortcut(up: false, in: window)) + XCTAssertEqual( + coordinator.history, + [.plugins(.dashboardLayout), .plugins(.marketplace)] + ) + } + + func testControlCommandArrowReadsConfigurationsAddedAfterShortcutRegistration() { + var configurationIDs: [String] = [] + let coordinator = SettingsNavigationCoordinator( + initialDestination: .plugins(.marketplace), + pluginSubpageOrder: { + FeatureSettingsPane.settingsSidebarOrder( + configurationIDs: configurationIDs + ) + }, + isPluginConfigurationAvailable: { configurationIDs.contains($0) } + ) + let window = makeWindow(coordinator: coordinator) + + XCTAssertTrue(performPluginArrowShortcut(up: false, in: window)) + XCTAssertEqual(coordinator.destination, .plugins(.marketplace)) + + configurationIDs = ["fan-control"] + XCTAssertTrue(performPluginArrowShortcut(up: false, in: window)) + XCTAssertEqual(coordinator.destination, .plugins(.configuration("fan-control"))) + } + func testCommandNumberShortcutsSelectMatchingDestinations() { let coordinator = SettingsNavigationCoordinator( pluginSettingsLandingPage: { .featurePanelLayout } @@ -74,15 +157,38 @@ final class SettingsDestinationShortcutButtonsTests: XCTestCase { return window } + private func performPluginArrowShortcut(up: Bool, in window: NSWindow) -> Bool { + performShortcut( + key: up ? "\u{F700}" : "\u{F701}", + keyCode: UInt16(up ? kVK_UpArrow : kVK_DownArrow), + modifiers: [.control, .command], + in: window + ) + } + private func performCommandShortcut( key: String, keyCode: UInt16, in window: NSWindow + ) -> Bool { + performShortcut( + key: key, + keyCode: keyCode, + modifiers: [.command], + in: window + ) + } + + private func performShortcut( + key: String, + keyCode: UInt16, + modifiers: NSEvent.ModifierFlags, + in window: NSWindow ) -> Bool { let event = NSEvent.keyEvent( with: .keyDown, location: .zero, - modifierFlags: [.command], + modifierFlags: modifiers, timestamp: 0, windowNumber: window.windowNumber, context: nil, diff --git a/Tests/App/SettingsNavigationCoordinatorTests.swift b/Tests/App/SettingsNavigationCoordinatorTests.swift index 08c549a0..f31b78f5 100644 --- a/Tests/App/SettingsNavigationCoordinatorTests.swift +++ b/Tests/App/SettingsNavigationCoordinatorTests.swift @@ -3,6 +3,142 @@ import XCTest @MainActor final class SettingsNavigationCoordinatorTests: XCTestCase { + func testPluginSidebarOrderPlacesBuiltInPanesBeforeDisplayedConfigurations() { + XCTAssertEqual( + FeatureSettingsPane.settingsSidebarOrder( + configurationIDs: ["calendar", "fan-control"] + ), + [ + .dashboardLayout, + .featurePanelLayout, + .marketplace, + .configuration("calendar"), + .configuration("fan-control") + ] + ) + } + + func testMovesPluginSubpageInSuppliedVisibleOrder() { + let orderedPanes: [FeatureSettingsPane] = [ + .configuration("fan-control"), + .marketplace, + .dashboardLayout + ] + let coordinator = SettingsNavigationCoordinator( + initialDestination: .plugins(.marketplace), + isPluginConfigurationAvailable: { $0 == "fan-control" } + ) + + coordinator.movePluginSubpage(.previous, in: orderedPanes) + XCTAssertEqual(coordinator.destination, .plugins(.configuration("fan-control"))) + + coordinator.movePluginSubpage(.next, in: orderedPanes) + XCTAssertEqual(coordinator.destination, .plugins(.marketplace)) + + coordinator.movePluginSubpage(.next, in: orderedPanes) + XCTAssertEqual(coordinator.destination, .plugins(.dashboardLayout)) + } + + func testPluginSubpageMovementStopsAtBothBoundaries() { + let orderedPanes: [FeatureSettingsPane] = [ + .dashboardLayout, + .featurePanelLayout, + .marketplace + ] + let coordinator = SettingsNavigationCoordinator( + initialDestination: .plugins(.dashboardLayout) + ) + + coordinator.movePluginSubpage(.previous, in: orderedPanes) + XCTAssertEqual(coordinator.destination, .plugins(.dashboardLayout)) + XCTAssertEqual(coordinator.history, [.plugins(.dashboardLayout)]) + + coordinator.navigate(to: .plugins(.marketplace)) + coordinator.movePluginSubpage(.next, in: orderedPanes) + XCTAssertEqual(coordinator.destination, .plugins(.marketplace)) + XCTAssertEqual( + coordinator.history, + [.plugins(.dashboardLayout), .plugins(.marketplace)] + ) + } + + func testPluginSubpageMovementDoesNothingOutsidePlugins() { + let coordinator = SettingsNavigationCoordinator(initialDestination: .about) + + coordinator.movePluginSubpage( + .next, + in: [.dashboardLayout, .featurePanelLayout, .marketplace] + ) + + XCTAssertEqual(coordinator.destination, .about) + XCTAssertEqual(coordinator.history, [.about]) + } + + func testPluginSubpageMovementRecordsHistoryAndInvalidatesForwardHistory() { + let orderedPanes: [FeatureSettingsPane] = [ + .dashboardLayout, + .featurePanelLayout, + .marketplace + ] + let coordinator = SettingsNavigationCoordinator( + initialDestination: .plugins(.dashboardLayout) + ) + coordinator.navigate(to: .plugins(.featurePanelLayout)) + coordinator.navigate(to: .plugins(.marketplace)) + coordinator.goBack() + + coordinator.movePluginSubpage(.previous, in: orderedPanes) + + XCTAssertEqual(coordinator.destination, .plugins(.dashboardLayout)) + XCTAssertEqual( + coordinator.history, + [ + .plugins(.dashboardLayout), + .plugins(.featurePanelLayout), + .plugins(.dashboardLayout) + ] + ) + XCTAssertFalse(coordinator.canGoForward) + } + + func testPluginSubpageMovementIgnoresRemovedCurrentConfiguration() { + var availableConfigurationIDs: Set = ["fan-control"] + let coordinator = SettingsNavigationCoordinator( + initialDestination: .plugins(.configuration("fan-control")), + isPluginConfigurationAvailable: { availableConfigurationIDs.contains($0) } + ) + availableConfigurationIDs.remove("fan-control") + + coordinator.movePluginSubpage( + .previous, + in: [.dashboardLayout, .featurePanelLayout, .marketplace] + ) + + XCTAssertEqual(coordinator.destination, .plugins(.configuration("fan-control"))) + XCTAssertEqual(coordinator.history, [.plugins(.configuration("fan-control"))]) + } + + func testPluginSubpageMovementReadsLatestDynamicOrder() { + var configurationIDs: [String] = [] + let coordinator = SettingsNavigationCoordinator( + initialDestination: .plugins(.marketplace), + pluginSubpageOrder: { + FeatureSettingsPane.settingsSidebarOrder( + configurationIDs: configurationIDs + ) + }, + isPluginConfigurationAvailable: { configurationIDs.contains($0) } + ) + + coordinator.movePluginSubpage(.next) + XCTAssertEqual(coordinator.destination, .plugins(.marketplace)) + + configurationIDs = ["fan-control"] + coordinator.movePluginSubpage(.next) + + XCTAssertEqual(coordinator.destination, .plugins(.configuration("fan-control"))) + } + func testRecordsCompletePluginDestinationsAndRestoresExactPaneDuringTraversal() { let coordinator = SettingsNavigationCoordinator( isPluginConfigurationAvailable: { $0 == "fan-control" } diff --git a/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift b/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift index aad8e5ae..dde6eff0 100644 --- a/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift +++ b/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift @@ -51,6 +51,7 @@ final class PluginLocalizationCatalogAuditTests: XCTestCase { "plugins.featurePanel.open", "plugins.featurePanel.title", "plugins.layout.restoreDefaultOrder", + "plugins.sidebar.accessibilityLabel", "plugins.sidebar.dashboard", "plugins.sidebar.featurePanel", "plugins.sidebar.pluginsSection", diff --git a/changes/unreleased/native-settings-navigation.md b/changes/unreleased/native-settings-navigation.md index b8120396..74fbf685 100644 --- a/changes/unreleased/native-settings-navigation.md +++ b/changes/unreleased/native-settings-navigation.md @@ -4,4 +4,4 @@ type: changed area: Settings --- -Plugin settings now use an always-visible, appearance-adaptive native resizable sidebar, while the Settings window keeps a consistent width, preserves a usable minimum size, and provides Back and Forward controls in its toolbar. +Plugin settings now use an always-visible, appearance-adaptive native resizable sidebar with focused arrow-key navigation and window-wide Control-Command-Up/Down shortcuts. The Settings window keeps a consistent width, preserves a usable minimum size, and provides Back and Forward controls in its toolbar. From 78d3040c6594b3f6331c34354bffcff05bdab643 Mon Sep 17 00:00:00 2001 From: xcv58 Date: Mon, 27 Jul 2026 00:08:36 -0400 Subject: [PATCH 03/26] fix(settings): refine plugin sidebar behavior --- Sources/App/SettingsView.swift | 35 ++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/Sources/App/SettingsView.swift b/Sources/App/SettingsView.swift index 4972d7df..cbbe5485 100644 --- a/Sources/App/SettingsView.swift +++ b/Sources/App/SettingsView.swift @@ -1052,28 +1052,35 @@ private struct FeatureSettingsSidebar: View { var body: some View { ScrollViewReader { proxy in List(selection: optionalSelectionBinding) { - Section(AppL10n.settings( - "plugins.sidebar.pluginsSection", - defaultValue: "插件" - )) { + Section { ForEach(primaryPanes, id: \.self) { pane in sidebarRow(for: pane) } + } header: { + Text(AppL10n.settings( + "plugins.sidebar.pluginsSection", + defaultValue: "插件" + )) + .accessibilityHidden(true) } - Section(AppL10n.settings( - "plugins.sidebar.configurationSection", - defaultValue: "插件设置" - )) { + Section { if configurationPanes.isEmpty { - Text(AppL10n.settings("plugins.sidebar.emptyConfigurations", defaultValue: "暂无可设置插件")) + Text(emptyConfigurationsText) .font(PluginSettingsTheme.Typography.secondaryLabel) .foregroundStyle(.secondary) + .accessibilityHidden(true) } else { ForEach(configurationPanes, id: \.self) { pane in sidebarRow(for: pane) } } + } header: { + Text(AppL10n.settings( + "plugins.sidebar.configurationSection", + defaultValue: "插件设置" + )) + .accessibilityHidden(true) } } .listStyle(.sidebar) @@ -1096,7 +1103,7 @@ private struct FeatureSettingsSidebar: View { } .onChange(of: selection) { withAnimation { - proxy.scrollTo(selection, anchor: .center) + proxy.scrollTo(selection) } } .overlay { @@ -1113,9 +1120,17 @@ private struct FeatureSettingsSidebar: View { "plugins.sidebar.accessibilityLabel", defaultValue: "插件导航" )) + .accessibilityHint(configurationPanes.isEmpty ? emptyConfigurationsText : "") } } + private var emptyConfigurationsText: String { + AppL10n.settings( + "plugins.sidebar.emptyConfigurations", + defaultValue: "暂无可设置插件" + ) + } + private var primaryPanes: [FeatureSettingsPane] { orderedPanes.filter { guard case .configuration = $0 else { From 0a5048524c3327f620c4d8cb18906f2801179c77 Mon Sep 17 00:00:00 2001 From: xcv58 Date: Mon, 27 Jul 2026 20:07:41 -0400 Subject: [PATCH 04/26] feat(settings): add unified search palette --- .../Resources/Localizable.xcstrings | 32 + .../Sources/DisplayBrightnessPlugin.swift | 35 +- .../DisplayBrightnessSettingsView.swift | 8 + .../Sources/DisplaySleepPlugin.swift | 21 +- .../KeepAwake/Sources/KeepAwakePlugin.swift | 52 +- .../Sources/KeepAwakeSettingsView.swift | 13 + .../LockScreen/Sources/LockScreenPlugin.swift | 21 +- README.md | 2 +- README.zh-CN.md | 2 +- Sources/App/AppL10n.swift | 12 + Sources/App/AppWindowRouter.swift | 10 + Sources/App/MacToolsSearch.swift | 713 ++++++++++++++++++ Sources/App/MenuBarPanelPresenter.swift | 10 + Sources/App/MenuBarStatusItemController.swift | 3 + .../App/SettingsNavigationCoordinator.swift | 73 ++ Sources/App/SettingsView.swift | 489 +++++++++--- Sources/App/ShortcutSettingsView.swift | 8 + Sources/App/UnifiedSearchPaletteView.swift | 496 ++++++++++++ Sources/Core/Plugins/PluginHost.swift | 79 ++ .../PluginSearchModels.swift | 142 ++++ .../Resources/Localization/Search.xcstrings | 78 ++ Tests/App/AppWindowRouterTests.swift | 40 + Tests/App/MacToolsSearchTests.swift | 412 ++++++++++ Tests/App/MenuBarPanelPresenterTests.swift | 24 +- .../SettingsNavigationCoordinatorTests.swift | 94 +++ .../PluginLocalizationCatalogAuditTests.swift | 41 +- changes/unreleased/plugin-search-discovery.md | 7 + changes/unreleased/unified-search.md | 7 + docs/plugins/local-native-plugins.md | 6 + 29 files changed, 2832 insertions(+), 98 deletions(-) create mode 100644 Sources/App/MacToolsSearch.swift create mode 100644 Sources/App/UnifiedSearchPaletteView.swift create mode 100644 Sources/MacToolsPluginKit/PluginSearchModels.swift create mode 100644 Sources/Resources/Localization/Search.xcstrings create mode 100644 Tests/App/MacToolsSearchTests.swift create mode 100644 changes/unreleased/plugin-search-discovery.md create mode 100644 changes/unreleased/unified-search.md diff --git a/Plugins/DisplayBrightness/Resources/Localizable.xcstrings b/Plugins/DisplayBrightness/Resources/Localizable.xcstrings index 679b94e5..019ca3d5 100644 --- a/Plugins/DisplayBrightness/Resources/Localizable.xcstrings +++ b/Plugins/DisplayBrightness/Resources/Localizable.xcstrings @@ -2698,6 +2698,38 @@ } } } + }, + "settings.shortcutTarget.searchDescription": { + "extractionState": "manual", + "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "اختر نطاق الشاشات التي تتحكم بها اختصارات السطوع." } }, + "de": { "stringUnit": { "state": "translated", "value": "Wähle, welche Displays von den Helligkeitskurzbefehlen gesteuert werden." } }, + "en": { "stringUnit": { "state": "translated", "value": "Choose which displays are controlled by brightness shortcuts." } }, + "es": { "stringUnit": { "state": "translated", "value": "Elige qué pantallas controlan los atajos de brillo." } }, + "fr": { "stringUnit": { "state": "translated", "value": "Choisissez les écrans contrôlés par les raccourcis de luminosité." } }, + "ja": { "stringUnit": { "state": "translated", "value": "明るさのショートカットで操作するディスプレイを選択します。" } }, + "ko": { "stringUnit": { "state": "translated", "value": "밝기 단축키로 제어할 디스플레이 범위를 선택합니다." } }, + "pt": { "stringUnit": { "state": "translated", "value": "Escolha quais telas são controladas pelos atalhos de brilho." } }, + "ru": { "stringUnit": { "state": "translated", "value": "Выберите дисплеи, которыми управляют сочетания яркости." } }, + "zh-Hans": { "stringUnit": { "state": "translated", "value": "选择亮度快捷键控制的显示器范围。" } }, + "zh-Hant": { "stringUnit": { "state": "translated", "value": "選擇亮度快速鍵控制的顯示器範圍。" } } + } + }, + "settings.shortcutTarget.searchKeyword": { + "extractionState": "manual", + "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "شاشة" } }, + "de": { "stringUnit": { "state": "translated", "value": "Bildschirm" } }, + "en": { "stringUnit": { "state": "translated", "value": "screen" } }, + "es": { "stringUnit": { "state": "translated", "value": "pantalla" } }, + "fr": { "stringUnit": { "state": "translated", "value": "écran" } }, + "ja": { "stringUnit": { "state": "translated", "value": "画面" } }, + "ko": { "stringUnit": { "state": "translated", "value": "화면" } }, + "pt": { "stringUnit": { "state": "translated", "value": "tela" } }, + "ru": { "stringUnit": { "state": "translated", "value": "экран" } }, + "zh-Hans": { "stringUnit": { "state": "translated", "value": "屏幕" } }, + "zh-Hant": { "stringUnit": { "state": "translated", "value": "螢幕" } } + } } }, "version": "1.0" diff --git a/Plugins/DisplayBrightness/Sources/DisplayBrightnessPlugin.swift b/Plugins/DisplayBrightness/Sources/DisplayBrightnessPlugin.swift index 2f7576d8..a06b0129 100644 --- a/Plugins/DisplayBrightness/Sources/DisplayBrightnessPlugin.swift +++ b/Plugins/DisplayBrightness/Sources/DisplayBrightnessPlugin.swift @@ -119,7 +119,13 @@ private struct DisplayBrightnessShortcutSession { } @MainActor -final class DisplayBrightnessPlugin: MacToolsPlugin, PluginPrimaryPanel, PluginShortcutEventHandling, DisplayTopologyRefreshing { +final class DisplayBrightnessPlugin: + MacToolsPlugin, + PluginPrimaryPanel, + PluginShortcutEventHandling, + DisplayTopologyRefreshing, + PluginSettingsSearchProviding +{ private enum Constants { static let displayControlPrefix = "display." static let brightnessControlSuffix = ".brightness" @@ -235,6 +241,33 @@ final class DisplayBrightnessPlugin: MacToolsPlugin, PluginPrimaryPanel, PluginS ] } + var settingsSearchEntries: [PluginSettingsSearchEntry] { + [ + PluginSettingsSearchEntry( + id: DisplayBrightnessSettingsSearchEntryID.shortcutTarget, + title: localization.string( + "settings.shortcutTarget.title", + defaultValue: "快捷键目标" + ), + description: localization.string( + "settings.shortcutTarget.searchDescription", + defaultValue: "选择亮度快捷键控制的显示器范围。" + ), + keywords: [ + localization.string( + "settings.shortcutTarget.sectionTitle", + defaultValue: "作用范围" + ), + localization.string( + "settings.shortcutTarget.searchKeyword", + defaultValue: "屏幕" + ) + ], + systemImage: "display.2" + ) + ] + } + func refresh() { controller.refresh() displayDisableCoordinator.refreshSnapshot() diff --git a/Plugins/DisplayBrightness/Sources/DisplayBrightnessSettingsView.swift b/Plugins/DisplayBrightness/Sources/DisplayBrightnessSettingsView.swift index f60edb96..f2b2b29f 100644 --- a/Plugins/DisplayBrightness/Sources/DisplayBrightnessSettingsView.swift +++ b/Plugins/DisplayBrightness/Sources/DisplayBrightnessSettingsView.swift @@ -1,6 +1,10 @@ import SwiftUI import MacToolsPluginKit +enum DisplayBrightnessSettingsSearchEntryID { + static let shortcutTarget = "shortcut-target" +} + struct DisplayBrightnessSettingsView: View { @ObservedObject var preferences: DisplayBrightnessShortcutPreferences let localization: PluginLocalization @@ -44,6 +48,10 @@ struct DisplayBrightnessSettingsView: View { .fixedSize() } .pluginSettingsListRowPadding(interactive: true) + .pluginSettingsSearchAnchor( + pluginID: "display-brightness", + entryID: DisplayBrightnessSettingsSearchEntryID.shortcutTarget + ) } .pluginSettingsCardBackground(.host) } diff --git a/Plugins/DisplaySleep/Sources/DisplaySleepPlugin.swift b/Plugins/DisplaySleep/Sources/DisplaySleepPlugin.swift index e45a4750..112b562c 100644 --- a/Plugins/DisplaySleep/Sources/DisplaySleepPlugin.swift +++ b/Plugins/DisplaySleep/Sources/DisplaySleepPlugin.swift @@ -19,7 +19,7 @@ private struct DisplaySleepPluginProvider: PluginProvider { } @MainActor -final class DisplaySleepPlugin: MacToolsPlugin, PluginPrimaryPanel { +final class DisplaySleepPlugin: MacToolsPlugin, PluginPrimaryPanel, PluginCommandProviding { let metadata: PluginMetadata let primaryPanelDescriptor: PluginPrimaryPanelDescriptor @@ -61,6 +61,25 @@ final class DisplaySleepPlugin: MacToolsPlugin, PluginPrimaryPanel { ) } + var commandDefinitions: [PluginCommandDefinition] { + [ + PluginCommandDefinition( + id: "execute", + title: metadata.title, + description: metadata.defaultDescription, + systemImage: metadata.iconName + ) + ] + } + + func handleCommand(id: String) { + guard id == "execute" else { + return + } + + handleAction(.invokeAction(controlID: "execute")) + } + func handleAction(_ action: PluginPanelAction) { guard case let .invokeAction(controlID) = action, controlID == "execute" else { return diff --git a/Plugins/KeepAwake/Sources/KeepAwakePlugin.swift b/Plugins/KeepAwake/Sources/KeepAwakePlugin.swift index 6a68c367..4eaff48a 100644 --- a/Plugins/KeepAwake/Sources/KeepAwakePlugin.swift +++ b/Plugins/KeepAwake/Sources/KeepAwakePlugin.swift @@ -20,7 +20,12 @@ private struct KeepAwakePluginProvider: PluginProvider { } @MainActor -final class KeepAwakePlugin: MacToolsPlugin, PluginPrimaryPanel, PluginPrimaryPanelCompactIndicatorProviding { +final class KeepAwakePlugin: + MacToolsPlugin, + PluginPrimaryPanel, + PluginPrimaryPanelCompactIndicatorProviding, + PluginSettingsSearchProviding +{ typealias SessionFactory = ( PluginLocalization, @escaping (KeepAwakeSession.EndReason) -> Void @@ -202,6 +207,51 @@ final class KeepAwakePlugin: MacToolsPlugin, PluginPrimaryPanel, PluginPrimaryPa var shortcutDefinitions: [PluginShortcutDefinition] { [] } + var settingsSearchEntries: [PluginSettingsSearchEntry] { + var entries = [ + PluginSettingsSearchEntry( + id: KeepAwakeSettingsSearchEntryID.keepDisplayOn, + title: localization.string( + "settings.display.keepOn", + defaultValue: "保持屏幕常亮" + ), + description: localization.string( + "settings.display.keepOn.description", + defaultValue: "阻止休眠运行时,防止屏幕因空闲而关闭。" + ), + keywords: [ + localization.string("settings.display.section", defaultValue: "屏幕") + ], + systemImage: "display" + ) + ] + + if powerSourceState.isPortableMac { + entries.append( + PluginSettingsSearchEntry( + id: KeepAwakeSettingsSearchEntryID.keepAwakeWithLidClosed, + title: localization.string( + "settings.lidClose.keepAwake", + defaultValue: "合盖保持唤醒" + ), + description: localization.string( + "settings.lidClose.keepAwake.description", + defaultValue: "使用电池时暂停,重新接通电源后恢复。" + ), + keywords: [ + localization.string( + "settings.lidClose.section", + defaultValue: "MacBook" + ) + ], + systemImage: "laptopcomputer" + ) + ) + } + + return entries + } + var configuration: PluginConfiguration? { PluginConfiguration(description: metadata.defaultDescription) { [weak self, localization] _ in KeepAwakeSettingsView( diff --git a/Plugins/KeepAwake/Sources/KeepAwakeSettingsView.swift b/Plugins/KeepAwake/Sources/KeepAwakeSettingsView.swift index abac477b..1707b4d3 100644 --- a/Plugins/KeepAwake/Sources/KeepAwakeSettingsView.swift +++ b/Plugins/KeepAwake/Sources/KeepAwakeSettingsView.swift @@ -1,6 +1,11 @@ import SwiftUI import MacToolsPluginKit +enum KeepAwakeSettingsSearchEntryID { + static let keepDisplayOn = "keep-display-on" + static let keepAwakeWithLidClosed = "keep-awake-with-lid-closed" +} + struct KeepAwakeSettingsView: View { @Binding var keepDisplayOn: Bool @Binding var keepAwakeWithLidClosed: Bool @@ -42,6 +47,10 @@ struct KeepAwakeSettingsView: View { .padding(.horizontal, PluginSettingsTheme.Spacing.rowHorizontal) .padding(.vertical, PluginSettingsTheme.Spacing.interactiveRowVertical) .pluginSettingsCardBackground(.plugin) + .pluginSettingsSearchAnchor( + pluginID: "keep-awake", + entryID: KeepAwakeSettingsSearchEntryID.keepDisplayOn + ) } if powerSourceState.isPortableMac { @@ -76,6 +85,10 @@ struct KeepAwakeSettingsView: View { .padding(.horizontal, PluginSettingsTheme.Spacing.rowHorizontal) .padding(.vertical, PluginSettingsTheme.Spacing.interactiveRowVertical) .pluginSettingsCardBackground(.plugin) + .pluginSettingsSearchAnchor( + pluginID: "keep-awake", + entryID: KeepAwakeSettingsSearchEntryID.keepAwakeWithLidClosed + ) } } } diff --git a/Plugins/LockScreen/Sources/LockScreenPlugin.swift b/Plugins/LockScreen/Sources/LockScreenPlugin.swift index 10bc72c5..a137f52d 100644 --- a/Plugins/LockScreen/Sources/LockScreenPlugin.swift +++ b/Plugins/LockScreen/Sources/LockScreenPlugin.swift @@ -20,7 +20,7 @@ private struct LockScreenPluginProvider: PluginProvider { } @MainActor -final class LockScreenPlugin: MacToolsPlugin, PluginPrimaryPanel { +final class LockScreenPlugin: MacToolsPlugin, PluginPrimaryPanel, PluginCommandProviding { let metadata: PluginMetadata let primaryPanelDescriptor: PluginPrimaryPanelDescriptor @@ -62,6 +62,25 @@ final class LockScreenPlugin: MacToolsPlugin, PluginPrimaryPanel { ) } + var commandDefinitions: [PluginCommandDefinition] { + [ + PluginCommandDefinition( + id: "execute", + title: metadata.title, + description: metadata.defaultDescription, + systemImage: metadata.iconName + ) + ] + } + + func handleCommand(id: String) { + guard id == "execute" else { + return + } + + handleAction(.invokeAction(controlID: "execute")) + } + func handleAction(_ action: PluginPanelAction) { guard case let .invokeAction(controlID) = action, controlID == "execute" else { return diff --git a/README.md b/README.md index c3222a80..cda51507 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ | Fix Damaged Apps | Remove quarantine attributes to resolve "damaged and can't be opened" prompts by selecting a .app in a file panel and running the fix with administrator privileges. | | Quit Apps | Select and quit running apps, or quit all at once; multiple instances of the same app are grouped into one stable entry, and reverse selection helps quickly choose the target set. | | zsh Config | View and edit zsh configuration files such as .zshrc and .zshenv inside the app, with syntax highlighting, common snippets, and automatic backup before saving. | -| Plugins & Settings | Switch between feature and component panels from the centered menu-bar toolbar or with ⌘1/⌘2, dismiss a menu-bar panel with Esc, and open or focus Settings from an active MacTools surface with ⌘,. Jump among General, Plugins, and About in Settings with ⌘1/⌘2/⌘3, and press ⌘F to focus search in the Marketplace, including installed plugins. Plugin settings use an always-visible native resizable sidebar; the Settings window keeps a consistent width across pages and a usable minimum size, and its Back/Forward toolbar controls (⌘[/⌘]) restore the exact Plugins subpage. Install, update, batch-update, and uninstall plugins in the Marketplace (filter by category/search; sort by not-installed first, installed first, or name using the selected app language). Dashboard and Feature Panel independently control which supported plugins appear there and their order. Double-click a button or switch row subtitle to copy it without invoking the primary control. Use a row’s icon to open settings, its eye control to show or hide it on that surface, and its contextual menu to view the Marketplace entry or uninstall without leaving the layout; manage permissions, plugin-specific settings, and global shortcuts—including standalone F1-F12 function keys plus optional shortcuts to open Settings, toggle Dashboard, or toggle Feature Panel—and export/import portable app preferences, plugin layout orders and visibility, and shortcut customizations as JSON. | +| Plugins & Settings | Press ⌘K from a MacTools surface, or use the Plugins sidebar search launcher, to open one global palette for app navigation, General settings, plugin pages, individual plugin settings, and explicitly supported commands; use ↑/↓ and Return or ⌘1–⌘9 for the first nine visible results, while accessible labels and deep links take you directly to the chosen setting. Switch between feature and component panels from the centered menu-bar toolbar or with ⌘1/⌘2, dismiss a menu-bar panel with Esc, and open or focus Settings from an active MacTools surface with ⌘,. Jump among General, Plugins, and About in Settings with ⌘1/⌘2/⌘3, and press ⌘F to focus contextual search in the Marketplace. Plugin settings use an always-visible native resizable sidebar; the Settings window keeps a consistent width across pages and a usable minimum size, and its Back/Forward toolbar controls (⌘[/⌘]) restore the exact Plugins subpage. Install, update, batch-update, and uninstall plugins in the Marketplace (filter by category/search; sort by not-installed first, installed first, or name using the selected app language). Dashboard and Feature Panel independently control which supported plugins appear there and their order. Double-click a button or switch row subtitle to copy it without invoking the primary control. Use a row’s icon to open settings, its eye control to show or hide it on that surface, and its contextual menu to view the Marketplace entry or uninstall without leaving the layout; manage permissions, plugin-specific settings, and global shortcuts—including standalone F1-F12 function keys plus optional shortcuts to open Settings, toggle Dashboard, or toggle Feature Panel—and export/import portable app preferences, plugin layout orders and visibility, and shortcut customizations as JSON. | | Menu Bar Icon Customization | Use local images or lightweight GIF/MP4 animations as the menu bar icon, choose static or animated icons from the online gallery with clear animation badges, preserve original colors and transparency on local import, automatically adapt monochrome gallery icons to the menu bar appearance, restore the default icon, and preview every source with the same standard icon height and content inset as the default. | | Localization | Follow the system language by default, or choose a fixed app language in Settings > General > Appearance; the picker shows each language in the system language and its native spelling, while menu-bar action buttons adapt to localized label lengths. | diff --git a/README.zh-CN.md b/README.zh-CN.md index 9558029f..9326af5c 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -59,7 +59,7 @@ | 修复损坏应用 | 移除应用隔离属性,解决「已损坏,无法打开」提示,通过文件面板选择 .app 并以管理员权限执行修复。 | | 退出应用 | 选择并退出正在运行的应用,或一键退出全部;同一应用的多个实例会合并为一个稳定条目,并支持反选,方便快速圈定目标。 | | zsh 配置 | 在应用内直接查看和编辑 zsh 配置文件(.zshrc、.zshenv 等),支持语法高亮、常用片段快速插入和保存前自动备份。 | -| 插件与设置 | 通过菜单栏面板顶部居中的切换器选择功能或组件面板;在插件市场中安装、更新和批量更新插件(支持分类/搜索筛选;可按未安装优先、已安装优先或按所选语言的名称排序),并在各插件设置页维护权限、快捷键(支持单独使用 F1-F12 功能键)和专属设置;还可设置全局快捷键打开设置窗口。 | +| 插件与设置 | 在任一 MacTools 界面按 ⌘K,或点击插件侧边栏的搜索入口,即可打开统一搜索面板,查找应用页面、通用设置、插件、具体插件设置项和明确支持的命令;可用 ↑/↓ 与 Return,或按 ⌘1–⌘9 快速打开前九项可见结果,辅助功能标签和深层链接会直接定位并聚焦目标设置。⌘F 继续用于插件市场等当前页面的局部搜索。通过菜单栏面板顶部居中的切换器选择功能或组件面板;在插件市场中安装、更新和批量更新插件(支持分类/搜索筛选;可按未安装优先、已安装优先或按所选语言的名称排序),并在各插件设置页维护权限、快捷键(支持单独使用 F1-F12 功能键)和专属设置;还可设置全局快捷键打开设置窗口。 | | 状态栏图标自定义 | 上传本地图片或轻量 GIF/MP4 动画作为菜单栏图标,也可从在线图库按需下载动态图标,并支持自动扣背景和恢复默认。 | | 多语言 | 默认跟随系统语言,也可在「设置 > 通用 > 外观」中固定应用语言;语言选择器会同时显示系统语言名称和语言本名,菜单栏操作按钮会适配不同语言的文案长度。 | diff --git a/Sources/App/AppL10n.swift b/Sources/App/AppL10n.swift index 47e3ba1a..5181896d 100644 --- a/Sources/App/AppL10n.swift +++ b/Sources/App/AppL10n.swift @@ -24,6 +24,10 @@ enum AppL10n { string(key, defaultValue: defaultValue, table: "Plugins") } + static func search(_ key: String, defaultValue: String) -> String { + string(key, defaultValue: defaultValue, table: "Search") + } + static func preferencesBackup(_ key: String, defaultValue: String) -> String { string(key, defaultValue: defaultValue, table: "PreferencesBackup") } @@ -44,6 +48,14 @@ enum AppL10n { ) } + static func searchFormat(_ key: String, defaultValue: String, _ arguments: CVarArg...) -> String { + String( + format: search(key, defaultValue: defaultValue), + locale: PluginRuntimeLocalization.locale, + arguments: arguments + ) + } + static func preferencesBackupFormat(_ key: String, defaultValue: String, _ arguments: CVarArg...) -> String { String( format: preferencesBackup(key, defaultValue: defaultValue), diff --git a/Sources/App/AppWindowRouter.swift b/Sources/App/AppWindowRouter.swift index e6731b12..bea4da4c 100644 --- a/Sources/App/AppWindowRouter.swift +++ b/Sources/App/AppWindowRouter.swift @@ -6,6 +6,7 @@ import MacToolsPluginKit enum MacToolsLocalKeyboardCommand: Equatable { case showSettings case focusSearch + case showUnifiedSearch static func resolve(for event: NSEvent) -> MacToolsLocalKeyboardCommand? { guard event.type == .keyDown else { @@ -22,6 +23,8 @@ enum MacToolsLocalKeyboardCommand: Equatable { return .showSettings case "f": return .focusSearch + case "k": + return .showUnifiedSearch default: return nil } @@ -116,6 +119,11 @@ final class AppWindowRouter: NSObject, NSWindowDelegate { presentSettings(.settings) } + func showUnifiedSearch() { + presentSettings(.settings) + settingsNavigationCoordinator?.presentUnifiedSearch(origin: .keyboard) + } + func setPanelPresentationActions( showDashboard: @escaping () -> Void, showFeaturePanel: @escaping () -> Void @@ -214,6 +222,8 @@ final class AppWindowRouter: NSObject, NSWindowDelegate { showSettings() case .focusSearch: settingsNavigationCoordinator?.requestSearchFocus() + case .showUnifiedSearch: + showUnifiedSearch() } } diff --git a/Sources/App/MacToolsSearch.swift b/Sources/App/MacToolsSearch.swift new file mode 100644 index 00000000..c98cd36d --- /dev/null +++ b/Sources/App/MacToolsSearch.swift @@ -0,0 +1,713 @@ +import Foundation +import MacToolsPluginKit + +enum MacToolsSearchResultKind: CaseIterable, Hashable { + case navigation + case setting + case command + + var title: String { + switch self { + case .navigation: + return AppL10n.search("search.group.navigation", defaultValue: "导航") + case .setting: + return AppL10n.search("search.group.settings", defaultValue: "设置") + case .command: + return AppL10n.search("search.group.commands", defaultValue: "命令") + } + } + + var actionTitle: String { + switch self { + case .navigation: + return AppL10n.search("search.action.open", defaultValue: "打开") + case .setting: + return AppL10n.search("search.action.goTo", defaultValue: "前往") + case .command: + return AppL10n.search("search.action.run", defaultValue: "执行") + } + } +} + +enum MacToolsSearchAction: Hashable { + case navigate( + destination: SettingsNavigationDestination, + target: SettingsSearchRevealTarget? + ) + case pluginCommand(pluginID: String, commandID: String) + case appCommand(AppShortcutAction) +} + +struct MacToolsSearchResult: Identifiable, Hashable { + let id: String + let kind: MacToolsSearchResultKind + let title: String + let subtitle: String + let detail: String + let keywords: [String] + let systemImage: String + let action: MacToolsSearchAction + let confirmation: PluginCommandDefinition.Confirmation? + let suggestionPriority: Int? + + var accessibilityLabel: String { + [title, subtitle, kind.title].filter { !$0.isEmpty }.joined(separator: ", ") + } + + fileprivate var normalizedTitle: String { + Self.normalize(title) + } + + fileprivate var normalizedSubtitle: String { + Self.normalize(subtitle) + } + + fileprivate var normalizedDetail: String { + Self.normalize(detail) + } + + fileprivate var normalizedKeywords: String { + Self.normalize(keywords.joined(separator: " ")) + } + + fileprivate static func normalize(_ value: String) -> String { + value + .folding(options: [.caseInsensitive, .diacriticInsensitive, .widthInsensitive], locale: .current) + .trimmingCharacters(in: .whitespacesAndNewlines) + } +} + +struct MacToolsSearchIndex { + let items: [MacToolsSearchResult] + + func results(matching query: String) -> [MacToolsSearchResult] { + let normalizedQuery = MacToolsSearchResult.normalize(query) + guard !normalizedQuery.isEmpty else { + return items + .filter { $0.suggestionPriority != nil } + .sorted(by: suggestionOrder) + } + + let tokens = normalizedQuery + .split(whereSeparator: \.isWhitespace) + .map(String.init) + + return items + .compactMap { item -> (MacToolsSearchResult, Int)? in + let haystack = [ + item.normalizedTitle, + item.normalizedSubtitle, + item.normalizedDetail, + item.normalizedKeywords + ].joined(separator: " ") + guard tokens.allSatisfy(haystack.contains) else { + return nil + } + + return (item, score(item, query: normalizedQuery, tokens: tokens)) + } + .sorted { lhs, rhs in + if lhs.1 != rhs.1 { + return lhs.1 > rhs.1 + } + + if lhs.0.kind != rhs.0.kind { + return kindOrder(lhs.0.kind) < kindOrder(rhs.0.kind) + } + + return lhs.0.title.localizedStandardCompare(rhs.0.title) == .orderedAscending + } + .map(\.0) + } + + private func score( + _ item: MacToolsSearchResult, + query: String, + tokens: [String] + ) -> Int { + var score = 0 + + if item.normalizedTitle == query { + score += 1_000 + } else if item.normalizedTitle.hasPrefix(query) { + score += 700 + } else if item.normalizedTitle.contains(query) { + score += 500 + } + + for token in tokens { + if item.normalizedTitle.contains(token) { + score += 180 + } + if item.normalizedSubtitle.contains(token) { + score += 90 + } + if item.normalizedDetail.contains(token) { + score += 50 + } + if item.normalizedKeywords.contains(token) { + score += 30 + } + } + + if item.kind == .navigation { + score += 10 + } + + return score + } + + private func suggestionOrder( + _ lhs: MacToolsSearchResult, + _ rhs: MacToolsSearchResult + ) -> Bool { + let lhsPriority = lhs.suggestionPriority ?? .max + let rhsPriority = rhs.suggestionPriority ?? .max + if lhsPriority != rhsPriority { + return lhsPriority < rhsPriority + } + + return lhs.title.localizedStandardCompare(rhs.title) == .orderedAscending + } + + private func kindOrder(_ kind: MacToolsSearchResultKind) -> Int { + switch kind { + case .navigation: 0 + case .setting: 1 + case .command: 2 + } + } +} + +enum MacToolsSearchPresentation { + static let quickSelectionLimit = 9 + + static func orderedResults( + _ results: [MacToolsSearchResult] + ) -> [MacToolsSearchResult] { + MacToolsSearchResultKind.allCases.flatMap { kind in + results.filter { $0.kind == kind } + } + } + + static func quickSelectionNumber( + for resultID: String, + in results: [MacToolsSearchResult] + ) -> Int? { + guard + let index = results.prefix(quickSelectionLimit) + .firstIndex(where: { $0.id == resultID }) + else { + return nil + } + + return results.distance(from: results.startIndex, to: index) + 1 + } +} + +@MainActor +enum MacToolsSearchIndexBuilder { + static func build(pluginHost: PluginHost) -> MacToolsSearchIndex { + var items: [MacToolsSearchResult] = [ + navigationResult( + id: "navigation.general", + title: AppL10n.settings("tab.general", defaultValue: "通用"), + subtitle: AppL10n.search("search.subtitle.appSettings", defaultValue: "应用设置"), + detail: AppL10n.search( + "search.detail.general", + defaultValue: "外观、语言、菜单栏图标、登录启动和偏好备份。" + ), + systemImage: "gearshape", + destination: .general, + suggestionPriority: 3 + ), + navigationResult( + id: "navigation.dashboard", + title: AppL10n.settings("plugins.sidebar.dashboard", defaultValue: "仪表盘"), + subtitle: AppL10n.search("search.subtitle.plugins", defaultValue: "插件"), + detail: AppL10n.settings( + "plugins.dashboard.description", + defaultValue: "拖拽调整仪表盘组件的排列顺序。" + ), + systemImage: "square.grid.2x2", + destination: .plugins(.dashboardLayout), + suggestionPriority: 0 + ), + navigationResult( + id: "navigation.feature-panel", + title: AppL10n.settings("plugins.sidebar.featurePanel", defaultValue: "功能面板"), + subtitle: AppL10n.search("search.subtitle.plugins", defaultValue: "插件"), + detail: AppL10n.settings( + "plugins.featurePanel.description", + defaultValue: "拖拽调整功能面板操作的排列顺序。" + ), + systemImage: "switch.2", + destination: .plugins(.featurePanelLayout), + suggestionPriority: 1 + ), + navigationResult( + id: "navigation.marketplace", + title: AppL10n.settings("plugins.sidebar.marketplace", defaultValue: "市场"), + subtitle: AppL10n.search("search.subtitle.plugins", defaultValue: "插件"), + detail: AppL10n.plugins( + "plugin.marketplace.description", + defaultValue: "安装、更新和管理 MacTools 插件。" + ), + systemImage: "shippingbox", + destination: .plugins(.marketplace), + suggestionPriority: 2 + ), + navigationResult( + id: "navigation.about", + title: AppL10n.settings("tab.about", defaultValue: "关于"), + subtitle: AppL10n.search("search.subtitle.appSettings", defaultValue: "应用设置"), + detail: AppL10n.search( + "search.detail.about", + defaultValue: "版本、更新和项目链接。" + ), + systemImage: "info.circle", + destination: .about, + suggestionPriority: 4 + ) + ] + + items += generalSettingsResults(pluginHost: pluginHost) + + let managementItemsByID = Dictionary( + uniqueKeysWithValues: pluginHost.pluginManagementItems.map { ($0.id, $0) } + ) + let configurationItemsByID = Dictionary( + uniqueKeysWithValues: pluginHost.pluginConfigurationItems.map { ($0.pluginID, $0) } + ) + + items += pluginHost.pluginConfigurationItems.map { item in + let managementItem = managementItemsByID[item.pluginID] + return MacToolsSearchResult( + id: "plugin.\(item.pluginID)", + kind: .navigation, + title: item.title, + subtitle: AppL10n.settings( + "plugins.sidebar.configurationSection", + defaultValue: "插件设置" + ), + detail: item.description, + keywords: [managementItem?.category, managementItem?.releaseChannel] + .compactMap { $0 }, + systemImage: item.iconName, + action: .navigate( + destination: .plugins(.configuration(item.pluginID)), + target: nil + ), + confirmation: nil, + suggestionPriority: nil + ) + } + + let surfaceItems = mergedSurfaceItems(pluginHost: pluginHost) + items += surfaceItems.compactMap { item -> MacToolsSearchResult? in + guard configurationItemsByID[item.id] == nil else { + return nil + } + + let destination: SettingsNavigationDestination + let subtitle: String + if item.capabilities.supportsFeaturePanel { + destination = .plugins(.featurePanelLayout) + subtitle = AppL10n.settings( + "plugins.sidebar.featurePanel", + defaultValue: "功能面板" + ) + } else if item.capabilities.supportsDashboard { + destination = .plugins(.dashboardLayout) + subtitle = AppL10n.settings( + "plugins.sidebar.dashboard", + defaultValue: "仪表盘" + ) + } else { + destination = .plugins(.marketplace) + subtitle = AppL10n.settings( + "plugins.sidebar.marketplace", + defaultValue: "市场" + ) + } + + return MacToolsSearchResult( + id: "plugin.\(item.id)", + kind: .navigation, + title: item.title, + subtitle: subtitle, + detail: item.description, + keywords: [item.category, item.releaseChannel].compactMap { $0 }, + systemImage: item.iconName, + action: .navigate(destination: destination, target: nil), + confirmation: nil, + suggestionPriority: nil + ) + } + + items += pluginHost.pluginConfigurationItems.flatMap { item in + settingResults(for: item) + } + + items += pluginHost.pluginSettingsSearchItems.compactMap { providedItem in + guard let configuration = configurationItemsByID[providedItem.pluginID] else { + return nil + } + + let entry = providedItem.entry + return MacToolsSearchResult( + id: providedItem.id, + kind: .setting, + title: entry.title, + subtitle: "\(configuration.title) › \(AppL10n.search("search.subtitle.customSetting", defaultValue: "设置"))", + detail: entry.description, + keywords: entry.keywords, + systemImage: entry.systemImage, + action: .navigate( + destination: .plugins(.configuration(providedItem.pluginID)), + target: .plugin( + PluginSettingsSearchTarget( + pluginID: providedItem.pluginID, + entryID: entry.id + ) + ) + ), + confirmation: nil, + suggestionPriority: nil + ) + } + + items += pluginHost.pluginCommandItems.map { item in + MacToolsSearchResult( + id: item.id, + kind: .command, + title: item.definition.title, + subtitle: item.pluginTitle, + detail: item.definition.description, + keywords: item.definition.keywords, + systemImage: item.definition.systemImage, + action: .pluginCommand( + pluginID: item.pluginID, + commandID: item.definition.id + ), + confirmation: item.definition.confirmation, + suggestionPriority: nil + ) + } + + items += AppShortcutAction.allCases.compactMap { action -> MacToolsSearchResult? in + guard action != .openSettings else { + return nil + } + + return MacToolsSearchResult( + id: "app-command.\(action.rawValue)", + kind: .command, + title: action.title, + subtitle: AppL10n.search("search.subtitle.macTools", defaultValue: "MacTools"), + detail: action.description, + keywords: [], + systemImage: action.systemImage, + action: .appCommand(action), + confirmation: nil, + suggestionPriority: nil + ) + } + + return MacToolsSearchIndex(items: deduplicated(items)) + } + + private static func navigationResult( + id: String, + title: String, + subtitle: String, + detail: String, + systemImage: String, + destination: SettingsNavigationDestination, + suggestionPriority: Int + ) -> MacToolsSearchResult { + MacToolsSearchResult( + id: id, + kind: .navigation, + title: title, + subtitle: subtitle, + detail: detail, + keywords: [], + systemImage: systemImage, + action: .navigate(destination: destination, target: nil), + confirmation: nil, + suggestionPriority: suggestionPriority + ) + } + + private static func generalSettingsResults( + pluginHost: PluginHost + ) -> [MacToolsSearchResult] { + let shortcutKeywords = pluginHost.appShortcutItems.flatMap { item in + [item.title, item.description, item.bindingText] + } + + return [ + generalSettingResult( + target: .launchAtLogin, + title: AppL10n.settings("launchAtLogin.title", defaultValue: "开机时启动"), + detail: AppL10n.settings( + "launchAtLogin.description", + defaultValue: "登录系统时自动启动 MacTools 并显示在菜单栏。" + ), + keywords: [ + AppL10n.settings("general.section.startup", defaultValue: "启动") + ], + systemImage: "power" + ), + generalSettingResult( + target: .appearance, + title: AppL10n.settings("appearance.title", defaultValue: "应用外观"), + detail: AppL10n.settings( + "appearance.description", + defaultValue: "自动跟随系统,也可以固定为深色或浅色。" + ), + keywords: AppAppearancePreference.allCases.map(\.title), + systemImage: "circle.lefthalf.filled" + ), + generalSettingResult( + target: .language, + title: AppL10n.settings("language.title", defaultValue: "语言"), + detail: AppL10n.settings( + "language.description", + defaultValue: "默认跟随系统语言,也可以固定为指定语言。" + ), + keywords: AppLanguagePreference.allCases.map(\.pickerTitle), + systemImage: "globe" + ), + generalSettingResult( + target: .menuBarIcon, + title: AppL10n.settings("menuBarIcon.title", defaultValue: "菜单栏图标"), + detail: AppL10n.settings( + "menuBarIcon.description", + defaultValue: "统一设置浅色和深色菜单栏图标,导入时会保留原图。" + ), + keywords: [ + AppL10n.settings("menuBarIcon.restoreDefault", defaultValue: "恢复默认") + ], + systemImage: "menubar.rectangle" + ), + generalSettingResult( + target: .menuBarClickBehavior, + title: AppL10n.settings("menuBarClick.title", defaultValue: "交换左键与右键功能"), + detail: AppL10n.settings( + "menuBarClick.description", + defaultValue: "关闭时左键打开仪表盘、右键功能打开功能面板;开启后互换。" + ), + keywords: [ + AppL10n.settings("general.section.menuBarIcon", defaultValue: "状态栏图标"), + AppL10n.settings( + "menuBarClick.rightClickShortcutNotice", + defaultValue: "可以使用 Option + 左键触发右键功能。" + ) + ], + systemImage: "cursorarrow.click.2" + ), + generalSettingResult( + target: .appShortcuts, + title: AppL10n.settings("shortcuts.title", defaultValue: "键盘快捷键"), + detail: AppL10n.settings( + "shortcuts.description", + defaultValue: "为常用动作配置全局快捷键。编辑后立即生效,必要项不可删除。" + ), + keywords: shortcutKeywords, + systemImage: "command" + ), + generalSettingResult( + target: .preferencesBackup, + title: AppL10n.preferencesBackup( + "preferencesBackup.title", + defaultValue: "导出与导入偏好设置" + ), + detail: AppL10n.preferencesBackup( + "preferencesBackup.description", + defaultValue: "包含应用偏好、插件显示顺序、快捷键和支持导出的插件设置;不会包含权限、缓存、凭证或其他私有数据。" + ), + keywords: [ + AppL10n.preferencesBackup( + "preferencesBackup.export", + defaultValue: "导出偏好设置…" + ), + AppL10n.preferencesBackup( + "preferencesBackup.import", + defaultValue: "导入偏好设置…" + ) + ], + systemImage: "externaldrive.badge.checkmark" + ) + ] + } + + private static func generalSettingResult( + target: GeneralSettingsSearchTarget, + title: String, + detail: String, + keywords: [String], + systemImage: String + ) -> MacToolsSearchResult { + MacToolsSearchResult( + id: "general-setting.\(target.rawValue)", + kind: .setting, + title: title, + subtitle: AppL10n.settings("tab.general", defaultValue: "通用"), + detail: detail, + keywords: keywords, + systemImage: systemImage, + action: .navigate(destination: .general, target: .general(target)), + confirmation: nil, + suggestionPriority: nil + ) + } + + private static func settingResults( + for item: PluginConfigurationItem + ) -> [MacToolsSearchResult] { + let settings = item.settingsCards.map { card in + settingResult( + id: "setting-card.\(card.id)", + item: item, + title: card.title, + detail: card.description, + keywords: [card.statusText, card.footnote].compactMap { $0 }, + systemImage: card.statusSystemImage, + entryID: card.id + ) + } + + let permissions = item.permissionCards.map { card in + settingResult( + id: "permission.\(card.id)", + item: item, + title: card.title, + detail: card.description, + keywords: [ + AppL10n.settings( + "plugins.configuration.section.permissions", + defaultValue: "权限" + ), + card.statusText, + card.footnote + ].compactMap { $0 }, + systemImage: card.iconSystemImage, + entryID: card.id + ) + } + + let shortcuts = shortcutSettingResults(for: item) + + return settings + permissions + shortcuts + } + + private static func shortcutSettingResults( + for item: PluginConfigurationItem + ) -> [MacToolsSearchResult] { + guard item.shortcutItems.allSatisfy({ $0.settingsGroupID != nil }) else { + return item.shortcutItems.map { shortcut in + settingResult( + id: "shortcut.\(shortcut.id)", + item: item, + title: shortcut.settingsControlTitle ?? shortcut.title, + detail: shortcut.description, + keywords: [ + AppL10n.settings( + "plugins.configuration.section.shortcuts", + defaultValue: "快捷键" + ), + shortcut.bindingText + ], + systemImage: shortcut.settingsControlSystemImage ?? "command", + entryID: shortcut.id + ) + } + } + + var groupOrder: [String] = [] + var groups: [String: [ShortcutSettingsItem]] = [:] + for shortcut in item.shortcutItems { + guard let groupID = shortcut.settingsGroupID else { + continue + } + + if groups[groupID] == nil { + groupOrder.append(groupID) + } + groups[groupID, default: []].append(shortcut) + } + + return groupOrder.compactMap { groupID in + guard let shortcuts = groups[groupID], let first = shortcuts.first else { + return nil + } + + return settingResult( + id: "shortcut-group.\(item.pluginID).\(groupID)", + item: item, + title: first.settingsGroupTitle ?? first.title, + detail: first.settingsGroupDescription ?? first.description, + keywords: [ + AppL10n.settings( + "plugins.configuration.section.shortcuts", + defaultValue: "快捷键" + ) + ] + shortcuts.flatMap { + [$0.settingsControlTitle, $0.title, $0.bindingText].compactMap { $0 } + }, + systemImage: first.settingsControlSystemImage ?? "command", + entryID: groupID + ) + } + } + + private static func settingResult( + id: String, + item: PluginConfigurationItem, + title: String, + detail: String, + keywords: [String], + systemImage: String, + entryID: String + ) -> MacToolsSearchResult { + MacToolsSearchResult( + id: id, + kind: .setting, + title: title, + subtitle: item.title, + detail: detail, + keywords: keywords, + systemImage: systemImage, + action: .navigate( + destination: .plugins(.configuration(item.pluginID)), + target: .plugin( + PluginSettingsSearchTarget( + pluginID: item.pluginID, + entryID: entryID + ) + ) + ), + confirmation: nil, + suggestionPriority: nil + ) + } + + private static func mergedSurfaceItems(pluginHost: PluginHost) -> [PluginSurfaceLayoutItem] { + var seenIDs: Set = [] + return ( + pluginHost.featurePanelLayoutItems + + pluginHost.featurePanelHiddenLayoutItems + + pluginHost.dashboardLayoutItems + + pluginHost.dashboardHiddenLayoutItems + ).filter { seenIDs.insert($0.id).inserted } + } + + private static func deduplicated( + _ items: [MacToolsSearchResult] + ) -> [MacToolsSearchResult] { + var seenIDs: Set = [] + return items.filter { seenIDs.insert($0.id).inserted } + } +} diff --git a/Sources/App/MenuBarPanelPresenter.swift b/Sources/App/MenuBarPanelPresenter.swift index d7293102..f0701ecd 100644 --- a/Sources/App/MenuBarPanelPresenter.swift +++ b/Sources/App/MenuBarPanelPresenter.swift @@ -59,6 +59,7 @@ enum MenuBarPanelWindowRegistry { enum MenuBarPanelKeyboardAction: Equatable { case dismissPanel case showSettings + case showUnifiedSearch case selectTab(MenuBarPanelTab) @MainActor @@ -74,6 +75,10 @@ enum MenuBarPanelKeyboardAction: Equatable { return .showSettings } + if MacToolsLocalKeyboardCommand.resolve(for: event) == .showUnifiedSearch { + return .showUnifiedSearch + } + guard let tab = MenuBarPanelPresenter.keyboardShortcutTab(for: event) else { return nil } @@ -127,6 +132,7 @@ final class MenuBarPanelPresenter: NSObject { private let onDismiss: () -> Void private let onOpenUpdate: () -> Void private let onOpenSettings: () -> Void + private let onOpenUnifiedSearch: () -> Void private let onPresentDiskCleanConfiguration: () -> Void private let onPresentLaunchControlConfiguration: () -> Void private let onAllPanelsClosed: () -> Void @@ -146,6 +152,7 @@ final class MenuBarPanelPresenter: NSObject { onDismiss: @escaping () -> Void, onOpenUpdate: @escaping () -> Void, onOpenSettings: @escaping () -> Void, + onOpenUnifiedSearch: @escaping () -> Void, onPresentDiskCleanConfiguration: @escaping () -> Void, onPresentLaunchControlConfiguration: @escaping () -> Void, onAllPanelsClosed: @escaping () -> Void @@ -155,6 +162,7 @@ final class MenuBarPanelPresenter: NSObject { self.onDismiss = onDismiss self.onOpenUpdate = onOpenUpdate self.onOpenSettings = onOpenSettings + self.onOpenUnifiedSearch = onOpenUnifiedSearch self.onPresentDiskCleanConfiguration = onPresentDiskCleanConfiguration self.onPresentLaunchControlConfiguration = onPresentLaunchControlConfiguration self.onAllPanelsClosed = onAllPanelsClosed @@ -401,6 +409,8 @@ final class MenuBarPanelPresenter: NSObject { onDismiss() case .showSettings: onOpenSettings() + case .showUnifiedSearch: + onOpenUnifiedSearch() case let .selectTab(tab): select(tab) } diff --git a/Sources/App/MenuBarStatusItemController.swift b/Sources/App/MenuBarStatusItemController.swift index c01b84bd..57fc0900 100644 --- a/Sources/App/MenuBarStatusItemController.swift +++ b/Sources/App/MenuBarStatusItemController.swift @@ -104,6 +104,9 @@ final class MenuBarStatusItemController: NSObject { onOpenSettings: { [weak self] in self?.windowRouter.showSettings() }, + onOpenUnifiedSearch: { [weak self] in + self?.windowRouter.showUnifiedSearch() + }, onPresentDiskCleanConfiguration: { [weak self] in self?.pluginHost.presentPluginConfiguration(pluginID: "disk-clean") }, diff --git a/Sources/App/SettingsNavigationCoordinator.swift b/Sources/App/SettingsNavigationCoordinator.swift index aefd16e1..d2669a5c 100644 --- a/Sources/App/SettingsNavigationCoordinator.swift +++ b/Sources/App/SettingsNavigationCoordinator.swift @@ -41,6 +41,11 @@ enum SettingsSearchField: Equatable { case pluginMarketplace } +enum UnifiedSearchPresentationOrigin: Equatable { + case pluginSidebar + case keyboard +} + struct SettingsSearchFocusRequest: Equatable { let id: UInt let field: SettingsSearchField @@ -51,6 +56,30 @@ struct AboutUpdateActionRequest: Equatable { let version: String } +enum GeneralSettingsSearchTarget: String, Hashable { + case launchAtLogin + case appearance + case language + case menuBarIcon + case menuBarClickBehavior + case appShortcuts + case preferencesBackup + + var scrollID: String { + "general-search-anchor.\(rawValue)" + } +} + +enum SettingsSearchRevealTarget: Hashable { + case general(GeneralSettingsSearchTarget) + case plugin(PluginSettingsSearchTarget) +} + +struct SettingsSearchRevealRequest: Equatable { + let id: UInt + let target: SettingsSearchRevealTarget +} + @MainActor final class SettingsNavigationCoordinator: ObservableObject { private static let maximumHistoryCount = 128 @@ -58,6 +87,10 @@ final class SettingsNavigationCoordinator: ObservableObject { @Published private(set) var destination: SettingsNavigationDestination @Published private(set) var searchFocusRequest: SettingsSearchFocusRequest? @Published private(set) var aboutUpdateActionRequest: AboutUpdateActionRequest? + @Published private(set) var isUnifiedSearchPresented = false + @Published private(set) var unifiedSearchPresentationOrigin: UnifiedSearchPresentationOrigin? + @Published private(set) var unifiedSearchFocusRequestID: UInt = 0 + @Published private(set) var searchRevealRequest: SettingsSearchRevealRequest? private(set) var history: [SettingsNavigationDestination] private(set) var historyIndex: Int @@ -68,6 +101,7 @@ final class SettingsNavigationCoordinator: ObservableObject { private let selectPluginSettingsPane: (FeatureSettingsPane) -> Bool private var nextSearchFocusRequestID: UInt = 0 private var nextAboutUpdateActionRequestID: UInt = 0 + private var nextSearchRevealRequestID: UInt = 0 convenience init(pluginHost: PluginHost) { self.init( @@ -140,6 +174,44 @@ final class SettingsNavigationCoordinator: ObservableObject { ) } + func presentUnifiedSearch(origin: UnifiedSearchPresentationOrigin) { + unifiedSearchPresentationOrigin = origin + isUnifiedSearchPresented = true + unifiedSearchFocusRequestID &+= 1 + } + + func dismissUnifiedSearch() { + isUnifiedSearchPresented = false + unifiedSearchPresentationOrigin = nil + } + + func navigateFromSearch( + to destination: SettingsNavigationDestination, + target: SettingsSearchRevealTarget? + ) { + dismissUnifiedSearch() + navigate(to: destination) + + guard let target else { + searchRevealRequest = nil + return + } + + nextSearchRevealRequestID &+= 1 + searchRevealRequest = SettingsSearchRevealRequest( + id: nextSearchRevealRequestID, + target: target + ) + } + + func clearSearchRevealRequest(_ request: SettingsSearchRevealRequest) { + guard searchRevealRequest == request else { + return + } + + searchRevealRequest = nil + } + @discardableResult func consumeAboutUpdateActionRequest(_ request: AboutUpdateActionRequest) -> Bool { guard aboutUpdateActionRequest == request else { @@ -169,6 +241,7 @@ final class SettingsNavigationCoordinator: ObservableObject { @discardableResult func requestSearchFocus() -> Bool { guard + !isUnifiedSearchPresented, let field = destination.searchField, focusedSearchField != field else { diff --git a/Sources/App/SettingsView.swift b/Sources/App/SettingsView.swift index c47b60b3..8a544a32 100644 --- a/Sources/App/SettingsView.swift +++ b/Sources/App/SettingsView.swift @@ -28,38 +28,52 @@ struct SettingsView: View { // Recreate native AppKit-backed controls when the shared locale changes. let _ = runtimeLocale.revision - return TabView(selection: settingsDestinationBinding) { - GeneralSettingsView( - pluginHost: pluginHost, - menuBarIconSettings: menuBarIconSettings, - menuBarIconGallery: menuBarIconGallery, - launchAtLoginController: launchAtLoginController - ) - .tag(SettingsDestination.general) - .tabItem { - Label(AppL10n.settings("tab.general", defaultValue: "通用"), systemImage: "gearshape") - } + return ZStack { + TabView(selection: settingsDestinationBinding) { + GeneralSettingsView( + pluginHost: pluginHost, + navigationCoordinator: navigationCoordinator, + menuBarIconSettings: menuBarIconSettings, + menuBarIconGallery: menuBarIconGallery, + launchAtLoginController: launchAtLoginController + ) + .tag(SettingsDestination.general) + .tabItem { + Label(AppL10n.settings("tab.general", defaultValue: "通用"), systemImage: "gearshape") + } - FeatureSettingsView( - pluginHost: pluginHost, - navigationCoordinator: navigationCoordinator, - uninstallConfirmationSession: uninstallConfirmationSession, - showDashboard: showDashboard, - showFeaturePanel: showFeaturePanel - ) - .tag(SettingsDestination.pluginConfiguration) - .tabItem { - Label(AppL10n.settings("tab.plugins", defaultValue: "插件"), systemImage: "slider.horizontal.3") - } + FeatureSettingsView( + pluginHost: pluginHost, + navigationCoordinator: navigationCoordinator, + uninstallConfirmationSession: uninstallConfirmationSession, + showDashboard: showDashboard, + showFeaturePanel: showFeaturePanel + ) + .tag(SettingsDestination.pluginConfiguration) + .tabItem { + Label(AppL10n.settings("tab.plugins", defaultValue: "插件"), systemImage: "slider.horizontal.3") + } - AboutSettingsView( - appUpdater: appUpdater, - navigationCoordinator: navigationCoordinator - ) - .tag(SettingsDestination.about) - .tabItem { - Label(AppL10n.settings("tab.about", defaultValue: "关于"), systemImage: "info.circle") - } + AboutSettingsView( + appUpdater: appUpdater, + navigationCoordinator: navigationCoordinator + ) + .tag(SettingsDestination.about) + .tabItem { + Label(AppL10n.settings("tab.about", defaultValue: "关于"), systemImage: "info.circle") + } + } + .allowsHitTesting(!navigationCoordinator.isUnifiedSearchPresented) + .accessibilityHidden(navigationCoordinator.isUnifiedSearchPresented) + + if navigationCoordinator.isUnifiedSearchPresented { + UnifiedSearchPresentationView( + pluginHost: pluginHost, + navigationCoordinator: navigationCoordinator + ) + .transition(.opacity.combined(with: .scale(scale: 0.98))) + .zIndex(1) + } } .background { SettingsDestinationShortcutButtons(coordinator: navigationCoordinator) @@ -73,6 +87,7 @@ struct SettingsView: View { .frame(minWidth: 720, maxWidth: .infinity, minHeight: 480, maxHeight: .infinity) .environment(\.locale, PluginRuntimeLocalization.locale) .environment(\.layoutDirection, layoutDirection) + .animation(.easeOut(duration: 0.14), value: navigationCoordinator.isUnifiedSearchPresented) } private var layoutDirection: LayoutDirection { @@ -107,6 +122,7 @@ struct SettingsDestinationShortcutButtons: View { } .frame(width: 0, height: 0) .opacity(0) + .disabled(coordinator.isUnifiedSearchPresented) .accessibilityHidden(true) } @@ -214,51 +230,98 @@ private struct PermissionSettingsRow: View { struct GeneralSettingsView: View { @ObservedObject var pluginHost: PluginHost + @ObservedObject var navigationCoordinator: SettingsNavigationCoordinator @ObservedObject var menuBarIconSettings: MenuBarIconSettings @ObservedObject var menuBarIconGallery: MenuBarIconGalleryLibrary @ObservedObject var launchAtLoginController: LaunchAtLoginController @AppStorage(AppAppearancePreference.userDefaultsKey) private var appearancePreferenceRawValue = AppAppearancePreference.system.rawValue @AppStorage(AppLanguagePreference.userDefaultsKey) private var languagePreferenceRawValue = AppLanguagePreference.system.rawValue @AppStorage(MenuBarClickBehaviorPreference.userDefaultsKey) private var clickBehaviorRawValue = MenuBarClickBehaviorPreference.standard.rawValue + @State private var activeSearchTarget: GeneralSettingsSearchTarget? + @State private var clearSearchTargetTask: Task? var body: some View { - Form { - Section { - LaunchAtLoginSettingsRow(controller: launchAtLoginController) - } header: { - Text(AppL10n.settings("general.section.startup", defaultValue: "启动")) - } + ScrollViewReader { proxy in + Form { + Section { + LaunchAtLoginSettingsRow(controller: launchAtLoginController) + .generalSettingsSearchAnchor( + target: .launchAtLogin, + activeTarget: activeSearchTarget + ) + } header: { + Text(AppL10n.settings("general.section.startup", defaultValue: "启动")) + } - Section { - AppearanceSettingsRow(selection: appearancePreferenceBinding) - LanguageSettingsRow(selection: languagePreferenceBinding) - } header: { - Text(AppL10n.settings("general.section.appearance", defaultValue: "外观")) - } + Section { + AppearanceSettingsRow(selection: appearancePreferenceBinding) + .generalSettingsSearchAnchor( + target: .appearance, + activeTarget: activeSearchTarget + ) + LanguageSettingsRow(selection: languagePreferenceBinding) + .generalSettingsSearchAnchor( + target: .language, + activeTarget: activeSearchTarget + ) + } header: { + Text(AppL10n.settings("general.section.appearance", defaultValue: "外观")) + } - Section { - MenuBarIconSettingsView( - iconSettings: menuBarIconSettings, - gallery: menuBarIconGallery + Section { + MenuBarIconSettingsView( + iconSettings: menuBarIconSettings, + gallery: menuBarIconGallery + ) + .generalSettingsSearchAnchor( + target: .menuBarIcon, + activeTarget: activeSearchTarget + ) + MenuBarClickBehaviorSettingsRow(selection: clickBehaviorBinding) + .generalSettingsSearchAnchor( + target: .menuBarClickBehavior, + activeTarget: activeSearchTarget + ) + } header: { + Text(AppL10n.settings("general.section.menuBarIcon", defaultValue: "状态栏图标")) + } + + Section { + AppShortcutSettingsRows(pluginHost: pluginHost) + .generalSettingsSearchAnchor( + target: .appShortcuts, + activeTarget: activeSearchTarget + ) + } header: { + Text(AppL10n.settings("shortcuts.title", defaultValue: "键盘快捷键")) + } + + Section { + PreferencesBackupSettingsRow(pluginHost: pluginHost) + .generalSettingsSearchAnchor( + target: .preferencesBackup, + activeTarget: activeSearchTarget + ) + } header: { + Text(AppL10n.preferencesBackup("general.section.preferencesBackup", defaultValue: "偏好设置备份")) + } + } + .formStyle(.grouped) + .onAppear { + applySearchRevealRequest( + navigationCoordinator.searchRevealRequest, + proxy: proxy ) - MenuBarClickBehaviorSettingsRow(selection: clickBehaviorBinding) - } header: { - Text(AppL10n.settings("general.section.menuBarIcon", defaultValue: "状态栏图标")) } - - Section { - AppShortcutSettingsRows(pluginHost: pluginHost) - } header: { - Text(AppL10n.settings("shortcuts.title", defaultValue: "键盘快捷键")) + .onChange(of: navigationCoordinator.searchRevealRequest) { _, request in + applySearchRevealRequest(request, proxy: proxy) } - - Section { - PreferencesBackupSettingsRow(pluginHost: pluginHost) - } header: { - Text(AppL10n.preferencesBackup("general.section.preferencesBackup", defaultValue: "偏好设置备份")) + .onDisappear { + clearSearchTargetTask?.cancel() + clearSearchTargetTask = nil + activeSearchTarget = nil } } - .formStyle(.grouped) } private var appearancePreferenceBinding: Binding { @@ -291,6 +354,90 @@ struct GeneralSettingsView: View { clickBehaviorRawValue = preference.rawValue } } + + private func applySearchRevealRequest( + _ request: SettingsSearchRevealRequest?, + proxy: ScrollViewProxy + ) { + guard + let request, + case let .general(target) = request.target + else { + return + } + + clearSearchTargetTask?.cancel() + activeSearchTarget = target + + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.2)) { + proxy.scrollTo(target.scrollID, anchor: .center) + } + } + + clearSearchTargetTask = Task { @MainActor in + do { + try await Task.sleep(for: .seconds(2)) + } catch { + return + } + + activeSearchTarget = nil + navigationCoordinator.clearSearchRevealRequest(request) + } + } +} + +private struct GeneralSettingsSearchAnchorModifier: ViewModifier { + @AccessibilityFocusState private var isAccessibilityFocused: Bool + + let target: GeneralSettingsSearchTarget + let activeTarget: GeneralSettingsSearchTarget? + + func body(content: Content) -> some View { + content + .id(target.scrollID) + .accessibilityFocused($isAccessibilityFocused) + .overlay { + if activeTarget == target { + RoundedRectangle( + cornerRadius: PluginSettingsTheme.Radius.card, + style: .continuous + ) + .stroke(Color.accentColor, lineWidth: 2) + .allowsHitTesting(false) + .accessibilityHidden(true) + } + } + .onAppear { + focusIfNeeded(activeTarget) + } + .onChange(of: activeTarget) { _, newValue in + focusIfNeeded(newValue) + } + } + + private func focusIfNeeded(_ activeTarget: GeneralSettingsSearchTarget?) { + guard activeTarget == target else { + return + } + + isAccessibilityFocused = true + } +} + +private extension View { + func generalSettingsSearchAnchor( + target: GeneralSettingsSearchTarget, + activeTarget: GeneralSettingsSearchTarget? + ) -> some View { + modifier( + GeneralSettingsSearchAnchorModifier( + target: target, + activeTarget: activeTarget + ) + ) + } } private struct AppShortcutSettingsRows: View { @@ -979,7 +1126,10 @@ private struct FeatureSettingsView: View { HSplitView { FeatureSettingsSidebar( configurationItems: pluginHost.pluginConfigurationItems, - selection: selectionBinding + selection: selectionBinding, + onSearch: { + navigationCoordinator.presentUnifiedSearch(origin: .pluginSidebar) + } ) .frame( minWidth: Layout.sidebarMinWidth, @@ -1023,13 +1173,17 @@ private struct FeatureSettingsView: View { private struct FeatureSettingsSidebar: View { let configurationItems: [PluginConfigurationItem] @Binding var selection: FeatureSettingsPane + let onSearch: () -> Void var body: some View { - List(selection: optionalSelectionBinding) { - Section(AppL10n.settings( - "plugins.sidebar.pluginsSection", - defaultValue: "插件" - )) { + VStack(spacing: 0) { + searchLauncher + + List(selection: optionalSelectionBinding) { + Section(AppL10n.settings( + "plugins.sidebar.pluginsSection", + defaultValue: "插件" + )) { FeatureSettingsSidebarRow( title: AppL10n.settings("plugins.sidebar.dashboard", defaultValue: "仪表盘"), systemImage: "square.grid.2x2", @@ -1074,12 +1228,77 @@ private struct FeatureSettingsSidebar: View { } .listStyle(.sidebar) .scrollContentBackground(.hidden) + } .background { SettingsSidebarMaterialBackground() .allowsHitTesting(false) } } + private var searchLauncher: some View { + Button(action: onSearch) { + HStack(spacing: 8) { + Image(systemName: "magnifyingglass") + .foregroundStyle(.secondary) + + Text( + AppL10n.search( + "search.title", + defaultValue: "搜索 MacTools" + ) + ) + .foregroundStyle(.secondary) + .lineLimit(1) + + Spacer(minLength: 4) + + Text("⌘K") + .font(PluginSettingsTheme.Typography.statusBadge) + .foregroundStyle(.secondary) + .padding(.horizontal, 5) + .padding(.vertical, 1) + .background( + Capsule(style: .continuous) + .fill(Color(nsColor: .quaternaryLabelColor).opacity(0.12)) + ) + .accessibilityHidden(true) + } + } + .buttonStyle(.plain) + .padding(.horizontal, 9) + .padding(.vertical, 7) + .background( + RoundedRectangle(cornerRadius: 8, style: .continuous) + .fill(Color(nsColor: .controlBackgroundColor)) + ) + .overlay { + RoundedRectangle(cornerRadius: 8, style: .continuous) + .strokeBorder(Color(nsColor: .separatorColor).opacity(0.45), lineWidth: 1) + } + .padding(.horizontal, 10) + .padding(.top, 10) + .padding(.bottom, 8) + .help( + AppL10n.search( + "search.prompt", + defaultValue: "搜索插件、设置和命令" + ) + ) + .accessibilityLabel( + AppL10n.search( + "search.title", + defaultValue: "搜索 MacTools" + ) + ) + .accessibilityHint( + AppL10n.search( + "search.prompt", + defaultValue: "搜索插件、设置和命令" + ) + ) + .accessibilityIdentifier("mactools.unified-search.launcher") + } + private var optionalSelectionBinding: Binding { Binding( get: { selection }, @@ -1228,6 +1447,7 @@ private struct FeatureSettingsDetailPane: View { case let .configuration(pluginID): PluginConfigurationDetailPane( pluginHost: pluginHost, + navigationCoordinator: navigationCoordinator, item: configurationItem(for: pluginID) ) } @@ -1431,7 +1651,10 @@ private struct SettingsCardContainer: View { private struct PluginConfigurationDetailPane: View { @ObservedObject var pluginHost: PluginHost + @ObservedObject var navigationCoordinator: SettingsNavigationCoordinator let item: PluginConfigurationItem? + @State private var activeSearchTarget: PluginSettingsSearchTarget? + @State private var clearSearchTargetTask: Task? var body: some View { Group { @@ -1443,43 +1666,70 @@ private struct PluginConfigurationDetailPane: View { if item.hasCustomConfiguration { pluginHost.pluginConfigurationViewItem(for: item.pluginID).content + .environment(\.pluginSettingsSearchTarget, activeSearchTarget) .padding(.horizontal, PluginSettingsTheme.Spacing.pagePadding) .padding(.bottom, PluginSettingsTheme.Spacing.pagePadding) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) } } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + .onAppear { + applySearchRevealRequest( + navigationCoordinator.searchRevealRequest, + pluginID: item.pluginID + ) + } + .onChange(of: navigationCoordinator.searchRevealRequest) { _, request in + applySearchRevealRequest(request, pluginID: item.pluginID) + } } else { - ScrollView { - LazyVStack(alignment: .leading, spacing: 18) { - PluginConfigurationHeader(item: item) - - if !item.settingsCards.isEmpty { - PluginSettingsCardSection( - pluginHost: pluginHost, - cards: item.settingsCards - ) - } + ScrollViewReader { proxy in + ScrollView { + LazyVStack(alignment: .leading, spacing: 18) { + PluginConfigurationHeader(item: item) + + if !item.settingsCards.isEmpty { + PluginSettingsCardSection( + pluginHost: pluginHost, + cards: item.settingsCards + ) + } - if !item.permissionCards.isEmpty { - PluginPermissionCardSection( - pluginHost: pluginHost, - cards: item.permissionCards - ) - } + if !item.permissionCards.isEmpty { + PluginPermissionCardSection( + pluginHost: pluginHost, + cards: item.permissionCards + ) + } - if item.hasCustomConfiguration { - pluginHost.pluginConfigurationViewItem(for: item.pluginID).content - } + if item.hasCustomConfiguration { + pluginHost.pluginConfigurationViewItem(for: item.pluginID).content + } - if !item.shortcutItems.isEmpty { - PluginShortcutSection(pluginHost: pluginHost, items: item.shortcutItems) + if !item.shortcutItems.isEmpty { + PluginShortcutSection(pluginHost: pluginHost, items: item.shortcutItems) + } } + .environment(\.pluginSettingsSearchTarget, activeSearchTarget) + .padding(PluginSettingsTheme.Spacing.pagePadding) + .frame(maxWidth: .infinity, alignment: .topLeading) + } + .background(SettingsStyle.contentBackground) + .onAppear { + applySearchRevealRequest( + navigationCoordinator.searchRevealRequest, + pluginID: item.pluginID, + proxy: proxy + ) + } + .onChange(of: navigationCoordinator.searchRevealRequest) { _, request in + applySearchRevealRequest( + request, + pluginID: item.pluginID, + proxy: proxy + ) } - .padding(PluginSettingsTheme.Spacing.pagePadding) - .frame(maxWidth: .infinity, alignment: .topLeading) } - .background(SettingsStyle.contentBackground) } } else { ContentUnavailableView( @@ -1494,6 +1744,57 @@ private struct PluginConfigurationDetailPane: View { } } .background(SettingsStyle.contentBackground) + .onDisappear { + clearSearchTargetTask?.cancel() + clearSearchTargetTask = nil + activeSearchTarget = nil + } + } + + private func applySearchRevealRequest( + _ request: SettingsSearchRevealRequest?, + pluginID: String, + proxy: ScrollViewProxy + ) { + guard + let target = applySearchRevealRequest(request, pluginID: pluginID) + else { + return + } + + DispatchQueue.main.async { + withAnimation(.easeOut(duration: 0.2)) { + proxy.scrollTo(target.scrollID, anchor: .center) + } + } + } + + @discardableResult + private func applySearchRevealRequest( + _ request: SettingsSearchRevealRequest?, + pluginID: String + ) -> PluginSettingsSearchTarget? { + guard + let request, + case let .plugin(target) = request.target, + target.pluginID == pluginID + else { + return nil + } + + clearSearchTargetTask?.cancel() + activeSearchTarget = target + clearSearchTargetTask = Task { @MainActor in + do { + try await Task.sleep(for: .seconds(2)) + } catch { + return + } + + activeSearchTarget = nil + navigationCoordinator.clearSearchRevealRequest(request) + } + return target } } @@ -1561,6 +1862,10 @@ private struct PluginSettingsCardSection: View { } } ) + .pluginSettingsSearchAnchor( + pluginID: card.pluginID, + entryID: card.id + ) if index < cards.count - 1 { PluginSettingsListDivider() @@ -1640,6 +1945,10 @@ private struct PluginPermissionCardSection: View { ) .padding(.horizontal, 16) .padding(.vertical, 10) + .pluginSettingsSearchAnchor( + pluginID: card.pluginID, + entryID: card.id + ) if index < cards.count - 1 { PluginSettingsListDivider() diff --git a/Sources/App/ShortcutSettingsView.swift b/Sources/App/ShortcutSettingsView.swift index 7b6c0770..0e19c876 100644 --- a/Sources/App/ShortcutSettingsView.swift +++ b/Sources/App/ShortcutSettingsView.swift @@ -64,6 +64,10 @@ struct ShortcutSettingsRowsView: View { reset(item) } ) + .pluginSettingsSearchAnchor( + pluginID: item.pluginID, + entryID: item.id + ) if index < items.count - 1 { PluginSettingsListDivider() @@ -104,6 +108,10 @@ struct GroupedShortcutSettingsRowsView: View { onClear: clear, onReset: reset ) + .pluginSettingsSearchAnchor( + pluginID: group.items.first?.pluginID ?? "", + entryID: group.id + ) if index < groups.count - 1 { PluginSettingsListDivider() diff --git a/Sources/App/UnifiedSearchPaletteView.swift b/Sources/App/UnifiedSearchPaletteView.swift new file mode 100644 index 00000000..c5eb9f09 --- /dev/null +++ b/Sources/App/UnifiedSearchPaletteView.swift @@ -0,0 +1,496 @@ +import SwiftUI +import MacToolsPluginKit + +struct UnifiedSearchPresentationView: View { + @ObservedObject var pluginHost: PluginHost + @ObservedObject var navigationCoordinator: SettingsNavigationCoordinator + + var body: some View { + ZStack { + Color.black.opacity(0.16) + .ignoresSafeArea() + .contentShape(Rectangle()) + .onTapGesture { + navigationCoordinator.dismissUnifiedSearch() + } + .accessibilityHidden(true) + + UnifiedSearchPaletteView( + pluginHost: pluginHost, + navigationCoordinator: navigationCoordinator + ) + .padding(24) + } + } +} + +struct UnifiedSearchPaletteView: View { + private enum Layout { + static let width: CGFloat = 640 + static let resultListHeight: CGFloat = 390 + static let rowCornerRadius: CGFloat = 8 + } + + @ObservedObject var pluginHost: PluginHost + @ObservedObject var navigationCoordinator: SettingsNavigationCoordinator + @State private var query = "" + @State private var selectedResultID: String? + @State private var pendingConfirmation: MacToolsSearchResult? + @FocusState private var isQueryFocused: Bool + + var body: some View { + VStack(alignment: .leading, spacing: 12) { + searchField + + metadataRow + + resultList + + footer + } + .padding(16) + .frame(width: Layout.width) + .background(.regularMaterial, in: RoundedRectangle(cornerRadius: 14, style: .continuous)) + .background { + quickSelectionShortcutButtons + } + .overlay { + RoundedRectangle(cornerRadius: 14, style: .continuous) + .strokeBorder(Color(nsColor: .separatorColor).opacity(0.45), lineWidth: 1) + .allowsHitTesting(false) + } + .shadow(color: .black.opacity(0.22), radius: 28, y: 12) + .onAppear { + syncSelection() + focusQuery() + } + .onChange(of: query) { + syncSelection() + } + .onChange(of: resultIDs) { + syncSelection() + } + .onChange(of: navigationCoordinator.unifiedSearchFocusRequestID) { + focusQuery() + } + .onExitCommand { + navigationCoordinator.dismissUnifiedSearch() + } + .alert(item: $pendingConfirmation) { result in + let confirmation = result.confirmation + return Alert( + title: Text(confirmation?.title ?? result.title), + message: Text(confirmation?.message ?? result.detail), + primaryButton: .destructive( + Text( + confirmation?.confirmButtonTitle + ?? AppL10n.search("search.action.run", defaultValue: "执行") + ) + ) { + execute(result) + }, + secondaryButton: .cancel() + ) + } + .accessibilityElement(children: .contain) + .accessibilityLabel( + AppL10n.search("search.title", defaultValue: "搜索 MacTools") + ) + .accessibilityIdentifier("mactools.unified-search.palette") + } + + private var searchField: some View { + HStack(spacing: 8) { + Image(systemName: "magnifyingglass") + .foregroundStyle(.secondary) + + TextField( + AppL10n.search( + "search.prompt", + defaultValue: "搜索插件、设置和命令" + ), + text: $query + ) + .textFieldStyle(.plain) + .font(PluginSettingsTheme.Typography.rowTitle) + .focused($isQueryFocused) + .onSubmit { + activateSelectedResult() + } + .onKeyPress(.downArrow) { + moveSelection(by: 1) + return .handled + } + .onKeyPress(.upArrow) { + moveSelection(by: -1) + return .handled + } + .accessibilityLabel( + AppL10n.search("search.title", defaultValue: "搜索 MacTools") + ) + .accessibilityIdentifier("mactools.unified-search.field") + + if !query.isEmpty { + Button { + query = "" + } label: { + Image(systemName: "xmark.circle.fill") + .foregroundStyle(.secondary) + } + .buttonStyle(.plain) + .help(AppL10n.search("search.clear", defaultValue: "清除搜索")) + .accessibilityLabel( + AppL10n.search("search.clear", defaultValue: "清除搜索") + ) + } + + Text("⌘K") + .font(PluginSettingsTheme.Typography.statusBadge) + .foregroundStyle(.secondary) + .padding(.horizontal, 6) + .padding(.vertical, 2) + .background( + Capsule(style: .continuous) + .fill(Color(nsColor: .quaternaryLabelColor).opacity(0.12)) + ) + .accessibilityHidden(true) + + Button { + navigationCoordinator.dismissUnifiedSearch() + } label: { + Text("Esc") + } + .buttonStyle(.borderless) + .controlSize(.small) + .help(AppL10n.search("search.close", defaultValue: "关闭搜索")) + .accessibilityLabel( + AppL10n.search("search.close", defaultValue: "关闭搜索") + ) + } + .padding(.horizontal, 12) + .padding(.vertical, 9) + .background( + RoundedRectangle(cornerRadius: 9, style: .continuous) + .fill(Color(nsColor: .controlBackgroundColor)) + ) + .overlay { + RoundedRectangle(cornerRadius: 9, style: .continuous) + .strokeBorder(Color(nsColor: .separatorColor).opacity(0.5), lineWidth: 1) + } + } + + private var metadataRow: some View { + HStack { + Text(originText) + Spacer() + Text(resultCountText) + } + .font(PluginSettingsTheme.Typography.secondaryLabel) + .foregroundStyle(.secondary) + .accessibilityElement(children: .combine) + .accessibilityLabel("\(originText),\(resultCountText)") + } + + private var resultList: some View { + ScrollViewReader { proxy in + ScrollView { + if results.isEmpty { + ContentUnavailableView( + AppL10n.search("search.empty.title", defaultValue: "未找到结果"), + systemImage: "magnifyingglass", + description: Text( + AppL10n.search( + "search.empty.description", + defaultValue: "尝试插件名称、设置、功能或命令。" + ) + ) + ) + .frame(maxWidth: .infinity, minHeight: 220) + } else { + LazyVStack(alignment: .leading, spacing: 6) { + ForEach(MacToolsSearchResultKind.allCases, id: \.self) { kind in + let group = results.filter { $0.kind == kind } + if !group.isEmpty { + Text(kind.title) + .font(PluginSettingsTheme.Typography.secondaryLabel) + .foregroundStyle(.secondary) + .padding(.horizontal, 8) + .padding(.top, 4) + + ForEach(group) { result in + resultRow( + result, + quickSelectionNumber: quickSelectionNumber(for: result) + ) + .id(result.id) + } + } + } + } + } + } + .frame(height: Layout.resultListHeight) + .onChange(of: selectedResultID) { _, resultID in + guard let resultID else { + return + } + + withAnimation(.easeOut(duration: 0.12)) { + proxy.scrollTo(resultID, anchor: .center) + } + } + } + } + + private func resultRow( + _ result: MacToolsSearchResult, + quickSelectionNumber: Int? + ) -> some View { + let isSelected = result.id == selectedResultID + + return Button { + selectedResultID = result.id + activate(result) + } label: { + HStack(spacing: 12) { + Image(systemName: result.systemImage) + .frame(width: 18) + .foregroundStyle(isSelected ? Color.white : Color.accentColor) + + VStack(alignment: .leading, spacing: 3) { + Text(result.title) + .font(PluginSettingsTheme.Typography.rowTitle) + .foregroundStyle(isSelected ? Color.white : Color.primary) + .lineLimit(1) + + Text(result.subtitle) + .font(PluginSettingsTheme.Typography.rowDescription) + .foregroundStyle(isSelected ? Color.white.opacity(0.78) : Color.secondary) + .lineLimit(1) + } + .frame(maxWidth: .infinity, alignment: .leading) + + if let quickSelectionNumber { + Text("⌘\(quickSelectionNumber)") + .font(PluginSettingsTheme.Typography.statusBadge) + .foregroundStyle(isSelected ? Color.white.opacity(0.78) : Color.secondary) + .accessibilityHidden(true) + } + + Text(result.kind.actionTitle) + .font(PluginSettingsTheme.Typography.statusBadge) + .foregroundStyle(isSelected ? Color.white : Color.accentColor) + .padding(.horizontal, 7) + .padding(.vertical, 3) + .background( + Capsule(style: .continuous) + .fill( + isSelected + ? Color.white.opacity(0.16) + : Color.accentColor.opacity(0.1) + ) + ) + } + .padding(.horizontal, 10) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: Layout.rowCornerRadius, style: .continuous) + .fill(isSelected ? Color.accentColor : Color.clear) + ) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityLabel(result.accessibilityLabel) + .accessibilityHint(accessibilityHint(for: result, number: quickSelectionNumber)) + .accessibilityAddTraits(isSelected ? .isSelected : []) + .accessibilityIdentifier("mactools.unified-search.result.\(result.id)") + } + + private var footer: some View { + HStack { + if let selectedResult { + Text( + AppL10n.searchFormat( + "search.footer.actionFormat", + defaultValue: "%@“%@”", + selectedResult.kind.actionTitle, + selectedResult.title + ) + ) + .lineLimit(1) + } else { + Text( + AppL10n.search( + "search.footer.tryAnotherQuery", + defaultValue: "尝试其他关键词" + ) + ) + } + + Spacer() + + Text( + AppL10n.search( + "search.footer.keyboard", + defaultValue: "↑↓ 选择 ↩ 打开 ⌘1–9 快速打开" + ) + ) + } + .font(PluginSettingsTheme.Typography.secondaryLabel) + .foregroundStyle(.secondary) + .padding(.top, 8) + .overlay(alignment: .top) { + Divider() + } + } + + private var index: MacToolsSearchIndex { + MacToolsSearchIndexBuilder.build(pluginHost: pluginHost) + } + + private var results: [MacToolsSearchResult] { + MacToolsSearchPresentation.orderedResults( + index.results(matching: query) + ) + } + + private var resultIDs: [String] { + results.map(\.id) + } + + private var selectedResult: MacToolsSearchResult? { + guard let selectedResultID else { + return nil + } + + return results.first { $0.id == selectedResultID } + } + + private var resultCountText: String { + AppL10n.searchFormat( + "search.resultCountFormat", + defaultValue: "%d 个结果", + results.count + ) + } + + private var originText: String { + switch navigationCoordinator.unifiedSearchPresentationOrigin { + case .pluginSidebar: + return AppL10n.search( + "search.origin.pluginSidebar", + defaultValue: "来自插件导航" + ) + case .keyboard: + return AppL10n.search( + "search.origin.keyboard", + defaultValue: "全局快捷键 ⌘K" + ) + case nil: + return AppL10n.search( + "search.title", + defaultValue: "搜索 MacTools" + ) + } + } + + private var quickSelectionShortcutButtons: some View { + HStack(spacing: 0) { + ForEach( + Array(results.prefix(MacToolsSearchPresentation.quickSelectionLimit).enumerated()), + id: \.element.id + ) { index, result in + Button("") { + selectedResultID = result.id + activate(result) + } + .keyboardShortcut( + KeyEquivalent(Character(String(index + 1))), + modifiers: [.command] + ) + .focusable(false) + } + } + .frame(width: 0, height: 0) + .opacity(0) + .accessibilityHidden(true) + } + + private func quickSelectionNumber( + for result: MacToolsSearchResult + ) -> Int? { + MacToolsSearchPresentation.quickSelectionNumber( + for: result.id, + in: results + ) + } + + private func accessibilityHint( + for result: MacToolsSearchResult, + number: Int? + ) -> String { + guard let number else { + return result.detail + } + + return "⌘\(number). \(result.detail)" + } + + private func syncSelection() { + let availableResults = results + if let selectedResultID, + availableResults.contains(where: { $0.id == selectedResultID }) { + return + } + + selectedResultID = availableResults.first?.id + } + + private func moveSelection(by offset: Int) { + let availableResults = results + guard !availableResults.isEmpty else { + return + } + + let currentIndex = selectedResultID.flatMap { selectedID in + availableResults.firstIndex { $0.id == selectedID } + } ?? 0 + let nextIndex = (currentIndex + offset + availableResults.count) % availableResults.count + selectedResultID = availableResults[nextIndex].id + } + + private func activateSelectedResult() { + guard let selectedResult else { + return + } + + activate(selectedResult) + } + + private func activate(_ result: MacToolsSearchResult) { + if result.confirmation != nil { + pendingConfirmation = result + } else { + execute(result) + } + } + + private func execute(_ result: MacToolsSearchResult) { + switch result.action { + case let .navigate(destination, target): + navigationCoordinator.navigateFromSearch(to: destination, target: target) + case let .pluginCommand(pluginID, commandID): + navigationCoordinator.dismissUnifiedSearch() + pluginHost.performCommand(pluginID: pluginID, commandID: commandID) + case let .appCommand(action): + navigationCoordinator.dismissUnifiedSearch() + pluginHost.performAppCommand(action) + } + } + + private func focusQuery() { + DispatchQueue.main.async { + isQueryFocused = true + } + } +} diff --git a/Sources/Core/Plugins/PluginHost.swift b/Sources/Core/Plugins/PluginHost.swift index 892006b3..61dd7dfc 100644 --- a/Sources/Core/Plugins/PluginHost.swift +++ b/Sources/Core/Plugins/PluginHost.swift @@ -150,6 +150,25 @@ struct AppShortcutSettingsItem: Identifiable, Equatable { } } +struct PluginProvidedSettingsSearchItem: Identifiable, Hashable { + let pluginID: String + let entry: PluginSettingsSearchEntry + + var id: String { + "\(pluginID).settings-search.\(entry.id)" + } +} + +struct PluginCommandItem: Identifiable, Hashable { + let pluginID: String + let pluginTitle: String + let definition: PluginCommandDefinition + + var id: String { + "\(pluginID).command.\(definition.id)" + } +} + struct PluginAutomaticUpdateStatus: Equatable { enum Phase: Equatable { case idle @@ -328,6 +347,8 @@ final class PluginHost: ObservableObject { @Published private(set) var settingsCards: [PluginSettingsCard] = [] @Published private(set) var shortcutItems: [ShortcutSettingsItem] = [] @Published private(set) var appShortcutItems: [AppShortcutSettingsItem] = [] + @Published private(set) var pluginSettingsSearchItems: [PluginProvidedSettingsSearchItem] = [] + @Published private(set) var pluginCommandItems: [PluginCommandItem] = [] @Published private(set) var pluginManagementItems: [PluginManagementItem] = [] @Published private(set) var pluginCatalogStatus: PluginCatalogStatus = .unavailable @Published private(set) var automaticPluginUpdateStatus: PluginAutomaticUpdateStatus = .idle @@ -789,6 +810,30 @@ final class PluginHost: ObservableObject { } } + func performCommand(pluginID: String, commandID: String) { + guard + let plugin = corePlugin(for: pluginID), + let commandProvider = plugin as? any PluginCommandProviding, + (guardedValue( + for: plugin, + operation: "read command definitions", + commandProvider.commandDefinitions + ) ?? []).contains(where: { $0.id == commandID }) + else { + return + } + + handlePluginAction { + guardPluginCall(plugin, operation: "perform command") { + commandProvider.handleCommand(id: commandID) + } + } + } + + func performAppCommand(_ action: AppShortcutAction) { + appPresentationHandler?(action.presentationRequest) + } + func performPermissionAction(pluginID: String, permissionID: String) { guard let plugin = corePlugin(for: pluginID) else { return @@ -1871,6 +1916,40 @@ final class PluginHost: ObservableObject { ) } + pluginSettingsSearchItems = orderedCorePlugins().flatMap { plugin -> [PluginProvidedSettingsSearchItem] in + guard let provider = plugin as? any PluginSettingsSearchProviding else { + return [] + } + + let entries = guardedValue( + for: plugin, + operation: "read settings search entries", + provider.settingsSearchEntries + ) ?? [] + return entries.map { + PluginProvidedSettingsSearchItem(pluginID: plugin.metadata.id, entry: $0) + } + } + + pluginCommandItems = orderedCorePlugins().flatMap { plugin -> [PluginCommandItem] in + guard let provider = plugin as? any PluginCommandProviding else { + return [] + } + + let definitions = guardedValue( + for: plugin, + operation: "read command definitions", + provider.commandDefinitions + ) ?? [] + return definitions.map { + PluginCommandItem( + pluginID: plugin.metadata.id, + pluginTitle: plugin.metadata.title, + definition: $0 + ) + } + } + pluginConfigurationItems = buildPluginConfigurationItems( settingsCards: settingsCards, permissionCards: permissionCards, diff --git a/Sources/MacToolsPluginKit/PluginSearchModels.swift b/Sources/MacToolsPluginKit/PluginSearchModels.swift new file mode 100644 index 00000000..f277c6da --- /dev/null +++ b/Sources/MacToolsPluginKit/PluginSearchModels.swift @@ -0,0 +1,142 @@ +import SwiftUI + +public struct PluginSettingsSearchEntry: Identifiable, Hashable { + public let id: String + public let title: String + public let description: String + public let keywords: [String] + public let systemImage: String + + public init( + id: String, + title: String, + description: String, + keywords: [String] = [], + systemImage: String = "slider.horizontal.3" + ) { + self.id = id + self.title = title + self.description = description + self.keywords = keywords + self.systemImage = systemImage + } +} + +@MainActor +public protocol PluginSettingsSearchProviding: AnyObject { + var settingsSearchEntries: [PluginSettingsSearchEntry] { get } +} + +public struct PluginCommandDefinition: Identifiable, Hashable { + public struct Confirmation: Hashable { + public let title: String + public let message: String + public let confirmButtonTitle: String + + public init(title: String, message: String, confirmButtonTitle: String) { + self.title = title + self.message = message + self.confirmButtonTitle = confirmButtonTitle + } + } + + public let id: String + public let title: String + public let description: String + public let keywords: [String] + public let systemImage: String + public let confirmation: Confirmation? + + public init( + id: String, + title: String, + description: String, + keywords: [String] = [], + systemImage: String, + confirmation: Confirmation? = nil + ) { + self.id = id + self.title = title + self.description = description + self.keywords = keywords + self.systemImage = systemImage + self.confirmation = confirmation + } +} + +@MainActor +public protocol PluginCommandProviding: AnyObject { + var commandDefinitions: [PluginCommandDefinition] { get } + + func handleCommand(id: String) +} + +public struct PluginSettingsSearchTarget: Hashable, Sendable { + public let pluginID: String + public let entryID: String + + public init(pluginID: String, entryID: String) { + self.pluginID = pluginID + self.entryID = entryID + } + + public var scrollID: String { + "plugin-search-anchor.\(pluginID).\(entryID)" + } +} + +private struct PluginSettingsSearchTargetEnvironmentKey: EnvironmentKey { + static let defaultValue: PluginSettingsSearchTarget? = nil +} + +public extension EnvironmentValues { + var pluginSettingsSearchTarget: PluginSettingsSearchTarget? { + get { self[PluginSettingsSearchTargetEnvironmentKey.self] } + set { self[PluginSettingsSearchTargetEnvironmentKey.self] = newValue } + } +} + +private struct PluginSettingsSearchAnchorModifier: ViewModifier { + @Environment(\.pluginSettingsSearchTarget) private var activeTarget + @AccessibilityFocusState private var isAccessibilityFocused: Bool + + let target: PluginSettingsSearchTarget + + func body(content: Content) -> some View { + content + .id(target.scrollID) + .accessibilityFocused($isAccessibilityFocused) + .overlay { + if activeTarget == target { + RoundedRectangle(cornerRadius: PluginSettingsTheme.Radius.card, style: .continuous) + .stroke(Color.accentColor, lineWidth: 2) + .allowsHitTesting(false) + .accessibilityHidden(true) + } + } + .onAppear { + focusIfNeeded(activeTarget) + } + .onChange(of: activeTarget) { _, newValue in + focusIfNeeded(newValue) + } + } + + private func focusIfNeeded(_ activeTarget: PluginSettingsSearchTarget?) { + guard activeTarget == target else { + return + } + + isAccessibilityFocused = true + } +} + +public extension View { + func pluginSettingsSearchAnchor(pluginID: String, entryID: String) -> some View { + modifier( + PluginSettingsSearchAnchorModifier( + target: PluginSettingsSearchTarget(pluginID: pluginID, entryID: entryID) + ) + ) + } +} diff --git a/Sources/Resources/Localization/Search.xcstrings b/Sources/Resources/Localization/Search.xcstrings new file mode 100644 index 00000000..8c4e33f1 --- /dev/null +++ b/Sources/Resources/Localization/Search.xcstrings @@ -0,0 +1,78 @@ +{ + "sourceLanguage": "zh-Hans", + "strings": { + "search.action.goTo": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "انتقال" } }, "de": { "stringUnit": { "state": "translated", "value": "Gehe zu" } }, "en": { "stringUnit": { "state": "translated", "value": "Go To" } }, "es": { "stringUnit": { "state": "translated", "value": "Ir a" } }, "fr": { "stringUnit": { "state": "translated", "value": "Accéder" } }, "ja": { "stringUnit": { "state": "translated", "value": "移動" } }, "ko": { "stringUnit": { "state": "translated", "value": "이동" } }, "pt": { "stringUnit": { "state": "translated", "value": "Ir para" } }, "ru": { "stringUnit": { "state": "translated", "value": "Перейти" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "前往" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "前往" } } + } }, + "search.action.open": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "فتح" } }, "de": { "stringUnit": { "state": "translated", "value": "Öffnen" } }, "en": { "stringUnit": { "state": "translated", "value": "Open" } }, "es": { "stringUnit": { "state": "translated", "value": "Abrir" } }, "fr": { "stringUnit": { "state": "translated", "value": "Ouvrir" } }, "ja": { "stringUnit": { "state": "translated", "value": "開く" } }, "ko": { "stringUnit": { "state": "translated", "value": "열기" } }, "pt": { "stringUnit": { "state": "translated", "value": "Abrir" } }, "ru": { "stringUnit": { "state": "translated", "value": "Открыть" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "打开" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "開啟" } } + } }, + "search.action.run": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "تشغيل" } }, "de": { "stringUnit": { "state": "translated", "value": "Ausführen" } }, "en": { "stringUnit": { "state": "translated", "value": "Run" } }, "es": { "stringUnit": { "state": "translated", "value": "Ejecutar" } }, "fr": { "stringUnit": { "state": "translated", "value": "Exécuter" } }, "ja": { "stringUnit": { "state": "translated", "value": "実行" } }, "ko": { "stringUnit": { "state": "translated", "value": "실행" } }, "pt": { "stringUnit": { "state": "translated", "value": "Executar" } }, "ru": { "stringUnit": { "state": "translated", "value": "Выполнить" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "执行" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "執行" } } + } }, + "search.clear": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "مسح البحث" } }, "de": { "stringUnit": { "state": "translated", "value": "Suche löschen" } }, "en": { "stringUnit": { "state": "translated", "value": "Clear Search" } }, "es": { "stringUnit": { "state": "translated", "value": "Borrar búsqueda" } }, "fr": { "stringUnit": { "state": "translated", "value": "Effacer la recherche" } }, "ja": { "stringUnit": { "state": "translated", "value": "検索を消去" } }, "ko": { "stringUnit": { "state": "translated", "value": "검색 지우기" } }, "pt": { "stringUnit": { "state": "translated", "value": "Limpar busca" } }, "ru": { "stringUnit": { "state": "translated", "value": "Очистить поиск" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "清除搜索" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "清除搜尋" } } + } }, + "search.close": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "إغلاق البحث" } }, "de": { "stringUnit": { "state": "translated", "value": "Suche schließen" } }, "en": { "stringUnit": { "state": "translated", "value": "Close Search" } }, "es": { "stringUnit": { "state": "translated", "value": "Cerrar búsqueda" } }, "fr": { "stringUnit": { "state": "translated", "value": "Fermer la recherche" } }, "ja": { "stringUnit": { "state": "translated", "value": "検索を閉じる" } }, "ko": { "stringUnit": { "state": "translated", "value": "검색 닫기" } }, "pt": { "stringUnit": { "state": "translated", "value": "Fechar busca" } }, "ru": { "stringUnit": { "state": "translated", "value": "Закрыть поиск" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "关闭搜索" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "關閉搜尋" } } + } }, + "search.detail.about": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "الإصدار والتحديثات وروابط المشروع." } }, "de": { "stringUnit": { "state": "translated", "value": "Version, Updates und Projektlinks." } }, "en": { "stringUnit": { "state": "translated", "value": "Version, updates, and project links." } }, "es": { "stringUnit": { "state": "translated", "value": "Versión, actualizaciones y enlaces del proyecto." } }, "fr": { "stringUnit": { "state": "translated", "value": "Version, mises à jour et liens du projet." } }, "ja": { "stringUnit": { "state": "translated", "value": "バージョン、アップデート、プロジェクトリンク。" } }, "ko": { "stringUnit": { "state": "translated", "value": "버전, 업데이트 및 프로젝트 링크." } }, "pt": { "stringUnit": { "state": "translated", "value": "Versão, atualizações e links do projeto." } }, "ru": { "stringUnit": { "state": "translated", "value": "Версия, обновления и ссылки проекта." } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "版本、更新和项目链接。" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "版本、更新與專案連結。" } } + } }, + "search.detail.general": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "المظهر واللغة وأيقونة شريط القوائم والتشغيل عند تسجيل الدخول ونسخ التفضيلات احتياطيًا." } }, "de": { "stringUnit": { "state": "translated", "value": "Erscheinungsbild, Sprache, Menüleistensymbol, Anmeldestart und Einstellungssicherung." } }, "en": { "stringUnit": { "state": "translated", "value": "Appearance, language, menu bar icon, launch at login, and preferences backup." } }, "es": { "stringUnit": { "state": "translated", "value": "Apariencia, idioma, icono de la barra de menús, inicio de sesión y copia de preferencias." } }, "fr": { "stringUnit": { "state": "translated", "value": "Apparence, langue, icône de la barre des menus, ouverture de session et sauvegarde des préférences." } }, "ja": { "stringUnit": { "state": "translated", "value": "外観、言語、メニューバーアイコン、ログイン時の起動、設定のバックアップ。" } }, "ko": { "stringUnit": { "state": "translated", "value": "모양, 언어, 메뉴 막대 아이콘, 로그인 시 실행 및 환경설정 백업." } }, "pt": { "stringUnit": { "state": "translated", "value": "Aparência, idioma, ícone da barra de menus, início de sessão e backup das preferências." } }, "ru": { "stringUnit": { "state": "translated", "value": "Оформление, язык, значок строки меню, запуск при входе и резервная копия настроек." } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "外观、语言、菜单栏图标、登录启动和偏好备份。" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "外觀、語言、選單列圖示、登入啟動與偏好備份。" } } + } }, + "search.empty.description": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "جرّب اسم إضافة أو إعدادًا أو ميزة أو أمرًا." } }, "de": { "stringUnit": { "state": "translated", "value": "Versuche einen Plugin-Namen, eine Einstellung, Funktion oder einen Befehl." } }, "en": { "stringUnit": { "state": "translated", "value": "Try a plugin name, setting, feature, or command." } }, "es": { "stringUnit": { "state": "translated", "value": "Prueba con el nombre de un plugin, ajuste, función o comando." } }, "fr": { "stringUnit": { "state": "translated", "value": "Essayez un nom de module, un réglage, une fonction ou une commande." } }, "ja": { "stringUnit": { "state": "translated", "value": "プラグイン名、設定、機能、またはコマンドを試してください。" } }, "ko": { "stringUnit": { "state": "translated", "value": "플러그인 이름, 설정, 기능 또는 명령을 검색해 보세요." } }, "pt": { "stringUnit": { "state": "translated", "value": "Tente um nome de plugin, ajuste, recurso ou comando." } }, "ru": { "stringUnit": { "state": "translated", "value": "Попробуйте название плагина, настройку, функцию или команду." } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "尝试插件名称、设置、功能或命令。" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "嘗試外掛名稱、設定、功能或指令。" } } + } }, + "search.empty.title": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "لا توجد نتائج" } }, "de": { "stringUnit": { "state": "translated", "value": "Keine Ergebnisse" } }, "en": { "stringUnit": { "state": "translated", "value": "No Results" } }, "es": { "stringUnit": { "state": "translated", "value": "Sin resultados" } }, "fr": { "stringUnit": { "state": "translated", "value": "Aucun résultat" } }, "ja": { "stringUnit": { "state": "translated", "value": "結果なし" } }, "ko": { "stringUnit": { "state": "translated", "value": "결과 없음" } }, "pt": { "stringUnit": { "state": "translated", "value": "Nenhum resultado" } }, "ru": { "stringUnit": { "state": "translated", "value": "Ничего не найдено" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "未找到结果" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "找不到結果" } } + } }, + "search.footer.actionFormat": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "%1$@ «%2$@»" } }, "de": { "stringUnit": { "state": "translated", "value": "%1$@ „%2$@“" } }, "en": { "stringUnit": { "state": "translated", "value": "%1$@ “%2$@”" } }, "es": { "stringUnit": { "state": "translated", "value": "%1$@ «%2$@»" } }, "fr": { "stringUnit": { "state": "translated", "value": "%1$@ « %2$@ »" } }, "ja": { "stringUnit": { "state": "translated", "value": "%1$@「%2$@」" } }, "ko": { "stringUnit": { "state": "translated", "value": "%1$@ ‘%2$@’" } }, "pt": { "stringUnit": { "state": "translated", "value": "%1$@ “%2$@”" } }, "ru": { "stringUnit": { "state": "translated", "value": "%1$@ «%2$@»" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "%1$@“%2$@”" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "%1$@「%2$@」" } } + } }, + "search.footer.keyboard": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "↑↓ تحديد ↩ فتح ⌘1–9 فتح سريع" } }, "de": { "stringUnit": { "state": "translated", "value": "↑↓ Auswählen ↩ Öffnen ⌘1–9 Schnell öffnen" } }, "en": { "stringUnit": { "state": "translated", "value": "↑↓ Select ↩ Open ⌘1–9 Quick Open" } }, "es": { "stringUnit": { "state": "translated", "value": "↑↓ Seleccionar ↩ Abrir ⌘1–9 Apertura rápida" } }, "fr": { "stringUnit": { "state": "translated", "value": "↑↓ Sélectionner ↩ Ouvrir ⌘1–9 Ouverture rapide" } }, "ja": { "stringUnit": { "state": "translated", "value": "↑↓ 選択 ↩ 開く ⌘1–9 クイックオープン" } }, "ko": { "stringUnit": { "state": "translated", "value": "↑↓ 선택 ↩ 열기 ⌘1–9 빠르게 열기" } }, "pt": { "stringUnit": { "state": "translated", "value": "↑↓ Selecionar ↩ Abrir ⌘1–9 Abertura rápida" } }, "ru": { "stringUnit": { "state": "translated", "value": "↑↓ Выбрать ↩ Открыть ⌘1–9 Быстро открыть" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "↑↓ 选择 ↩ 打开 ⌘1–9 快速打开" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "↑↓ 選擇 ↩ 開啟 ⌘1–9 快速開啟" } } + } }, + "search.footer.tryAnotherQuery": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "جرّب بحثًا آخر" } }, "de": { "stringUnit": { "state": "translated", "value": "Andere Suche versuchen" } }, "en": { "stringUnit": { "state": "translated", "value": "Try another search" } }, "es": { "stringUnit": { "state": "translated", "value": "Prueba otra búsqueda" } }, "fr": { "stringUnit": { "state": "translated", "value": "Essayez une autre recherche" } }, "ja": { "stringUnit": { "state": "translated", "value": "別の検索を試す" } }, "ko": { "stringUnit": { "state": "translated", "value": "다른 검색어 사용" } }, "pt": { "stringUnit": { "state": "translated", "value": "Tente outra busca" } }, "ru": { "stringUnit": { "state": "translated", "value": "Попробуйте другой запрос" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "尝试其他关键词" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "嘗試其他關鍵字" } } + } }, + "search.group.commands": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "الأوامر" } }, "de": { "stringUnit": { "state": "translated", "value": "Befehle" } }, "en": { "stringUnit": { "state": "translated", "value": "Commands" } }, "es": { "stringUnit": { "state": "translated", "value": "Comandos" } }, "fr": { "stringUnit": { "state": "translated", "value": "Commandes" } }, "ja": { "stringUnit": { "state": "translated", "value": "コマンド" } }, "ko": { "stringUnit": { "state": "translated", "value": "명령" } }, "pt": { "stringUnit": { "state": "translated", "value": "Comandos" } }, "ru": { "stringUnit": { "state": "translated", "value": "Команды" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "命令" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "指令" } } + } }, + "search.group.navigation": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "التنقل" } }, "de": { "stringUnit": { "state": "translated", "value": "Navigation" } }, "en": { "stringUnit": { "state": "translated", "value": "Navigation" } }, "es": { "stringUnit": { "state": "translated", "value": "Navegación" } }, "fr": { "stringUnit": { "state": "translated", "value": "Navigation" } }, "ja": { "stringUnit": { "state": "translated", "value": "ナビゲーション" } }, "ko": { "stringUnit": { "state": "translated", "value": "탐색" } }, "pt": { "stringUnit": { "state": "translated", "value": "Navegação" } }, "ru": { "stringUnit": { "state": "translated", "value": "Навигация" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "导航" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "導覽" } } + } }, + "search.group.settings": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "الإعدادات" } }, "de": { "stringUnit": { "state": "translated", "value": "Einstellungen" } }, "en": { "stringUnit": { "state": "translated", "value": "Settings" } }, "es": { "stringUnit": { "state": "translated", "value": "Ajustes" } }, "fr": { "stringUnit": { "state": "translated", "value": "Réglages" } }, "ja": { "stringUnit": { "state": "translated", "value": "設定" } }, "ko": { "stringUnit": { "state": "translated", "value": "설정" } }, "pt": { "stringUnit": { "state": "translated", "value": "Ajustes" } }, "ru": { "stringUnit": { "state": "translated", "value": "Настройки" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "设置" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "設定" } } + } }, + "search.origin.keyboard": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "الاختصار العام ⌘K" } }, "de": { "stringUnit": { "state": "translated", "value": "Globaler Kurzbefehl ⌘K" } }, "en": { "stringUnit": { "state": "translated", "value": "Global Shortcut ⌘K" } }, "es": { "stringUnit": { "state": "translated", "value": "Atajo global ⌘K" } }, "fr": { "stringUnit": { "state": "translated", "value": "Raccourci global ⌘K" } }, "ja": { "stringUnit": { "state": "translated", "value": "グローバルショートカット ⌘K" } }, "ko": { "stringUnit": { "state": "translated", "value": "전역 단축키 ⌘K" } }, "pt": { "stringUnit": { "state": "translated", "value": "Atalho global ⌘K" } }, "ru": { "stringUnit": { "state": "translated", "value": "Глобальное сочетание ⌘K" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "全局快捷键 ⌘K" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "全域快速鍵 ⌘K" } } + } }, + "search.origin.pluginSidebar": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "من تنقل الإضافات" } }, "de": { "stringUnit": { "state": "translated", "value": "Aus der Plugin-Navigation" } }, "en": { "stringUnit": { "state": "translated", "value": "From Plugin Navigation" } }, "es": { "stringUnit": { "state": "translated", "value": "Desde la navegación de plugins" } }, "fr": { "stringUnit": { "state": "translated", "value": "Depuis la navigation des modules" } }, "ja": { "stringUnit": { "state": "translated", "value": "プラグインナビゲーションから" } }, "ko": { "stringUnit": { "state": "translated", "value": "플러그인 탐색에서" } }, "pt": { "stringUnit": { "state": "translated", "value": "Da navegação de plugins" } }, "ru": { "stringUnit": { "state": "translated", "value": "Из навигации по плагинам" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "来自插件导航" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "來自外掛導覽" } } + } }, + "search.prompt": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "ابحث في الإضافات والإعدادات والأوامر" } }, "de": { "stringUnit": { "state": "translated", "value": "Plugins, Einstellungen und Befehle durchsuchen" } }, "en": { "stringUnit": { "state": "translated", "value": "Search plugins, settings, and commands" } }, "es": { "stringUnit": { "state": "translated", "value": "Buscar plugins, ajustes y comandos" } }, "fr": { "stringUnit": { "state": "translated", "value": "Rechercher des modules, réglages et commandes" } }, "ja": { "stringUnit": { "state": "translated", "value": "プラグイン、設定、コマンドを検索" } }, "ko": { "stringUnit": { "state": "translated", "value": "플러그인, 설정 및 명령 검색" } }, "pt": { "stringUnit": { "state": "translated", "value": "Buscar plugins, ajustes e comandos" } }, "ru": { "stringUnit": { "state": "translated", "value": "Поиск плагинов, настроек и команд" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "搜索插件、设置和命令" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "搜尋外掛、設定與指令" } } + } }, + "search.resultCountFormat": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "%d نتيجة" } }, "de": { "stringUnit": { "state": "translated", "value": "%d Ergebnisse" } }, "en": { "stringUnit": { "state": "translated", "value": "%d results" } }, "es": { "stringUnit": { "state": "translated", "value": "%d resultados" } }, "fr": { "stringUnit": { "state": "translated", "value": "%d résultats" } }, "ja": { "stringUnit": { "state": "translated", "value": "%d件の結果" } }, "ko": { "stringUnit": { "state": "translated", "value": "결과 %d개" } }, "pt": { "stringUnit": { "state": "translated", "value": "%d resultados" } }, "ru": { "stringUnit": { "state": "translated", "value": "Результатов: %d" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "%d 个结果" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "%d 個結果" } } + } }, + "search.subtitle.appSettings": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "إعدادات التطبيق" } }, "de": { "stringUnit": { "state": "translated", "value": "App-Einstellungen" } }, "en": { "stringUnit": { "state": "translated", "value": "App Settings" } }, "es": { "stringUnit": { "state": "translated", "value": "Ajustes de la app" } }, "fr": { "stringUnit": { "state": "translated", "value": "Réglages de l’app" } }, "ja": { "stringUnit": { "state": "translated", "value": "アプリ設定" } }, "ko": { "stringUnit": { "state": "translated", "value": "앱 설정" } }, "pt": { "stringUnit": { "state": "translated", "value": "Ajustes do app" } }, "ru": { "stringUnit": { "state": "translated", "value": "Настройки приложения" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "应用设置" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "應用程式設定" } } + } }, + "search.subtitle.customSetting": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "الإعدادات" } }, "de": { "stringUnit": { "state": "translated", "value": "Einstellungen" } }, "en": { "stringUnit": { "state": "translated", "value": "Settings" } }, "es": { "stringUnit": { "state": "translated", "value": "Ajustes" } }, "fr": { "stringUnit": { "state": "translated", "value": "Réglages" } }, "ja": { "stringUnit": { "state": "translated", "value": "設定" } }, "ko": { "stringUnit": { "state": "translated", "value": "설정" } }, "pt": { "stringUnit": { "state": "translated", "value": "Ajustes" } }, "ru": { "stringUnit": { "state": "translated", "value": "Настройки" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "设置" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "設定" } } + } }, + "search.subtitle.macTools": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "MacTools" } }, "de": { "stringUnit": { "state": "translated", "value": "MacTools" } }, "en": { "stringUnit": { "state": "translated", "value": "MacTools" } }, "es": { "stringUnit": { "state": "translated", "value": "MacTools" } }, "fr": { "stringUnit": { "state": "translated", "value": "MacTools" } }, "ja": { "stringUnit": { "state": "translated", "value": "MacTools" } }, "ko": { "stringUnit": { "state": "translated", "value": "MacTools" } }, "pt": { "stringUnit": { "state": "translated", "value": "MacTools" } }, "ru": { "stringUnit": { "state": "translated", "value": "MacTools" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "MacTools" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "MacTools" } } + } }, + "search.subtitle.plugins": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "الإضافات" } }, "de": { "stringUnit": { "state": "translated", "value": "Plugins" } }, "en": { "stringUnit": { "state": "translated", "value": "Plugins" } }, "es": { "stringUnit": { "state": "translated", "value": "Plugins" } }, "fr": { "stringUnit": { "state": "translated", "value": "Modules" } }, "ja": { "stringUnit": { "state": "translated", "value": "プラグイン" } }, "ko": { "stringUnit": { "state": "translated", "value": "플러그인" } }, "pt": { "stringUnit": { "state": "translated", "value": "Plugins" } }, "ru": { "stringUnit": { "state": "translated", "value": "Плагины" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "插件" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "外掛" } } + } }, + "search.title": { "extractionState": "manual", "localizations": { + "ar": { "stringUnit": { "state": "translated", "value": "البحث في MacTools" } }, "de": { "stringUnit": { "state": "translated", "value": "MacTools durchsuchen" } }, "en": { "stringUnit": { "state": "translated", "value": "Search MacTools" } }, "es": { "stringUnit": { "state": "translated", "value": "Buscar en MacTools" } }, "fr": { "stringUnit": { "state": "translated", "value": "Rechercher dans MacTools" } }, "ja": { "stringUnit": { "state": "translated", "value": "MacToolsを検索" } }, "ko": { "stringUnit": { "state": "translated", "value": "MacTools 검색" } }, "pt": { "stringUnit": { "state": "translated", "value": "Buscar no MacTools" } }, "ru": { "stringUnit": { "state": "translated", "value": "Поиск в MacTools" } }, "zh-Hans": { "stringUnit": { "state": "translated", "value": "搜索 MacTools" } }, "zh-Hant": { "stringUnit": { "state": "translated", "value": "搜尋 MacTools" } } + } } + }, + "version": "1.0" +} diff --git a/Tests/App/AppWindowRouterTests.swift b/Tests/App/AppWindowRouterTests.swift index b1116634..84274d61 100644 --- a/Tests/App/AppWindowRouterTests.swift +++ b/Tests/App/AppWindowRouterTests.swift @@ -208,6 +208,16 @@ final class AppWindowRouterTests: XCTestCase { ), .focusSearch ) + XCTAssertEqual( + MacToolsLocalKeyboardCommand.resolve( + for: keyEvent( + keyCode: UInt16(kVK_ANSI_K), + characters: "K", + modifiers: [.command, .capsLock] + ) + ), + .showUnifiedSearch + ) } func testLocalCommandMatcherLeavesNavigationCloseAndQuitCommandsUntouched() { @@ -301,6 +311,36 @@ final class AppWindowRouterTests: XCTestCase { window.close() } + func testCommandKReusesSettingsWindowAndRefocusesUnifiedSearch() throws { + let suiteName = "AppWindowRouterTests-\(UUID().uuidString)" + let defaults = try XCTUnwrap(UserDefaults(suiteName: suiteName)) + defer { defaults.removePersistentDomain(forName: suiteName) } + let router = makeRouter(defaults: defaults) + + router.showSettings() + let window = try XCTUnwrap(router.settingsWindow) + let coordinator = try XCTUnwrap(router.settingsNavigationCoordinator) + let commandK = keyEvent( + keyCode: UInt16(kVK_ANSI_K), + characters: "k", + windowNumber: window.windowNumber + ) + + XCTAssertTrue(window.performKeyEquivalent(with: commandK)) + XCTAssertTrue(coordinator.isUnifiedSearchPresented) + XCTAssertEqual(coordinator.unifiedSearchPresentationOrigin, .keyboard) + let firstFocusRequestID = coordinator.unifiedSearchFocusRequestID + + XCTAssertTrue(window.performKeyEquivalent(with: commandK)) + XCTAssertTrue(router.settingsWindow === window) + XCTAssertGreaterThan( + coordinator.unifiedSearchFocusRequestID, + firstFocusRequestID + ) + + window.close() + } + func testAppUpdateRequestNavigatesDirectlyToAbout() throws { let suiteName = "AppWindowRouterTests-\(UUID().uuidString)" let defaults = try XCTUnwrap(UserDefaults(suiteName: suiteName)) diff --git a/Tests/App/MacToolsSearchTests.swift b/Tests/App/MacToolsSearchTests.swift new file mode 100644 index 00000000..f268d05e --- /dev/null +++ b/Tests/App/MacToolsSearchTests.swift @@ -0,0 +1,412 @@ +import AppKit +import SwiftUI +import XCTest +import MacToolsPluginKit +@testable import MacTools + +@MainActor +final class MacToolsSearchTests: XCTestCase { + func testIndexIncludesNavigationDeclarativeSettingsCustomSettingsAndCommands() throws { + let plugin = SearchableTestPlugin() + let host = makePluginHostForTests(plugins: [plugin, SurfaceOnlySearchTestPlugin()]) + let index = MacToolsSearchIndexBuilder.build(pluginHost: host) + + XCTAssertTrue(index.items.contains { + $0.kind == .navigation && $0.title == plugin.metadata.title + }) + XCTAssertTrue(index.items.contains { + $0.kind == .setting && $0.title == "自动切换" + }) + XCTAssertTrue(index.items.contains { + $0.kind == .setting && $0.title == "辅助功能授权" + }) + XCTAssertTrue(index.items.contains { + $0.kind == .setting && $0.title == "降低亮度" + }) + XCTAssertTrue(index.items.contains { + $0.kind == .setting && $0.title == "快捷键目标" + }) + XCTAssertTrue(index.items.contains { + $0.kind == .command && $0.title == "让显示器休眠" + }) + XCTAssertTrue(index.items.contains { + $0.kind == .command && $0.title == AppShortcutAction.toggleDashboard.title + }) + XCTAssertTrue(index.items.contains { + $0.id == "general-setting.appearance" && $0.kind == .setting + }) + XCTAssertTrue(index.items.contains { + $0.id == "general-setting.preferencesBackup" && $0.kind == .setting + }) + } + + func testCustomSettingResultCarriesPluginPageAndExactSearchTarget() throws { + let plugin = SearchableTestPlugin() + let host = makePluginHostForTests(plugins: [plugin]) + let result = try XCTUnwrap( + MacToolsSearchIndexBuilder.build(pluginHost: host).items.first { + $0.title == "快捷键目标" + } + ) + + guard case let .navigate(destination, target) = result.action else { + return XCTFail("Expected a navigation action") + } + + XCTAssertEqual(destination, .plugins(.configuration(plugin.metadata.id))) + XCTAssertEqual( + target, + .plugin( + PluginSettingsSearchTarget( + pluginID: plugin.metadata.id, + entryID: SearchableTestPlugin.customEntryID + ) + ) + ) + } + + func testGeneralSettingResultCarriesGeneralPageAndExactSearchTarget() throws { + let host = makePluginHostForTests(plugins: []) + let result = try XCTUnwrap( + MacToolsSearchIndexBuilder.build(pluginHost: host).items.first { + $0.id == "general-setting.language" + } + ) + + XCTAssertEqual( + result.action, + .navigate(destination: .general, target: .general(.language)) + ) + } + + func testGeneralShortcutSettingMatchesIndividualShortcutTitles() { + let host = makePluginHostForTests(plugins: []) + let results = MacToolsSearchIndexBuilder.build(pluginHost: host) + .results(matching: AppShortcutAction.toggleDashboard.title) + + XCTAssertTrue(results.contains { $0.id == "general-setting.appShortcuts" }) + } + + func testSurfaceOnlyPluginNavigatesToItsFeaturePanelPage() throws { + let plugin = SurfaceOnlySearchTestPlugin() + let host = makePluginHostForTests(plugins: [plugin]) + let result = try XCTUnwrap( + MacToolsSearchIndexBuilder.build(pluginHost: host).items.first { + $0.title == plugin.metadata.title + } + ) + + XCTAssertEqual( + result.action, + .navigate(destination: .plugins(.featurePanelLayout), target: nil) + ) + } + + func testSearchUsesTitleDescriptionAndKeywordsWithAllTokenMatching() { + let plugin = SearchableTestPlugin() + let host = makePluginHostForTests(plugins: [plugin]) + let index = MacToolsSearchIndexBuilder.build(pluginHost: host) + + XCTAssertEqual( + index.results(matching: "快捷键 目标").first?.title, + "快捷键目标" + ) + XCTAssertTrue( + index.results(matching: "外接 屏幕").contains { + $0.title == "快捷键目标" + } + ) + XCTAssertTrue(index.results(matching: "不存在 屏幕").isEmpty) + } + + func testExactTitleRanksAheadOfDescriptionOnlyMatch() { + let exact = MacToolsSearchResult( + id: "exact", + kind: .navigation, + title: "屏幕", + subtitle: "插件", + detail: "", + keywords: [], + systemImage: "display", + action: .navigate(destination: .plugins(.marketplace), target: nil), + confirmation: nil, + suggestionPriority: nil + ) + let detailOnly = MacToolsSearchResult( + id: "detail", + kind: .setting, + title: "保持常亮", + subtitle: "阻止休眠", + detail: "防止屏幕因空闲而关闭", + keywords: [], + systemImage: "coffee", + action: .navigate(destination: .plugins(.marketplace), target: nil), + confirmation: nil, + suggestionPriority: nil + ) + + XCTAssertEqual( + MacToolsSearchIndex(items: [detailOnly, exact]) + .results(matching: "屏幕") + .map(\.id), + ["exact", "detail"] + ) + } + + func testEmptyQueryReturnsOnlyOrderedSuggestedDestinations() { + let host = makePluginHostForTests(plugins: [SearchableTestPlugin()]) + let results = MacToolsSearchIndexBuilder.build(pluginHost: host) + .results(matching: " ") + + XCTAssertEqual( + results.map(\.id), + [ + "navigation.dashboard", + "navigation.feature-panel", + "navigation.marketplace", + "navigation.general", + "navigation.about" + ] + ) + XCTAssertTrue(results.allSatisfy { $0.kind == .navigation }) + } + + func testPresentationOrderMatchesVisibleGroupsAndQuickSelectionNumbers() { + let navigation = searchResult(id: "navigation", kind: .navigation) + let setting = searchResult(id: "setting", kind: .setting) + let command = searchResult(id: "command", kind: .command) + let ordered = MacToolsSearchPresentation.orderedResults([ + command, + navigation, + setting + ]) + + XCTAssertEqual(ordered.map(\.id), ["navigation", "setting", "command"]) + XCTAssertEqual( + MacToolsSearchPresentation.quickSelectionNumber( + for: "setting", + in: ordered + ), + 2 + ) + XCTAssertNil( + MacToolsSearchPresentation.quickSelectionNumber( + for: "missing", + in: ordered + ) + ) + } + + func testQuickSelectionIsLimitedToFirstNineVisibleResults() { + let results = (1...10).map { + searchResult(id: "result-\($0)", kind: .setting) + } + + XCTAssertEqual( + MacToolsSearchPresentation.quickSelectionNumber( + for: "result-9", + in: results + ), + 9 + ) + XCTAssertNil( + MacToolsSearchPresentation.quickSelectionNumber( + for: "result-10", + in: results + ) + ) + } + + func testPluginHostPerformsOnlyDeclaredCommands() { + let plugin = SearchableTestPlugin() + let host = makePluginHostForTests(plugins: [plugin]) + + host.performCommand(pluginID: plugin.metadata.id, commandID: "sleep") + host.performCommand(pluginID: plugin.metadata.id, commandID: "missing") + host.performCommand(pluginID: "missing", commandID: "sleep") + + XCTAssertEqual(plugin.performedCommandIDs, ["sleep"]) + } + + func testAppCommandUsesExistingPresentationRouting() { + let host = makePluginHostForTests(plugins: []) + var requests: [AppPresentationRequest] = [] + host.appPresentationHandler = { requests.append($0) } + + host.performAppCommand(.toggleDashboard) + + XCTAssertEqual(requests, [.toggleDashboard]) + } + + private func searchResult( + id: String, + kind: MacToolsSearchResultKind + ) -> MacToolsSearchResult { + MacToolsSearchResult( + id: id, + kind: kind, + title: id, + subtitle: "", + detail: "", + keywords: [], + systemImage: "magnifyingglass", + action: .navigate(destination: .general, target: nil), + confirmation: nil, + suggestionPriority: nil + ) + } +} + +@MainActor +private final class SearchableTestPlugin: + MacToolsPlugin, + PluginPrimaryPanel, + PluginSettingsSearchProviding, + PluginCommandProviding +{ + static let customEntryID = "shortcut-target" + + let metadata = PluginMetadata( + id: "searchable", + title: "显示工具", + iconName: "display", + iconTint: Color(nsColor: .systemBlue), + order: 1, + defaultDescription: "管理内建和外接显示器亮度" + ) + let primaryPanelDescriptor = PluginPrimaryPanelDescriptor( + controlStyle: .disclosure, + menuActionBehavior: .keepPresented + ) + var onStateChange: (() -> Void)? + var requestPermissionGuidance: ((String) -> Void)? + var shortcutBindingResolver: ((String) -> ShortcutBinding?)? + var performedCommandIDs: [String] = [] + + var primaryPanelState: PluginPanelState { + PluginPanelState( + subtitle: metadata.defaultDescription, + isOn: false, + isExpanded: false, + isEnabled: true, + isVisible: true, + detail: nil, + errorMessage: nil + ) + } + + var settingsSections: [PluginSettingsSection] { + [ + PluginSettingsSection( + id: "automatic", + title: "自动切换", + description: "根据屏幕状态自动切换亮度。", + status: .init( + text: "已开启", + systemImage: "checkmark.circle", + tone: .positive + ), + footnote: nil, + buttonTitle: nil, + actionID: nil + ) + ] + } + + var permissionRequirements: [PluginPermissionRequirement] { + [ + PluginPermissionRequirement( + id: "accessibility", + kind: .accessibility, + title: "辅助功能授权", + description: "允许控制显示器。" + ) + ] + } + + var shortcutDefinitions: [PluginShortcutDefinition] { + [ + PluginShortcutDefinition( + id: "decrease", + title: "降低亮度", + description: "降低目标显示器亮度。", + actionID: "decrease", + scope: .global, + defaultBinding: nil, + isRequired: false + ) + ] + } + + var configuration: PluginConfiguration? { + PluginConfiguration(description: metadata.defaultDescription) { _ in + EmptyView() + } + } + + var settingsSearchEntries: [PluginSettingsSearchEntry] { + [ + PluginSettingsSearchEntry( + id: Self.customEntryID, + title: "快捷键目标", + description: "选择亮度快捷键控制的外接显示器。", + keywords: ["屏幕", "作用范围"], + systemImage: "display.2" + ) + ] + } + + var commandDefinitions: [PluginCommandDefinition] { + [ + PluginCommandDefinition( + id: "sleep", + title: "让显示器休眠", + description: "立即让所有屏幕进入休眠。", + systemImage: "display" + ) + ] + } + + func permissionState(for permissionID: String) -> PluginPermissionState { + PluginPermissionState(isGranted: true, footnote: nil) + } + + func handleAction(_ action: PluginPanelAction) {} + + func handleCommand(id: String) { + performedCommandIDs.append(id) + } +} + +@MainActor +private final class SurfaceOnlySearchTestPlugin: MacToolsPlugin, PluginPrimaryPanel { + let metadata = PluginMetadata( + id: "surface-only", + title: "锁定屏幕", + iconName: "lock", + iconTint: Color(nsColor: .systemGray), + order: 2, + defaultDescription: "立即锁定屏幕" + ) + let primaryPanelDescriptor = PluginPrimaryPanelDescriptor( + controlStyle: .button, + menuActionBehavior: .dismissBeforeHandling + ) + var onStateChange: (() -> Void)? + var requestPermissionGuidance: ((String) -> Void)? + var shortcutBindingResolver: ((String) -> ShortcutBinding?)? + + var primaryPanelState: PluginPanelState { + PluginPanelState( + subtitle: metadata.defaultDescription, + isOn: false, + isExpanded: false, + isEnabled: true, + isVisible: true, + detail: nil, + errorMessage: nil + ) + } + + func handleAction(_ action: PluginPanelAction) {} +} diff --git a/Tests/App/MenuBarPanelPresenterTests.swift b/Tests/App/MenuBarPanelPresenterTests.swift index 61d47465..0c35f009 100644 --- a/Tests/App/MenuBarPanelPresenterTests.swift +++ b/Tests/App/MenuBarPanelPresenterTests.swift @@ -120,6 +120,15 @@ final class MenuBarPanelPresenterTests: XCTestCase { ), .showSettings ) + XCTAssertEqual( + MenuBarPanelKeyboardAction.resolve( + for: makeCommandKeyEvent( + characters: "k", + keyCode: UInt16(kVK_ANSI_K) + ) + ), + .showUnifiedSearch + ) XCTAssertEqual( MenuBarPanelKeyboardAction.resolve( for: makeCommandKeyEvent( @@ -153,6 +162,17 @@ final class MenuBarPanelPresenterTests: XCTestCase { XCTAssertEqual(presentationCount, 1) } + func testPanelUnifiedSearchCommandUsesInjectedWindowRouterPath() { + var presentationCount = 0 + let presenter = makePresenter( + onOpenUnifiedSearch: { presentationCount += 1 } + ) + + presenter.performKeyboardAction(.showUnifiedSearch) + + XCTAssertEqual(presentationCount, 1) + } + func testEscapeUsesCoordinatedPanelDismissalPath() { var dismissalCount = 0 let presenter = makePresenter(onDismiss: { dismissalCount += 1 }) @@ -321,7 +341,8 @@ final class MenuBarPanelPresenterTests: XCTestCase { private func makePresenter( onDismiss: @escaping () -> Void = {}, - onOpenSettings: @escaping () -> Void = {} + onOpenSettings: @escaping () -> Void = {}, + onOpenUnifiedSearch: @escaping () -> Void = {} ) -> MenuBarPanelPresenter { let defaults = UserDefaults(suiteName: suiteName)! defaults.removePersistentDomain(forName: suiteName) @@ -340,6 +361,7 @@ final class MenuBarPanelPresenterTests: XCTestCase { onDismiss: onDismiss, onOpenUpdate: {}, onOpenSettings: onOpenSettings, + onOpenUnifiedSearch: onOpenUnifiedSearch, onPresentDiskCleanConfiguration: {}, onPresentLaunchControlConfiguration: {}, onAllPanelsClosed: {} diff --git a/Tests/App/SettingsNavigationCoordinatorTests.swift b/Tests/App/SettingsNavigationCoordinatorTests.swift index 08c549a0..2ac2c3e2 100644 --- a/Tests/App/SettingsNavigationCoordinatorTests.swift +++ b/Tests/App/SettingsNavigationCoordinatorTests.swift @@ -1,4 +1,5 @@ import XCTest +import MacToolsPluginKit @testable import MacTools @MainActor @@ -210,4 +211,97 @@ final class SettingsNavigationCoordinatorTests: XCTestCase { XCTAssertNotEqual(firstRequest.id, secondRequest.id) } + + func testUnifiedSearchPresentationTracksOriginAndRepeatedFocusRequests() { + let coordinator = SettingsNavigationCoordinator() + + coordinator.presentUnifiedSearch(origin: .pluginSidebar) + let firstFocusRequestID = coordinator.unifiedSearchFocusRequestID + + XCTAssertTrue(coordinator.isUnifiedSearchPresented) + XCTAssertEqual(coordinator.unifiedSearchPresentationOrigin, .pluginSidebar) + + coordinator.presentUnifiedSearch(origin: .keyboard) + + XCTAssertTrue(coordinator.isUnifiedSearchPresented) + XCTAssertEqual(coordinator.unifiedSearchPresentationOrigin, .keyboard) + XCTAssertGreaterThan(coordinator.unifiedSearchFocusRequestID, firstFocusRequestID) + + coordinator.dismissUnifiedSearch() + + XCTAssertFalse(coordinator.isUnifiedSearchPresented) + XCTAssertNil(coordinator.unifiedSearchPresentationOrigin) + } + + func testLocalSearchFocusDoesNotMoveBehindUnifiedSearch() { + let coordinator = SettingsNavigationCoordinator() + coordinator.navigate(to: .plugins(.marketplace)) + coordinator.presentUnifiedSearch(origin: .keyboard) + + XCTAssertFalse(coordinator.requestSearchFocus()) + XCTAssertNil(coordinator.searchFocusRequest) + } + + func testSearchNavigationDismissesPaletteAndPublishesExactRevealTarget() throws { + let coordinator = SettingsNavigationCoordinator( + isPluginConfigurationAvailable: { $0 == "keep-awake" } + ) + let target = PluginSettingsSearchTarget( + pluginID: "keep-awake", + entryID: "keep-display-on" + ) + coordinator.presentUnifiedSearch(origin: .keyboard) + + coordinator.navigateFromSearch( + to: .plugins(.configuration("keep-awake")), + target: .plugin(target) + ) + + XCTAssertFalse(coordinator.isUnifiedSearchPresented) + XCTAssertEqual( + coordinator.destination, + .plugins(.configuration("keep-awake")) + ) + let request = try XCTUnwrap(coordinator.searchRevealRequest) + XCTAssertEqual(request.target, .plugin(target)) + + coordinator.clearSearchRevealRequest(request) + XCTAssertNil(coordinator.searchRevealRequest) + } + + func testPageLevelSearchNavigationClearsPreviousRevealTarget() { + let coordinator = SettingsNavigationCoordinator( + isPluginConfigurationAvailable: { $0 == "keep-awake" } + ) + let target = PluginSettingsSearchTarget( + pluginID: "keep-awake", + entryID: "keep-display-on" + ) + + coordinator.navigateFromSearch( + to: .plugins(.configuration("keep-awake")), + target: .plugin(target) + ) + coordinator.navigateFromSearch(to: .about, target: nil) + + XCTAssertEqual(coordinator.destination, .about) + XCTAssertNil(coordinator.searchRevealRequest) + } + + func testGeneralSettingSearchNavigationPublishesExactRevealTarget() throws { + let coordinator = SettingsNavigationCoordinator( + initialDestination: .about + ) + coordinator.presentUnifiedSearch(origin: .keyboard) + + coordinator.navigateFromSearch( + to: .general, + target: .general(.language) + ) + + XCTAssertFalse(coordinator.isUnifiedSearchPresented) + XCTAssertEqual(coordinator.destination, .general) + let request = try XCTUnwrap(coordinator.searchRevealRequest) + XCTAssertEqual(request.target, .general(.language)) + } } diff --git a/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift b/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift index aad8e5ae..db1d7a20 100644 --- a/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift +++ b/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift @@ -175,6 +175,45 @@ final class PluginLocalizationCatalogAuditTests: XCTestCase { XCTAssertTrue(failures.isEmpty, failures.joined(separator: "\n")) } + func testUnifiedSearchLocalizationKeysCoverAllSupportedLanguages() throws { + let localizationDirectory = repositoryRoot + .appending(path: "Sources") + .appending(path: "Resources") + .appending(path: "Localization") + let catalogURL = localizationDirectory.appending(path: "Search.xcstrings") + let catalog = try jsonObject(at: catalogURL) + guard let strings = catalog["strings"] as? [String: [String: Any]] else { + throw AuditError.invalidCatalog(catalogURL.path) + } + + let appDirectory = repositoryRoot.appending(path: "Sources").appending(path: "App") + let sourceNames = [ + "MacToolsSearch.swift", + "SettingsView.swift", + "UnifiedSearchPaletteView.swift", + ] + let keys = try sourceNames.reduce(into: Set()) { result, name in + let source = try String( + contentsOf: appDirectory.appending(path: name), + encoding: .utf8 + ) + result.formUnion(staticLocalizationKeys(in: source).filter { $0.hasPrefix("search.") }) + } + + var failures: [String] = [] + for key in keys.sorted() { + validate( + key: key, + in: strings, + pluginName: "Unified Search", + failures: &failures + ) + } + + XCTAssertFalse(keys.isEmpty, "Unified Search: no static localization keys were discovered") + XCTAssertTrue(failures.isEmpty, failures.joined(separator: "\n")) + } + private func validate( key: String, in catalog: [String: [String: Any]], @@ -233,7 +272,7 @@ final class PluginLocalizationCatalogAuditTests: XCTestCase { private func staticLocalizationKeys(in source: String) -> Set { let expression = try! NSRegularExpression( - pattern: #"(?:\b(?:self\.)?[A-Za-z_]\w*|PluginLocalization\([^\n]*\))\.(?:string|format)\s*\(\s*\"([^\"]+)\"\s*,\s*defaultValue\s*:"# + pattern: #"(?:\b(?:self\.)?[A-Za-z_]\w*|PluginLocalization\([^\n]*\))\.(?:string|format|search|searchFormat)\s*\(\s*\"([^\"]+)\"\s*,\s*defaultValue\s*:"# ) let range = NSRange(source.startIndex..., in: source) return Set(expression.matches(in: source, range: range).compactMap { match in diff --git a/changes/unreleased/plugin-search-discovery.md b/changes/unreleased/plugin-search-discovery.md new file mode 100644 index 00000000..02bd34b5 --- /dev/null +++ b/changes/unreleased/plugin-search-discovery.md @@ -0,0 +1,7 @@ +--- +release: plugin +type: added +area: Plugin SDK +--- + +Display Brightness and Prevent Sleep expose direct setting destinations, while Display Sleep and Lock Screen opt in to safe command discovery. diff --git a/changes/unreleased/unified-search.md b/changes/unreleased/unified-search.md new file mode 100644 index 00000000..3fc457b2 --- /dev/null +++ b/changes/unreleased/unified-search.md @@ -0,0 +1,7 @@ +--- +release: app +type: added +area: Settings +--- + +Press Command-K or use the Plugins sidebar launcher to search app destinations, General settings, plugins, individual plugin settings, and supported commands in one keyboard- and accessibility-friendly palette, with Command-1 through Command-9 for quick result selection. diff --git a/docs/plugins/local-native-plugins.md b/docs/plugins/local-native-plugins.md index c513eb93..29c68ab7 100644 --- a/docs/plugins/local-native-plugins.md +++ b/docs/plugins/local-native-plugins.md @@ -144,6 +144,12 @@ Recommended mapping: Avoid copying a plugin-local settings style enum. If a token is missing, add it to `PluginSettingsTheme` instead of hard-coding the same value in multiple plugins. +### Unified Search + +MacTools automatically indexes a plugin's configuration page, declarative settings cards, permission rows, and shortcut definitions. A custom `PluginConfiguration` can expose individual destinations by conforming to `PluginSettingsSearchProviding`; apply `pluginSettingsSearchAnchor(pluginID:entryID:)` to the matching row so selecting a result scrolls to, highlights, and exposes accessibility focus on that control. + +Commands are never inferred from panel buttons. A plugin must explicitly conform to `PluginCommandProviding` and publish only actions that are safe and useful in the global palette. Commands that need an extra user decision should provide confirmation metadata. Destructive actions should remain in their contextual plugin UI unless their complete safety flow can be represented by that confirmation. + ## Install Location Installed plugins are copied into: From b0c2c6ecc9d904f60c765f5108811d4eb706a4b9 Mon Sep 17 00:00:00 2001 From: xcv58 Date: Mon, 27 Jul 2026 21:00:10 -0400 Subject: [PATCH 05/26] fix(settings): polish unified search presentation --- Sources/App/SettingsView.swift | 7 ++ Sources/App/UnifiedSearchPaletteView.swift | 64 ++++++++++++----- .../Resources/Localization/Plugins.xcstrings | 71 +++++++++++++++++++ Tests/App/MacToolsSearchTests.swift | 19 +++++ .../PluginLocalizationCatalogAuditTests.swift | 1 + changes/unreleased/unified-search.md | 2 +- 6 files changed, 146 insertions(+), 18 deletions(-) diff --git a/Sources/App/SettingsView.swift b/Sources/App/SettingsView.swift index 8a544a32..2765b84a 100644 --- a/Sources/App/SettingsView.swift +++ b/Sources/App/SettingsView.swift @@ -13,6 +13,7 @@ enum GeneralSettingsCardLayout { } struct SettingsView: View { + @Environment(\.accessibilityReduceTransparency) private var accessibilityReduceTransparency @ObservedObject var pluginHost: PluginHost @ObservedObject var navigationCoordinator: SettingsNavigationCoordinator @ObservedObject private var runtimeLocale = PluginRuntimeLocalization.source @@ -63,6 +64,12 @@ struct SettingsView: View { Label(AppL10n.settings("tab.about", defaultValue: "关于"), systemImage: "info.circle") } } + .blur( + radius: navigationCoordinator.isUnifiedSearchPresented + && !accessibilityReduceTransparency + ? 2.5 + : 0 + ) .allowsHitTesting(!navigationCoordinator.isUnifiedSearchPresented) .accessibilityHidden(navigationCoordinator.isUnifiedSearchPresented) diff --git a/Sources/App/UnifiedSearchPaletteView.swift b/Sources/App/UnifiedSearchPaletteView.swift index c5eb9f09..a0cef013 100644 --- a/Sources/App/UnifiedSearchPaletteView.swift +++ b/Sources/App/UnifiedSearchPaletteView.swift @@ -1,38 +1,64 @@ import SwiftUI import MacToolsPluginKit +enum UnifiedSearchPaletteLayout { + static let maximumWidth: CGFloat = 672 + static let minimumWidth: CGFloat = 560 + static let outerHorizontalPadding: CGFloat = 48 + static let maximumResultListHeight: CGFloat = 420 + static let minimumResultListHeight: CGFloat = 260 + static let verticalChromeHeight: CGFloat = 202 + + static func width(for availableWidth: CGFloat) -> CGFloat { + min( + maximumWidth, + max(minimumWidth, availableWidth - outerHorizontalPadding) + ) + } + + static func resultListHeight(for availableHeight: CGFloat) -> CGFloat { + min( + maximumResultListHeight, + max(minimumResultListHeight, availableHeight - verticalChromeHeight) + ) + } +} + struct UnifiedSearchPresentationView: View { + @Environment(\.accessibilityReduceTransparency) private var accessibilityReduceTransparency @ObservedObject var pluginHost: PluginHost @ObservedObject var navigationCoordinator: SettingsNavigationCoordinator var body: some View { - ZStack { - Color.black.opacity(0.16) - .ignoresSafeArea() - .contentShape(Rectangle()) - .onTapGesture { - navigationCoordinator.dismissUnifiedSearch() - } - .accessibilityHidden(true) + GeometryReader { geometry in + ZStack { + Color.black.opacity(accessibilityReduceTransparency ? 0.30 : 0.24) + .ignoresSafeArea() + .contentShape(Rectangle()) + .onTapGesture { + navigationCoordinator.dismissUnifiedSearch() + } + .accessibilityHidden(true) - UnifiedSearchPaletteView( - pluginHost: pluginHost, - navigationCoordinator: navigationCoordinator - ) - .padding(24) + UnifiedSearchPaletteView( + pluginHost: pluginHost, + navigationCoordinator: navigationCoordinator, + availableSize: geometry.size + ) + .padding(24) + } } } } struct UnifiedSearchPaletteView: View { private enum Layout { - static let width: CGFloat = 640 - static let resultListHeight: CGFloat = 390 static let rowCornerRadius: CGFloat = 8 } @ObservedObject var pluginHost: PluginHost @ObservedObject var navigationCoordinator: SettingsNavigationCoordinator + let availableSize: CGSize @State private var query = "" @State private var selectedResultID: String? @State private var pendingConfirmation: MacToolsSearchResult? @@ -49,7 +75,7 @@ struct UnifiedSearchPaletteView: View { footer } .padding(16) - .frame(width: Layout.width) + .frame(width: UnifiedSearchPaletteLayout.width(for: availableSize.width)) .background(.regularMaterial, in: RoundedRectangle(cornerRadius: 14, style: .continuous)) .background { quickSelectionShortcutButtons @@ -229,7 +255,11 @@ struct UnifiedSearchPaletteView: View { } } } - .frame(height: Layout.resultListHeight) + .frame( + height: UnifiedSearchPaletteLayout.resultListHeight( + for: availableSize.height + ) + ) .onChange(of: selectedResultID) { _, resultID in guard let resultID else { return diff --git a/Sources/Resources/Localization/Plugins.xcstrings b/Sources/Resources/Localization/Plugins.xcstrings index 041bf96d..421e1518 100644 --- a/Sources/Resources/Localization/Plugins.xcstrings +++ b/Sources/Resources/Localization/Plugins.xcstrings @@ -7673,6 +7673,77 @@ } } }, + "plugin.marketplace.description": { + "extractionState": "manual", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "ثبّت إضافات MacTools وحدّثها وأدرها." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Installiere, aktualisiere und verwalte MacTools-Plugins." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Install, update, and manage MacTools plugins." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Instala, actualiza y administra plugins de MacTools." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Installez, mettez à jour et gérez les modules MacTools." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "MacToolsプラグインのインストール、アップデート、管理を行います。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "MacTools 플러그인을 설치, 업데이트 및 관리합니다." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Instale, atualize e gerencie plugins do MacTools." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Устанавливайте, обновляйте плагины MacTools и управляйте ими." + } + }, + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "安装、更新和管理 MacTools 插件。" + } + }, + "zh-Hant": { + "stringUnit": { + "state": "translated", + "value": "安裝、更新及管理 MacTools 外掛。" + } + } + } + }, "plugin.marketplace.title": { "extractionState": "manual", "localizations": { diff --git a/Tests/App/MacToolsSearchTests.swift b/Tests/App/MacToolsSearchTests.swift index f268d05e..7246976a 100644 --- a/Tests/App/MacToolsSearchTests.swift +++ b/Tests/App/MacToolsSearchTests.swift @@ -217,6 +217,25 @@ final class MacToolsSearchTests: XCTestCase { ) } + func testPaletteLayoutUsesLargerMaximumSizeAndFitsMinimumSettingsWindow() { + XCTAssertEqual( + UnifiedSearchPaletteLayout.width(for: 720), + 672 + ) + XCTAssertEqual( + UnifiedSearchPaletteLayout.width(for: 1_200), + 672 + ) + XCTAssertEqual( + UnifiedSearchPaletteLayout.resultListHeight(for: 480), + 278 + ) + XCTAssertEqual( + UnifiedSearchPaletteLayout.resultListHeight(for: 800), + 420 + ) + } + func testPluginHostPerformsOnlyDeclaredCommands() { let plugin = SearchableTestPlugin() let host = makePluginHostForTests(plugins: [plugin]) diff --git a/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift b/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift index db1d7a20..1fb87550 100644 --- a/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift +++ b/Tests/Core/Plugins/PluginLocalizationCatalogAuditTests.swift @@ -35,6 +35,7 @@ final class PluginLocalizationCatalogAuditTests: XCTestCase { "plugin.capability.featurePanel", "plugin.capability.settingsOnly", "plugin.capability.unknown", + "plugin.marketplace.description", ] private let pluginLayoutSettingsLocalizationKeys = [ diff --git a/changes/unreleased/unified-search.md b/changes/unreleased/unified-search.md index 3fc457b2..0673ec38 100644 --- a/changes/unreleased/unified-search.md +++ b/changes/unreleased/unified-search.md @@ -4,4 +4,4 @@ type: added area: Settings --- -Press Command-K or use the Plugins sidebar launcher to search app destinations, General settings, plugins, individual plugin settings, and supported commands in one keyboard- and accessibility-friendly palette, with Command-1 through Command-9 for quick result selection. +Press Command-K or use the Plugins sidebar launcher to search app destinations, General settings, plugins, individual plugin settings, and supported commands in one keyboard- and accessibility-friendly palette, with Command-1 through Command-9 for quick result selection and a responsive, dimmed presentation that keeps results prominent. From 7688e72e1025ad937ce34e2967fc26b4f5c66077 Mon Sep 17 00:00:00 2001 From: xcv58 Date: Mon, 27 Jul 2026 22:11:51 -0400 Subject: [PATCH 06/26] docs: add unified search PR screenshots --- .../unified-search/general-setting-en.jpg | Bin 0 -> 53508 bytes .../general-setting-reveal-en.jpg | Bin 0 -> 87811 bytes .../unified-search/mixed-results-en.jpg | Bin 0 -> 59388 bytes docs/pr-assets/unified-search/overview-ar.jpg | Bin 0 -> 56545 bytes docs/pr-assets/unified-search/overview-de.jpg | Bin 0 -> 62501 bytes docs/pr-assets/unified-search/overview-en.jpg | Bin 0 -> 59353 bytes .../unified-search/overview-zh-Hans.jpg | Bin 0 -> 54376 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/pr-assets/unified-search/general-setting-en.jpg create mode 100644 docs/pr-assets/unified-search/general-setting-reveal-en.jpg create mode 100644 docs/pr-assets/unified-search/mixed-results-en.jpg create mode 100644 docs/pr-assets/unified-search/overview-ar.jpg create mode 100644 docs/pr-assets/unified-search/overview-de.jpg create mode 100644 docs/pr-assets/unified-search/overview-en.jpg create mode 100644 docs/pr-assets/unified-search/overview-zh-Hans.jpg diff --git a/docs/pr-assets/unified-search/general-setting-en.jpg b/docs/pr-assets/unified-search/general-setting-en.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5cc191b3d70fd171792450330a5a566c6665b4b8 GIT binary patch literal 53508 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 PKgD(hmni}`_U*_YF|-a* literal 0 HcmV?d00001 diff --git a/docs/pr-assets/unified-search/general-setting-reveal-en.jpg b/docs/pr-assets/unified-search/general-setting-reveal-en.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c073310801640bfaf92064eed422a8c87e68afe GIT binary patch literal 87811 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 literal 0 HcmV?d00001 diff --git a/docs/pr-assets/unified-search/mixed-results-en.jpg b/docs/pr-assets/unified-search/mixed-results-en.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24f071a9d189b5fbcdb7e3c92cef629992d66694 GIT binary patch literal 59388 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 O^$@iwO(OdrBmW0GbLNr& literal 0 HcmV?d00001 diff --git a/docs/pr-assets/unified-search/overview-ar.jpg b/docs/pr-assets/unified-search/overview-ar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9ad4dde30459ca4147bed6791951a3fe5c5484f0 GIT binary patch literal 56545 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 J56kx7{}*@=s|El7 literal 0 HcmV?d00001 diff --git a/docs/pr-assets/unified-search/overview-de.jpg b/docs/pr-assets/unified-search/overview-de.jpg new file mode 100644 index 0000000000000000000000000000000000000000..535c8c448851e31c69a7ff8f6bab1877e66377dd GIT binary patch literal 62501 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 literal 0 HcmV?d00001 diff --git a/docs/pr-assets/unified-search/overview-en.jpg b/docs/pr-assets/unified-search/overview-en.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bb0652b66db6f2067449a545b615c26a74dc724 GIT binary patch literal 59353 zcmeFZ1z1&Gw82mmO8{{X}k zASLHzYXtzRssK9x0GI$I%oaceA&>;11Wy1!NkjRCfljAEf5R7rh&4c1!^X+Y$<@Z` zK0P1TbwF4~Nfi~z0X!~X<_qw0KTX7NG*F7V6omDB^-v}NF^zw!Br9vGp`|XbbW`p^ zDg0Hl`}gmmTm}FKM>iKO1sQsM14DX@WdH*p0d?aBh|J7g?@McF+(h#Hb-m#K`)7af zLU*8#6Upm0`tJb*7M8B&pz#_Y`CSWFa|aME2LRMI^ZPDt0D$fX;u$^N?jzwe5GHm3 z6$D|B1|YWn0kUdX89fS!%__8f%-A|ao#$E9i z2!r$}{N}E*pf3SZ5LR@(r>*o8f7`I_z7yT<`(up_pbaAjO3aP+E8UTS)$(EGVyy zrP5EHP&FSL9X$|_4dN|4Y<1N@7!QOUUG24zx*_@a`Pj%J@fS2M?pjE@m_U4trK5rj z2qSHbvT~6}`UFW|>EH@N7e0Z0v9VP`)&>0o9e1Z_rJ1vkUz}TcD?wj?%w; z6=mtFkJJt6&wUHa8*(5F`T>>L((xA3UJ#GUbl*(|DGRKNDtQ0iMV~?9)hzERAn^VsMj+yrES8vs4v4xV=bC%_J{ z{kmGU3f}!Fkq68G7r+{@1UP?Ue$~*sC~*XTwE-Vs4R8c$Tz}V-xhS;+JV5-}U$97= z?Qh%%p6=k?FO778S@6#Gw>~N$h2;f>CCK-$TAG3N z%ztu0*7~LWKjMF3|DcoxW#9Z+*Zr3Sdi-DY(dE!@pev%wqqCt>qDrEQq22_4rNEOH zRTx#|m#%-%qs^oBpiQF{Lv=AtD#?@ z?~w3M`SKU-YyDfA)`dRyU>p23X6V6)`O&&A$f&tqaDD0e=?^Y$mR@dPj03Vx_q|=srNO6%CB2fPIoCCM-s`-A0DycJA!z_$NAuzt10ntL2kyZH07x_<5Qw@zaLSDU z@Ky*M5^Dayu?hnK0S*AP)tI}xc>LgZ@wh|-M-F_j_fY_}03*N(+QSP70%Cv^AO|P| z>VOVl0Ne&+(*}%l7r+zn1A>82ARKrK!~;n{Dv$x>0!2V6PzBTjAAlC%GtdnT0Ha`} z%mFLFCa@2jKp+qd2rh&OLII(JFhe*XybxiCBt#B!6QTt%fZTytLmVOQ5I@KRNH`=0 zk_34T$%DLw)IdH!+95rVVaOC@39=12MuDPSLLo+>LAi>;jUtR9jiQ30gJObWjpB^r zgYpn13gtOUI!Yl*CCUes&nN>ZlPD`Fdr$z110{uCfpS8Hp|VhQs3Ft}>H-ab!l4P! zbZ9ZO7HsD}=p=L%dW4FON`y*}$_YlRBI+$vb5v*40MrQ7B-C8gO4KIQKGZ4HP1JKV zTr_Gl4m43TB{Y3BYcx-^P_zWJY_tlrX0YGPq3xriqm!bupbLTh&H&vG-4{IqJsG_O z{XKdQ`V9IW1_lNN1_y=&hB}5Bh8spG#tV!>j7E%Jj5&-$OdL!)OkPZROhZgZ%n-~3 z%zVrS%wEg|%oD83Sjr zvB$7?aBy%Ka71u4acpsdaGvA5!D+*p!a2G`c!~Xz>?Pw%?w6u2 zTq#^bTsPb(+&tV*xZ}8octm(ycuIH{c!78?@hb6p@z(LN@R{+Y@o(e%;3wdh;dkM$ zUdFn7^|I_`v&#XOUtX@cJal=FfQW#HK%KyWAc7#Dpq*fm5QFe4p&X$F;X}dBbg+Hl3pcM zBE3f%OuVfSih4irkVMPF_MjKz>X?Pa#KPPw|YRisCyZ zDkVFmCZ#833S~3pDitx67?n8{oT`*+gc^mKomz|9mpX&`3-uliEsX-reVP|EpJ-NT zNol2M?P%j@8)%p4i0CBgZ0X|Y8tInlN$92N@6kV}Z=&D4LVZQ?iu;wJIIXyTFIH$Nsxo&cWa8+@wb2D)pazEp4ms`<9~IruI4Q~19L5DBOXgb92UI1>~SbP+5TToPgu zx+C;TXh@h?SVK5MxJ?92L`Eb~q+aAmR8Z7Sv{ZCMj8n{BEMIICMB1j>`P%zBGCI*ZqqkUZx!?Mzi?3^}o2PrAcSA2mZ&III-(UZ;0i}VhLA4=< zp{`-J;hvG4QM}Qdv4C-?@t_HdiI++HZOYsCZof0dH#IXYyMuN|?@s=mQ!{n5bhEv? zN_St~-87dqPc&b#kg|xgShAF`jIms>lCX-gTC|q1jD?=Fz;w9dP~%AGXz$qMMC;_`)N`NXe(3#4XHn;P=S>$Cmuy#vtBGs1 z8!XjGL(=1=$DyaLXPFm)m!sDgZ+7n|-U~kRK3Tq~zUICk{jT^0`%U>v z`@ar=1l$ey7|0m-FmNtNAt*N(JJ>$BGvsQsq3=dtOTSY8=K-~Wp21s#--e8b zCcjyHTO7VOyfxx6axxk;hBgNOe))UCIQ4k?1lvT(q~PScsT)&YrnRR>XUu0-W?g4b z=N``E&L=F;E#xioF4ix}FLf^)EzhmoUpZL~T_ad~wa&U;z9F^oWmA81Zp&p0u^q8P zv6HjQzx#1dV{d%lVgKX+en@ecdnA0+daQT6aN>E2ar*p>?X31(<$Mg`fI!?gb1}P^ z3qZkN6f1B=zMTUAxCQ_~)D6xbjDD;YFDM{C*0&%G`FSGIe}R9jCy@o<90Di?=k%JZ z;Ou4y0N!K*z*UexzA*r3-~xb-2!O)J_xrr40X4 z&@nKvuyH_wipu~B1PVn#g`%M$lME1lupB@oKqI`uBaKd^X@@_B%%-atn zT0NUge0Ni=_07%&hF3+`RnKvhs?`s_L5BkDr>FTUy)N zJ9_*22L^|}4UbGs&&fJFyRhu< z85Z)tW!Z1T{;+ElT=Jk?98eUnm7q|trBJ~G4Fe5%U|@n%Ebzemd0<~0;FJgl2b}Hv zJP;rg2*?Ahj1K~ivYTxj%AbUiRLuC)Tb-B7z5a0A#thR{jA`Zh_=aI4c@ zh>n5P24m2Bx_#+Mf1km|{qZ#P9`PW&ARZtD`=$C+JHRo{~t7o$3{?-Vf zQT?3c8v<~&Gbzrd+wW;?c~$#0f5FapjAtciRh=$UQlnP5>(9hg2H#7@Lp1jy!*+{@ zPF%GRKx$s&#!O%&-KbBr?+f))+{TtDu#%vzY#5sQYx2zEbrZv7_hGT4&wclTgwLdl z9nS}8vZseVAO|xv7_}!pa9t<^oHg@LR{q)I{~T6^uwe80V+dsB3>SUEx{4MntaH0~ z{KYDU&#o^H)i*{6laavrtTNx;4A@eN|UM ze0f4a{1pY(;wYRGm{zqb1l>qnAaq9WG&|yypnF7sOYHnaxAp$s9LI5A5 z|J?EyVPd+o2Rl1;+RFIZ^q^{B+f%>(e^=tuZ>CYIAl0eO z4-Y$Cc$n3MTGq(8WE?KNCr{V=y79NSk%^C#YhX5jVYHE!pb@xb}_8&u9d%|E} z<3koG5@7;H+u?EoT;d+SlVdY6+1~1_|srLwb6Um;})@ ztO5oN?@#?u#LSknqE|;!0+lqcdxp18!^bH!4fF zQ1kQL9r#``d?$feMn+R@QuxHk1&H>=zaSSSq)?Nlk*0=wnwg*I=;>;7NTXU1v@s+y zG%}pi1&sLYr3Tdt*}AMSb=#5>w5{rtiAn{$7Q9?R5B;?qik7oDUo@+7YE`Is%nzK6Z+C;jC&yFB0=OzY_bpnrt-V z4|hrTp2A#<4+R$BMohfz4*V&0ZQ(=qw6gdevHR|a8B^c6Z#ZGB9B6)1p)O*sFQa+e zR?@E38YI0}qH$QY<@7O$?or9TYuuBK{oH0YcSFaexxUY!J

DIA(bC3w>H$n&0i3 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 literal 0 HcmV?d00001 From 43764fac8b3ff9a9a75dc6f509dd0dd4288cec85 Mon Sep 17 00:00:00 2001 From: xcv58 Date: Mon, 27 Jul 2026 22:20:51 -0400 Subject: [PATCH 07/26] docs: expand unified search screenshots --- .../unified-search/overview-light-en.jpg | Bin 0 -> 64210 bytes .../plugin-options-brightness-light-en.jpg | Bin 0 -> 64072 bytes .../plugin-options-keep-awake-light-en.jpg | Bin 0 -> 62953 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/pr-assets/unified-search/overview-light-en.jpg create mode 100644 docs/pr-assets/unified-search/plugin-options-brightness-light-en.jpg create mode 100644 docs/pr-assets/unified-search/plugin-options-keep-awake-light-en.jpg diff --git a/docs/pr-assets/unified-search/overview-light-en.jpg b/docs/pr-assets/unified-search/overview-light-en.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32df4be89016252ac2662603d97ec322f3d6083d GIT binary patch literal 64210 zcmeFZ2Ut{Fwl2D=iX0^;2`Ul)TbDr1ZOFj@ab37r69}<`JuAByqTu9 zhNALSg=444zgoDuIzmqXfRnSQySCCLwrhq)Z1~FnK0pKd#t%?gSbDh1X=+}@>iqe8 ztpC^7&hWACzyKds*DvENP@rAfdP!g0Q#t^v}NAbr9PjP3`0 z+Scoe9!P`oP$5eXc@Rs07NoCuIO-_>;G0@mTvi2X5GSa+wX?k35B`Ijc8XXTFk7JM z&W`F>?67r9>^zlqL7E<KGH)2U|O3Y+Vo^*o3F8F4#A*xWSN?7RUaBvA_TVSOxN4eI?{ zFD<}&mOr#$YyI^8ul%3f-;#2m?W;fPdi}J(M*g!to&w%wyeoK$c-%OQI5IerI9I`M zS@06T5yKJx>FaNK+<+$r2oW_BU&e}knOFa<{N9cyc_9sa-!hXd3pjB^P` z8q^MI#-YVw1o&`-Ks$0caL}?a$o z8bs6iFQ|R@>&7o^f40i+Hu-7)cZnTf1){F{3;7=&!0y3HVePOcSSPFwRtd1d8evti z53qVH{lmWEar@f*vZj6Pj|12Sf15LGV8(oJU3YBOT*$w$bm8#37EfzmPcX*;c^6kd zcRL$fPc}Jl_ONDCcD6jv%O-F^Km-7=a}ibs05-Lb=NJg>hu^%=NdS;;#9%PBzj-Q+ z08lIn4hhx2d0b)uKtT)u9o3dz?%v<^9Z#3I;K)G^_C5xH1vmq6f$<0cB7h_y3n&08 zfCiuo7y_nXZrXx*?hg0>0l;k_47d+G1fBqiKq`;{Q+K75hRrU5g8-GsTrf?$!bcvw2D z5LN@W^8joL_7%2=gNH+f!-m5LX6qFkJse9MH=H1xD4ax`T$~D=R-6HxX&fXD8kZFJ zBrXrG1gOn#2SgM^oJ7(@x1<@g4~!$vF~vlItX1Bo9b(NZycqBH1J*CFLNM zB{d@TBz-`dN7_O@wNKtUnQ`*N$!%s9W+i4<=4Z?;%wJh( zS!7x4Sst@Auq?4svC6R8u|8&PWL;*XVUuHXWP8fi%7#33^3;`6UZ-B1>OOUFn)9^Y z>5$V!r$3(|IwN-G=9$N5n$IBFS=rUt1K9J~N6!+T6+3HtHsNgh*N2v!Mh2=NG63#ABs6s8hZ6Al+{7CsUY6>%3S6j>5w z7d01679A0z7Sj}q66+Ah6~82o5U&&8lMs>clqiu{m*kUlkbEh*D8(sdEtM%XD}7qp zLi&aDlnk4UxlEeO6#Nw20-g?^kv$`8C7Ug~Ajd6dFZW7r?b3xy?w86h?aE8Y2g<*> z47;p!Ir4J10;PhULZZTi;%P-2#e7AilCaV(r8ie_uc%&$y)vTAtZb>Ar;Jn)RS8sS zRV7i?QB72xxq9xZ`_&pXsG5peoZ7hhS#@XiN)13mStCy4vnHpen`W&Ro|dLolGeQT zMeP9Xb{#4mGo6<@JGz&2V|2 (dAn)S)`uj}XO?;2b-cw{hjjsIHUwfBaMhIWQk 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