diff --git a/prefs/zen-urlbar.yaml b/prefs/zen-urlbar.yaml index b9b0533d4f..2d468c98b8 100644 --- a/prefs/zen-urlbar.yaml +++ b/prefs/zen-urlbar.yaml @@ -27,3 +27,6 @@ - name: zen.urlbar.suggestions.quick-actions value: true + +- name: zen.urlbar.suggestions.quick-actions.advanced + value: false diff --git a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs index 8418e14be3..52a019cb45 100644 --- a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs +++ b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs @@ -6,6 +6,11 @@ function isNotEmptyTab(window) { return !window.gBrowser.selectedTab.hasAttribute('zen-empty-tab'); } +// Returns true if the current tab is pinned, non-empty, and has been changed +function isPinnedTabChanged(tab) { + return tab.hasAttribute('zen-pinned-changed') && !tab.hasAttribute('zen-empty-tab') && tab.pinned; +} + const globalActionsTemplate = [ { label: 'Toggle Compact Mode', @@ -90,6 +95,11 @@ const globalActionsTemplate = [ return isNotEmptyTab(window); }, }, + { + label: 'Reopen Closed Tab', + command: 'History:UndoCloseTab', + icon: 'chrome://browser/skin/zen-icons/open.svg', + }, { label: 'Reload Tab', command: 'Browser:Reload', @@ -153,6 +163,112 @@ const globalActionsTemplate = [ command: 'Tools:Addons', icon: 'chrome://browser/skin/zen-icons/extension.svg', }, + { + label: 'Reset Pinned Tab', + icon: 'chrome://browser/skin/zen-icons/reload.svg', + command: 'cmd_zenPinnedTabReset', + isAvailable: (window) => { + return isPinnedTabChanged(window.gBrowser.selectedTab); + }, + }, + { + label: 'Replace Pinned URL with Current', + icon: 'chrome://browser/skin/zen-icons/pin.svg', + command: (window) => { + window.gZenPinnedTabManager.replacePinnedUrlWithCurrent(window.gBrowser.selectedTab); + }, + isAvailable: (window) => { + return isPinnedTabChanged(window.gBrowser.selectedTab); + }, + }, + { + label: 'Duplicate Tab', + icon: 'chrome://browser/skin/zen-icons/duplicate-tab.svg', + command: (window) => { + window.gBrowser.duplicateTab(window.gBrowser.selectedTab, true); + }, + isAvailable: (window) => { + return isNotEmptyTab(window); + }, + }, + { + label: 'Bookmark Tab', + icon: 'chrome://browser/skin/zen-icons/bookmark-hollow.svg', + command: 'Browser:AddBookmarkAs', + isAvailable: (window) => isNotEmptyTab(window), + }, + ...(Services.prefs.getBoolPref('zen.urlbar.suggestions.quick-actions.advanced', false) + ? [ + { + label: 'Search Bookmarks', + icon: 'chrome://browser/skin/zen-icons/bookmark-star-on-tray.svg', + command: 'Browser:SearchBookmarks', + }, + { + label: 'Copy Current URL Markdown', + icon: 'chrome://browser/skin/zen-icons/edit-copy.svg', + command: 'cmd_zenCopyCurrentURLMarkdown', + isAvailable: (window) => isNotEmptyTab(window), + }, + { + label: 'Create New Workspace', + command: 'cmd_zenOpenWorkspaceCreation', + icon: 'chrome://browser/skin/zen-icons/duplicate-tab.svg', + }, + { + label: 'Delete Current Workspace', + command: 'cmd_zenCtxDeleteWorkspace', + icon: 'chrome://browser/skin/zen-icons/trash.svg', + }, + { + label: 'Split View Vertical', + command: 'cmd_zenSplitViewVertical', + icon: 'chrome://browser/skin/zen-icons/split.svg', + isAvailable: (window) => { + return window.gBrowser.tabs.length > 1 && !(window.gZenViewSplitter.currentView >= 0); + }, + }, + { + label: 'Split View Horizontal', + command: 'cmd_zenSplitViewHorizontal', + icon: 'chrome://browser/skin/zen-icons/split.svg', + isAvailable: (window) => { + return window.gBrowser.tabs.length > 1 && !(window.gZenViewSplitter.currentView >= 0); + }, + }, + { + label: 'Split View Grid', + command: 'cmd_zenSplitViewGrid', + icon: 'chrome://browser/skin/zen-icons/split.svg', + isAvailable: (window) => { + return window.gBrowser.tabs.length > 1 && !(window.gZenViewSplitter.currentView >= 0); + }, + }, + { + label: 'Unsplit Tabs', + command: 'cmd_zenSplitViewUnsplit', + icon: 'chrome://browser/skin/zen-icons/tab.svg', + isAvailable: (window) => window.gZenViewSplitter.splitViewActive, + }, + { + label: 'Unsplit Current Tab', + icon: 'chrome://browser/skin/zen-icons/fullscreen.svg', + command: (window) => { + const container = window.gBrowser.selectedTab.linkedBrowser?.closest( + '.browserSidebarContainer' + ); + window.gZenViewSplitter.removeTabFromSplit(container); + }, + isAvailable: (window) => { + return ( + // This command is hidden if split view has only 2 tabs; just use 'Unsplit Tabs' + window.gZenViewSplitter.splitViewActive && + window.gZenViewSplitter._data[window.gZenViewSplitter.currentView].tabs.length > 2 + ); + }, + }, + ] + : []), ]; export const globalActions = globalActionsTemplate.map((action) => ({