From e69b10ecbb9dd3fb47bd6fec2cee1aa7356bff53 Mon Sep 17 00:00:00 2001 From: Fernando Bunn Date: Thu, 17 Oct 2024 19:40:01 +0100 Subject: [PATCH 1/9] WIP: AI Chat Toolbar --- DuckDuckGo/Common/Localizables/UserText.swift | 3 +++ DuckDuckGo/Menus/MainMenu.swift | 4 +++ DuckDuckGo/Menus/MainMenuActions.swift | 4 +++ DuckDuckGo/NavigationBar/PinningManager.swift | 4 +++ .../View/NavigationBarViewController.swift | 27 +++++++++++++++++++ 5 files changed, 42 insertions(+) diff --git a/DuckDuckGo/Common/Localizables/UserText.swift b/DuckDuckGo/Common/Localizables/UserText.swift index 7b33cf1bd9..68c8b5d1fc 100644 --- a/DuckDuckGo/Common/Localizables/UserText.swift +++ b/DuckDuckGo/Common/Localizables/UserText.swift @@ -978,6 +978,9 @@ struct UserText { static let bitwardenCommunicationInfo = NSLocalizedString("bitwarden.connect.communication-info", value: "All communication between Bitwarden and DuckDuckGo is encrypted and the data never leaves your device.", comment: "Warns users that all communication between the DuckDuckGo browser and the password manager Bitwarden is encrypted and doesn't leave the user device") static let bitwardenHistoryInfo = NSLocalizedString("bitwarden.connect.history-info", value: "Bitwarden will have access to your browsing history.", comment: "Warn users that the password Manager Bitwarden will have access to their browsing history") + static let showAIChatShortcut = NSLocalizedString("pinning.show-aichat-shortcut", value: "Show AI Chat Shortcut", comment: "Menu item for showing the AI Chat shortcut") + static let hideAIChatShortcut = NSLocalizedString("pinning.hide-aichat-shortcut", value: "Hide AI Chat Shortcut", comment: "Menu item for hiding the AI Chat shortcut") + static let showAutofillShortcut = NSLocalizedString("pinning.show-autofill-shortcut", value: "Show Passwords Shortcut", comment: "Menu item for showing the passwords shortcut") static let hideAutofillShortcut = NSLocalizedString("pinning.hide-autofill-shortcut", value: "Hide Passwords Shortcut", comment: "Menu item for hiding the passwords shortcut") diff --git a/DuckDuckGo/Menus/MainMenu.swift b/DuckDuckGo/Menus/MainMenu.swift index 6a5f42e49a..f44fdbdd0b 100644 --- a/DuckDuckGo/Menus/MainMenu.swift +++ b/DuckDuckGo/Menus/MainMenu.swift @@ -85,6 +85,8 @@ final class MainMenu: NSMenu { var aiChatMenu = NSMenuItem(title: UserText.newAIChatMenuItem, action: #selector(AppDelegate.newAIChat), keyEquivalent: [.option, .command, "n"]) let toggleNetworkProtectionShortcutMenuItem = NSMenuItem(title: UserText.showNetworkProtectionShortcut, action: #selector(MainViewController.toggleNetworkProtectionShortcut), keyEquivalent: "N") + let toggleAIChatShortcutMenuItem = NSMenuItem(title: UserText.showAIChatShortcut, action: #selector(MainViewController.toggleAIChatShortcut), keyEquivalent: "L") + // MARK: Window let windowsMenu = NSMenu(title: UserText.mainMenuWindow) @@ -276,6 +278,8 @@ final class MainMenu: NSMenu { toggleNetworkProtectionShortcutMenuItem + toggleAIChatShortcutMenuItem + NSMenuItem.separator() toggleFullscreenMenuItem diff --git a/DuckDuckGo/Menus/MainMenuActions.swift b/DuckDuckGo/Menus/MainMenuActions.swift index 2b5f8d0d17..87e8af2c5a 100644 --- a/DuckDuckGo/Menus/MainMenuActions.swift +++ b/DuckDuckGo/Menus/MainMenuActions.swift @@ -510,6 +510,10 @@ extension MainViewController { LocalPinningManager.shared.togglePinning(for: .networkProtection) } + @objc func toggleAIChatShortcut(_ sender: Any) { + LocalPinningManager.shared.togglePinning(for: .aiChat) + } + // MARK: - History @objc func back(_ sender: Any?) { diff --git a/DuckDuckGo/NavigationBar/PinningManager.swift b/DuckDuckGo/NavigationBar/PinningManager.swift index 37eceb098c..01858412b0 100644 --- a/DuckDuckGo/NavigationBar/PinningManager.swift +++ b/DuckDuckGo/NavigationBar/PinningManager.swift @@ -25,6 +25,7 @@ enum PinnableView: String { case downloads case homeButton case networkProtection + case aiChat } protocol PinningManager { @@ -112,6 +113,9 @@ final class LocalPinningManager: PinningManager { case .homeButton: return "" case .networkProtection: return isPinned(.networkProtection) ? UserText.hideNetworkProtectionShortcut : UserText.showNetworkProtectionShortcut + case .aiChat: + return isPinned(.aiChat) ? UserText.hideAIChatShortcut : UserText.showAIChatShortcut + } } diff --git a/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift b/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift index 34dbc05f58..a6c313c92a 100644 --- a/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift +++ b/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift @@ -365,6 +365,8 @@ final class NavigationBarViewController: NSViewController { self.updateHomeButton() case .networkProtection: self.networkProtectionButtonModel.updateVisibility() + case .aiChat: + self.updateAIChatButton() } } else { assertionFailure("Failed to get changed pinned view type") @@ -873,6 +875,21 @@ final class NavigationBarViewController: NSViewController { } } + private func updateAIChatButton() { + let menu = NSMenu() + let title = LocalPinningManager.shared.shortcutTitle(for: .aiChat) + menu.addItem(withTitle: title, action: #selector(toggleAIChatPanelPinning(_:)), keyEquivalent: "") + + bookmarkListButton.menu = menu + bookmarkListButton.toolTip = UserText.bookmarksShortcutTooltip + + if LocalPinningManager.shared.isPinned(.bookmarks) { + bookmarkListButton.isHidden = false + } else { + bookmarkListButton.isHidden = !popovers.bookmarkListPopoverShown + } + } + private func subscribeToCredentialsToSave() { credentialsToSaveCancellable = tabCollectionViewModel.selectedTabViewModel?.tab.autofillDataToSavePublisher .receive(on: DispatchQueue.main) @@ -965,6 +982,11 @@ extension NavigationBarViewController: NSMenuDelegate { let networkProtectionTitle = LocalPinningManager.shared.shortcutTitle(for: .networkProtection) menu.addItem(withTitle: networkProtectionTitle, action: #selector(toggleNetworkProtectionPanelPinning), keyEquivalent: "") } + +#warning("TODO Feature flag") + let aiChatTitle = LocalPinningManager.shared.shortcutTitle(for: .aiChat) + menu.addItem(withTitle: aiChatTitle, action: #selector(toggleAIChatPanelPinning), keyEquivalent: "L") + } @objc @@ -982,6 +1004,11 @@ extension NavigationBarViewController: NSMenuDelegate { LocalPinningManager.shared.togglePinning(for: .downloads) } + @objc + private func toggleAIChatPanelPinning(_ sender: NSMenuItem) { + LocalPinningManager.shared.togglePinning(for: .aiChat) + } + @objc private func toggleNetworkProtectionPanelPinning(_ sender: NSMenuItem) { LocalPinningManager.shared.togglePinning(for: .networkProtection) From 35da3a19e705c0c84c282d185005838ef3dbf6e2 Mon Sep 17 00:00:00 2001 From: Fernando Bunn Date: Fri, 18 Oct 2024 14:15:36 +0100 Subject: [PATCH 2/9] AI Chat button --- .../View/NavigationBar.storyboard | 42 ++++++++++++++++--- .../View/NavigationBarViewController.swift | 17 +++++--- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard b/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard index b4c3b61cc1..2dbc9c21a8 100644 --- a/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard +++ b/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard @@ -1,7 +1,7 @@ - + - + @@ -174,9 +174,9 @@ - +