diff --git a/src/_locales/dict.setup-page.ts b/src/_locales/dict.setup-page.ts index 84d9ecd2f..29d279cb3 100644 --- a/src/_locales/dict.setup-page.ts +++ b/src/_locales/dict.setup-page.ts @@ -2340,6 +2340,39 @@ Available variables: %B - a list mark (bullet); %CT - custom title or title; %T zh_TW: '注意:拖曳時按住 Ctrl 將保留書籤', ja: '注:ブックマークの移動は、ドラッグアンドドロップが有効になっている場合にのみ機能します。', }, + 'settings.move_tab_to_panel': { + en: 'Position when dropping tabs to a panel', + de: 'Position beim Ablegen von Tabs auf einem Panel', + fr: 'Position lors du dépôt des onglets sur un panneau', + hu: 'Pozíció a lapok panelre való ejtésekor', + pl: 'Pozycja przy upuszczaniu kart do panelu', + ru: 'Позиция при перетаскивании вкладок на панель', + zh_CN: '将标签页拖放到面板时的位置', + zh_TW: '將分頁拖放到面板時的位置', + ja: 'タブをパネルにドロップしたときの位置', + }, + 'settings.move_tab_to_panel_start': { + en: 'Panel start', + de: 'Panel-Anfang', + fr: 'Début du panneau', + hu: 'Panel eleje', + pl: 'Początek panelu', + ru: 'Начало панели', + zh_CN: '面板开头', + zh_TW: '面板開頭', + ja: 'パネルの先頭', + }, + 'settings.move_tab_to_panel_end': { + en: 'Panel end', + de: 'Panel-Ende', + fr: 'Fin du panneau', + hu: 'Panel vége', + pl: 'Koniec panelu', + ru: 'Конец панели', + zh_CN: '面板末尾', + zh_TW: '面板末尾', + ja: 'パネルの最後', + }, // - Search; 'settings.search_title': { diff --git a/src/defaults/settings.ts b/src/defaults/settings.ts index 0b0e21975..db096b31b 100644 --- a/src/defaults/settings.ts +++ b/src/defaults/settings.ts @@ -60,6 +60,7 @@ export const DEFAULT_SETTINGS: SettingsState = { dndActSearchTab: true, dndMoveTabs: false, dndMoveBookmarks: false, + moveTabToPanel: 'end', // Search searchBarMode: 'dynamic', @@ -349,6 +350,7 @@ export const SETTINGS_OPTIONS = { dndExp: ['pointer', 'hover', 'none'], dndExpMod: ['alt', 'shift', 'ctrl', 'none'], dndOutside: ['win', 'data'], + moveTabToPanel: ['start', 'end'], animationSpeed: ['fast', 'norm', 'slow'], treeRmOutdent: ['branch', 'first_child'], colorizeTabsSrc: ['domain', 'container'], diff --git a/src/page.setup/components/settings.dnd.vue b/src/page.setup/components/settings.dnd.vue index bdd89aa26..a5fe1c6b0 100644 --- a/src/page.setup/components/settings.dnd.vue +++ b/src/page.setup/components/settings.dnd.vue @@ -56,6 +56,12 @@ section(ref="el") label="settings.dnd_act_search_tab" v-model:value="Settings.state.dndActSearchTab" @update:value="Settings.saveDebounced(150)") + SelectField( + label="settings.move_tab_to_panel" + optLabel="settings.move_tab_to_panel_" + v-model:value="Settings.state.moveTabToPanel" + :opts="Settings.getOpts('moveTabToPanel')" + @update:value="Settings.saveDebounced(150)") ToggleField( label="settings.dnd_move_tabs" :note="translate('settings.dnd_move_tabs_note')" diff --git a/src/services/drag-and-drop.actions.ts b/src/services/drag-and-drop.actions.ts index 42384639a..b3bcdc343 100644 --- a/src/services/drag-and-drop.actions.ts +++ b/src/services/drag-and-drop.actions.ts @@ -263,7 +263,10 @@ function getDstIndexInside(dstType: DropType, dst: DstPlaceInfo): number { const branchLen = Tabs.getBranchLen(parent.id) ?? 0 return parent.index + branchLen + 1 } else { - return dstPanel.nextTabIndex ?? Tabs.list.length + // Use the setting to determine whether to drop at start or end + return Settings.state.moveTabToPanel === 'start' + ? dstPanel.startTabIndex + : (dstPanel.nextTabIndex ?? Tabs.list.length) } } // To the last position in bookmarks children list diff --git a/src/types/settings.ts b/src/types/settings.ts index e5acef1ac..fa6459f52 100644 --- a/src/types/settings.ts +++ b/src/types/settings.ts @@ -59,6 +59,7 @@ export interface SettingsState { dndActSearchTab: boolean dndMoveTabs: boolean dndMoveBookmarks: boolean + moveTabToPanel: (typeof SETTINGS_OPTIONS.moveTabToPanel)[number] // Search searchBarMode: (typeof SETTINGS_OPTIONS.searchBarMode)[number]