Skip to content

Commit 06c3db4

Browse files
committed
feat: duplicate tab as a child
(resolves #1480)
1 parent 192493d commit 06c3db4

File tree

4 files changed

+25
-14
lines changed

4 files changed

+25
-14
lines changed

src/_locales/dict.setup-page.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3374,6 +3374,13 @@ Beispiele: "*", "ctrl+$", "ctrl+alt+g"`,
33743374
zh_CN: '复制',
33753375
zh_TW: '複製',
33763376
},
3377+
'settings.tab_action_dup_child': {
3378+
en: 'duplicate as a child',
3379+
ru: 'дублировать как дочернюю вкладку',
3380+
de: 'Als untergeordneten Tab duplizieren',
3381+
zh_CN: '复制为子选项卡',
3382+
zh_TW: '複製為子選項卡',
3383+
},
33773384
'settings.tab_action_pin': {
33783385
en: 'pin',
33793386
ru: 'закрепить',

src/defaults/settings.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -257,14 +257,14 @@ export const SETTINGS_OPTIONS = {
257257
hScrollAction: ['switch_panels', 'switch_act_tabs', 'none'],
258258
scrollThroughTabs: ['panel', 'global', 'psp', 'psg', 'none'],
259259
discardFoldedDelayUnit: ['sec', 'min'],
260-
tabDoubleClick: ['reload', 'duplicate', 'pin', 'mute', 'clear_cookies', 'exp', 'new_after',
261-
'new_child', 'close', 'edit_title', 'none'],
262-
tabLongLeftClick: ['reload', 'duplicate', 'pin', 'mute', 'clear_cookies', 'new_after',
260+
tabDoubleClick: ['reload', 'duplicate', 'dup_child', 'pin', 'mute', 'clear_cookies', 'exp',
261+
'new_after', 'new_child', 'close', 'edit_title', 'none'],
262+
tabLongLeftClick: ['reload', 'duplicate', 'dup_child', 'pin', 'mute', 'clear_cookies', 'new_after',
263263
'new_child', 'edit_title', 'none'],
264-
tabLongRightClick: ['reload', 'duplicate', 'pin', 'mute', 'clear_cookies', 'new_after',
264+
tabLongRightClick: ['reload', 'duplicate', 'dup_child', 'pin', 'mute', 'clear_cookies', 'new_after',
265265
'new_child', 'edit_title', 'none'],
266-
tabMiddleClick: ['close', 'discard', 'duplicate', 'none'],
267-
tabMiddleClickModifier: ['discard', 'duplicate', 'edit_title', 'none'],
266+
tabMiddleClick: ['close', 'discard', 'duplicate', 'dup_child', 'none'],
267+
tabMiddleClickModifier: ['discard', 'duplicate', 'dup_child', 'edit_title', 'none'],
268268
tabCloseMiddleClick: ['close', 'discard'],
269269
tabsPanelLeftClickAction: ['prev', 'expand', 'parent', 'tab', 'none'],
270270
tabsPanelDoubleClickAction: ['collapse', 'tab', 'undo', 'none'],

src/services/tabs.fg.actions.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,16 +1195,11 @@ export function repinTabs(tabIds: ID[]): void {
11951195
/**
11961196
* Duplicate tabs
11971197
*/
1198-
export async function duplicateTabs(tabIds: ID[]): Promise<void> {
1198+
export async function duplicateTabs(tabIds: ID[], asChild?: boolean): Promise<void> {
11991199
const active = tabIds.length === 1
12001200

12011201
// Sort tab ids
1202-
tabIds.sort((aId, bId) => {
1203-
const aTab = Tabs.byId[aId]
1204-
const bTab = Tabs.byId[bId]
1205-
if (!aTab || !bTab) return 0
1206-
return aTab.index - bTab.index
1207-
})
1202+
Tabs.sortTabIds(tabIds)
12081203

12091204
const processed: ID[] = []
12101205

@@ -1251,7 +1246,7 @@ export async function duplicateTabs(tabIds: ID[]): Promise<void> {
12511246
}
12521247

12531248
const oldNewIds: Record<ID, ID> = {}
1254-
Tabs.setNewTabPosition(index, tab.parentId, dstPanelId)
1249+
Tabs.setNewTabPosition(index, asChild ? tab.id : tab.parentId, dstPanelId)
12551250
const dupTab = await browser.tabs.duplicate(tabId, { active, index })
12561251
oldNewIds[tabId] = dupTab.id
12571252

src/sidebar/components/tab.vue

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ function onMouseDown(e: MouseEvent): void {
221221
} else if (Settings.state.tabMiddleClickCtrl === 'duplicate') {
222222
Tabs.duplicateTabs([tab.id])
223223
return
224+
} else if (Settings.state.tabMiddleClickCtrl === 'dup_child') {
225+
Tabs.duplicateTabs([tab.id], true)
226+
return
224227
} else if (Settings.state.tabMiddleClickCtrl === 'edit_title') {
225228
Tabs.editTabTitle([tab.id])
226229
return
@@ -234,6 +237,9 @@ function onMouseDown(e: MouseEvent): void {
234237
} else if (Settings.state.tabMiddleClickShift === 'duplicate') {
235238
Tabs.duplicateTabs([tab.id])
236239
return
240+
} else if (Settings.state.tabMiddleClickShift === 'dup_child') {
241+
Tabs.duplicateTabs([tab.id], true)
242+
return
237243
} else if (Settings.state.tabMiddleClickShift === 'edit_title') {
238244
Tabs.editTabTitle([tab.id])
239245
return
@@ -249,6 +255,8 @@ function onMouseDown(e: MouseEvent): void {
249255
Tabs.discardTabs(selectedTabs)
250256
} else if (Settings.state.tabMiddleClick === 'duplicate') {
251257
Tabs.duplicateTabs([tab.id])
258+
} else if (Settings.state.tabMiddleClick === 'dup_child') {
259+
Tabs.duplicateTabs([tab.id], true)
252260
}
253261
}
254262
}
@@ -367,6 +375,7 @@ function onDoubleClick(): void {
367375
const dc = Settings.state.tabDoubleClick
368376
if (dc === 'reload') Tabs.reloadTabs([tab.id])
369377
if (dc === 'duplicate') Tabs.duplicateTabs([tab.id])
378+
if (dc === 'dup_child') Tabs.duplicateTabs([tab.id], true)
370379
if (dc === 'pin') Tabs.repinTabs([tab.id])
371380
if (dc === 'mute') Tabs.remuteTabs([tab.id])
372381
if (dc === 'clear_cookies') Tabs.clearTabsCookies([tab.id])

0 commit comments

Comments
 (0)