From 79a0e95bac1f7e17c7ae1648f216a435d935b211 Mon Sep 17 00:00:00 2001 From: ara-hwang <10295290+ara-hwang@users.noreply.github.com> Date: Thu, 8 Oct 2026 08:34:20 +0000 Subject: [PATCH] feature: add option to show launcher tabs vertically Add `Preferences > Appearance > Show tabs vertically`. When enabled, the page tabs in the titlebar are hidden and shown as a vertical list on the left side of the main window instead. - The vertical tab bar supports the same features as the horizontal one (bookmark, dirty state, close button, middle-click to close, drag to reorder and the context menu). In vertical mode the context menu says `Close Tabs Below` instead of `Close Tabs to the Right`. - The shared tab behaviors are moved from `LauncherTabBar` into `LauncherTabBarBase` without logic changes, so both tab bars use the same implementation. - The vertical tab bar can be resized with a `GridSplitter` (the same way as the repository sidebar) and its width is persisted in layout. - Add translations of the new strings for all supported locales. --- src/Resources/Locales/de_DE.axaml | 2 + src/Resources/Locales/el_GR.axaml | 2 + src/Resources/Locales/en_US.axaml | 2 + src/Resources/Locales/es_ES.axaml | 2 + src/Resources/Locales/fr_FR.axaml | 2 + src/Resources/Locales/he_IL.axaml | 2 + src/Resources/Locales/id_ID.axaml | 2 + src/Resources/Locales/it_IT.axaml | 2 + src/Resources/Locales/ja_JP.axaml | 2 + src/Resources/Locales/ko_KR.axaml | 2 + src/Resources/Locales/pt_BR.axaml | 2 + src/Resources/Locales/ru_RU.axaml | 2 + src/Resources/Locales/ta_IN.axaml | 2 + src/Resources/Locales/uk_UA.axaml | 2 + src/Resources/Locales/zh_CN.axaml | 2 + src/Resources/Locales/zh_TW.axaml | 2 + src/ViewModels/LayoutInfo.cs | 6 + src/ViewModels/Preferences.cs | 7 + src/Views/Launcher.axaml | 42 ++++- src/Views/Launcher.axaml.cs | 61 ++++++ src/Views/LauncherTabBar.axaml.cs | 206 +------------------- src/Views/LauncherTabBarBase.cs | 218 ++++++++++++++++++++++ src/Views/LauncherVerticalTabBar.axaml | 155 +++++++++++++++ src/Views/LauncherVerticalTabBar.axaml.cs | 20 ++ src/Views/Preferences.axaml | 9 +- 25 files changed, 541 insertions(+), 215 deletions(-) create mode 100644 src/Views/LauncherTabBarBase.cs create mode 100644 src/Views/LauncherVerticalTabBar.axaml create mode 100644 src/Views/LauncherVerticalTabBar.axaml.cs diff --git a/src/Resources/Locales/de_DE.axaml b/src/Resources/Locales/de_DE.axaml index 9e2d348bc8..1575e9e825 100644 --- a/src/Resources/Locales/de_DE.axaml +++ b/src/Resources/Locales/de_DE.axaml @@ -624,6 +624,7 @@ $1, $2, … Werte der Eingabe-Steuerelemente Optional. Neue Registerkarte erstellen Registerkarte schließen + Registerkarten darunter schließen Andere Registerkarten schließen Registerkarten zur Rechten schließen Kopiere Repository-Pfad @@ -663,6 +664,7 @@ $1, $2, … Werte der Eingabe-Steuerelemente Bildlaufleisten automatisch ausblenden Fixe Tab-Breite in Titelleiste verwenden Nativen Fensterrahmen verwenden + Tabs vertikal anzeigen DIFF- / MERGE-TOOL Argumente für Diff Verfügbare Variablen: $LOCAL, $REMOTE diff --git a/src/Resources/Locales/el_GR.axaml b/src/Resources/Locales/el_GR.axaml index 8e5e5f4dfe..e7b0fb3398 100644 --- a/src/Resources/Locales/el_GR.axaml +++ b/src/Resources/Locales/el_GR.axaml @@ -623,6 +623,7 @@ Προαιρετικό. Δημιουργία νέας καρτέλας Κλείσιμο καρτέλας + Κλείσιμο καρτελών από κάτω Κλείσιμο άλλων καρτελών Κλείσιμο καρτελών στα δεξιά Αντιγραφή διαδρομής αποθετηρίου @@ -662,6 +663,7 @@ Χρήση μπαρών κύλισης αυτόματης απόκρυψης Χρήση σταθερού πλάτους καρτελών στη γραμμή τίτλου Χρήση εγγενούς πλαισίου παραθύρου + Εμφάνιση καρτελών κάθετα ΕΡΓΑΛΕΙΟ DIFF/MERGE Ορίσματα Diff Διαθέσιμες μεταβλητές: $LOCAL, $REMOTE diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml index 76ac9e4dcb..93465d3be9 100644 --- a/src/Resources/Locales/en_US.axaml +++ b/src/Resources/Locales/en_US.axaml @@ -644,6 +644,7 @@ Optional. Create New Tab Close Tab + Close Tabs Below Close Other Tabs Close Tabs to the Right Copy Repository Path @@ -685,6 +686,7 @@ Use auto-hide scrollbars Use fixed tab width in titlebar Use native window frame + Show tabs vertically DIFF/MERGE TOOL Diff Arguments Available variables: $LOCAL, $REMOTE diff --git a/src/Resources/Locales/es_ES.axaml b/src/Resources/Locales/es_ES.axaml index e5a8c77e75..848aa27be0 100644 --- a/src/Resources/Locales/es_ES.axaml +++ b/src/Resources/Locales/es_ES.axaml @@ -648,6 +648,7 @@ Opcional. Crear Nueva Página Cerrar Pestaña + Cerrar Pestañas de Abajo Cerrar Otras Pestañas Cerrar Pestañas a la Derecha Copiar Ruta del Repositorio @@ -689,6 +690,7 @@ Usar barras de desplazamiento que se oculten automáticamente Usar ancho de pestaña fijo en la barra de título Usar marco de ventana nativo + Mostrar pestañas verticalmente HERRAMIENTA DIFF/MERGE Argumentos para Diff Variables disponibles: $LOCAL, $REMOTE diff --git a/src/Resources/Locales/fr_FR.axaml b/src/Resources/Locales/fr_FR.axaml index e6b46a1e27..585431c09e 100644 --- a/src/Resources/Locales/fr_FR.axaml +++ b/src/Resources/Locales/fr_FR.axaml @@ -592,6 +592,7 @@ Optionnel. Créer un nouvel onglet Fermer l'onglet + Fermer les onglets en dessous Fermer les autres onglets Fermer les onglets à droite Copier le chemin vers le dépôt @@ -631,6 +632,7 @@ Utiliser les barres de défilement masquées automatiquement Utiliser des onglets de taille fixe dans la barre de titre Utiliser un cadre de fenêtre natif + Afficher les onglets verticalement OUTIL DIFF/MERGE Arguments de diff Variables disponibles : $LOCAL, $REMOTE diff --git a/src/Resources/Locales/he_IL.axaml b/src/Resources/Locales/he_IL.axaml index 98426b3023..b19ed648a4 100644 --- a/src/Resources/Locales/he_IL.axaml +++ b/src/Resources/Locales/he_IL.axaml @@ -592,6 +592,7 @@ לא חובה. צור לשונית חדשה סגור לשונית + סגור לשוניות מתחת סגור לשוניות אחרות סגור לשוניות מימין העתק נתיב המאגר @@ -631,6 +632,7 @@ שימוש בפסי גלילה המוסתרים אוטומטית רוחב לשונית קבוע בשורת הכותרת שימוש במסגרת חלון מקומית + הצג לשוניות אנכית כלי DIFF/MERGE ארגומנטים ל־Diff משתנים זמינים: $LOCAL, $REMOTE diff --git a/src/Resources/Locales/id_ID.axaml b/src/Resources/Locales/id_ID.axaml index a50be71a66..78699ce927 100644 --- a/src/Resources/Locales/id_ID.axaml +++ b/src/Resources/Locales/id_ID.axaml @@ -624,6 +624,7 @@ Opsional. Buat Tab Baru Tutup Tab + Tutup Tab di Bawah Tutup Tab Lain Tutup Tab di Kanan Salin Jalur Repositori @@ -664,6 +665,7 @@ Gunakan scrollbar auto-hide Gunakan lebar tab tetap di titlebar Gunakan frame window native + Tampilkan tab secara vertikal DIFF/MERGE TOOL Argumen Diff Variabel tersedia: $LOCAL, $REMOTE diff --git a/src/Resources/Locales/it_IT.axaml b/src/Resources/Locales/it_IT.axaml index 3ce0bae2c9..9cb3a85a19 100644 --- a/src/Resources/Locales/it_IT.axaml +++ b/src/Resources/Locales/it_IT.axaml @@ -545,6 +545,7 @@ ${pure_files:N} Come ${files:N}, ma senza cartelle Opzionale. Crea Nuova Pagina Chiudi Tab + Chiudi i Tab Sotto Chiudi Altri Tab Chiudi i Tab a Destra Copia Percorso Repository @@ -581,6 +582,7 @@ ${pure_files:N} Come ${files:N}, ma senza cartelle Usa barre di scorrimento a scomparsa automatica Usa larghezza fissa per i tab nella barra del titolo Usa cornice finestra nativa + Mostra i tab verticalmente STRUMENTO DI DIFFERENZA/UNIONE Argomenti Diff Variabili disponibili: $LOCAL, $REMOTE diff --git a/src/Resources/Locales/ja_JP.axaml b/src/Resources/Locales/ja_JP.axaml index ac9637eea9..e998dd2b35 100644 --- a/src/Resources/Locales/ja_JP.axaml +++ b/src/Resources/Locales/ja_JP.axaml @@ -638,6 +638,7 @@ 省略可能 新しいタブを作成 タブを閉じる + 下のタブを閉じる 他のタブを閉じる 右側のタブを閉じる リポジトリへのパスをコピー @@ -679,6 +680,7 @@ 自動的にスクロールバーを隠す タイトルバーに固定タブ幅を使用 ネイティブなウィンドウフレームを使用 + タブを縦に表示 差分/マージツール 差分時の引数 利用できる変数: $LOCAL, $REMOTE diff --git a/src/Resources/Locales/ko_KR.axaml b/src/Resources/Locales/ko_KR.axaml index e0695553fb..68691b79a3 100644 --- a/src/Resources/Locales/ko_KR.axaml +++ b/src/Resources/Locales/ko_KR.axaml @@ -595,6 +595,7 @@ 선택 사항. 새 탭 만들기 탭 닫기 + 아래쪽 탭 닫기 다른 탭 닫기 오른쪽 탭 닫기 저장소 경로 복사 @@ -634,6 +635,7 @@ 스크롤바 자동 숨기기 사용 제목 표시줄에서 고정 탭 너비 사용 네이티브 윈도우 프레임 사용 + 탭을 세로로 표시 DIFF/MERGE 도구 비교 인수 사용 가능한 변수: $LOCAL, $REMOTE diff --git a/src/Resources/Locales/pt_BR.axaml b/src/Resources/Locales/pt_BR.axaml index 5084f0180b..3cae922c20 100644 --- a/src/Resources/Locales/pt_BR.axaml +++ b/src/Resources/Locales/pt_BR.axaml @@ -377,6 +377,7 @@ Opcional. Criar Nova Página Fechar Aba + Fechar Abas Abaixo Fechar Outras Abas Fechar Abas à Direita Copiar Caminho do Repositório @@ -408,6 +409,7 @@ Substituições de Tema Usar largura fixa de aba na barra de título Usar moldura de janela nativa + Exibir abas verticalmente FERRAMENTA DE DIFF/MERGE Caminho de Instalação Insira o caminho para a ferramenta de diff/merge diff --git a/src/Resources/Locales/ru_RU.axaml b/src/Resources/Locales/ru_RU.axaml index 596df60287..da65eb7ebb 100644 --- a/src/Resources/Locales/ru_RU.axaml +++ b/src/Resources/Locales/ru_RU.axaml @@ -648,6 +648,7 @@ Необязательно. Создать новую вкладку Закрыть вкладку + Закрыть вкладки ниже Закрыть другие вкладки Закрыть вкладки справа Копировать путь репозитория @@ -689,6 +690,7 @@ Автоматически скрывать прокрутку Использовать фиксированную ширину табуляции в строке заголовка. Использовать системное окно + Показывать вкладки вертикально ИНСТРУМЕНТ СРАВНЕНИЙ/СЛИЯНИЯ Аргументы сравнения Доступны переменные: $LOCAL, $REMOTE diff --git a/src/Resources/Locales/ta_IN.axaml b/src/Resources/Locales/ta_IN.axaml index 3473ff1cab..a118a29dfd 100644 --- a/src/Resources/Locales/ta_IN.axaml +++ b/src/Resources/Locales/ta_IN.axaml @@ -372,6 +372,7 @@ விருப்பத்தேர்வு. புதிய பக்கத்தை உருவாக்கு மூடு தாவல் + கீழே உள்ள தாவல்களை மூடு பிற தாவல்களை மூடு வலதுபுறத்தில் உள்ள தாவல்களை மூடு களஞ்சிய பாதை நகலெடு @@ -404,6 +405,7 @@ கருப்பொருள் மேலெழுதப்படுகிறது தலைப்புப்பட்டியில் நிலையான தாவல் அகலத்தைப் பயன்படுத்து சொந்த சாளர சட்டத்தைப் பயன்படுத்து + தாவல்களை செங்குத்தாகக் காட்டு வேறு/ஒன்றிணை கருவி நிறுவல் பாதை வேறு/ஒன்றிணை கருவிக்கான பாதை உள்ளிடு diff --git a/src/Resources/Locales/uk_UA.axaml b/src/Resources/Locales/uk_UA.axaml index 5f44193e39..31cb8f5605 100644 --- a/src/Resources/Locales/uk_UA.axaml +++ b/src/Resources/Locales/uk_UA.axaml @@ -376,6 +376,7 @@ Необов'язково. Створити нову вкладку Закрити вкладку + Закрити вкладки нижче Закрити інші вкладки Закрити вкладки праворуч Копіювати шлях до сховища @@ -408,6 +409,7 @@ Перевизначення теми Використовувати фіксовану ширину вкладки в заголовку Використовувати системну рамку вікна + Показувати вкладки вертикально ІНСТРУМЕНТ DIFF/MERGE Шлях встановлення Введіть шлях до інструменту diff/merge diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml index d24f14b1e8..1e5e0e14ab 100644 --- a/src/Resources/Locales/zh_CN.axaml +++ b/src/Resources/Locales/zh_CN.axaml @@ -648,6 +648,7 @@ 选填。 新建空白页 关闭标签页 + 关闭下方标签页 关闭其他标签页 关闭右侧标签页 复制仓库路径 @@ -689,6 +690,7 @@ 允许滚动条自动隐藏 主标签使用固定宽度 使用系统默认窗体样式 + 主标签垂直显示 对比/合并工具 对比命令参数 可用参数:$LOCAL, $REMOTE diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml index 97680c6103..e4b358d090 100644 --- a/src/Resources/Locales/zh_TW.axaml +++ b/src/Resources/Locales/zh_TW.axaml @@ -648,6 +648,7 @@ 選填。 新增分頁 關閉分頁 + 關閉下方分頁 關閉其他分頁 關閉右側分頁 複製存放庫路徑 @@ -689,6 +690,7 @@ 允許自動隱藏捲軸 使用固定寬度的分頁標籤 使用系統原生預設視窗樣式 + 垂直顯示分頁標籤 對比/合併工具 對比命令參數 可用參數: $LOCAL, $REMOTE diff --git a/src/ViewModels/LayoutInfo.cs b/src/ViewModels/LayoutInfo.cs index 43b58f5013..964c3211f9 100644 --- a/src/ViewModels/LayoutInfo.cs +++ b/src/ViewModels/LayoutInfo.cs @@ -35,6 +35,12 @@ public WindowState LauncherWindowState set; } = WindowState.Normal; + public double LauncherVerticalTabsWidth + { + get; + set; + } = 200; + public double RepositorySidebarWidth { get; diff --git a/src/ViewModels/Preferences.cs b/src/ViewModels/Preferences.cs index 4803ec4296..30d2970aa5 100644 --- a/src/ViewModels/Preferences.cs +++ b/src/ViewModels/Preferences.cs @@ -175,6 +175,12 @@ public bool UseFixedTabWidth set => SetProperty(ref _useFixedTabWidth, value); } + public bool UseVerticalTabs + { + get => _useVerticalTabs; + set => SetProperty(ref _useVerticalTabs, value); + } + public bool UseAutoHideScrollBars { get => _useAutoHideScrollBars; @@ -821,6 +827,7 @@ private bool RemoveInvalidRepositoriesRecursive(List collection) private int _maxHistoryCommits = 20000; private int _subjectGuideLength = 50; private bool _useFixedTabWidth = true; + private bool _useVerticalTabs = false; private bool _useAutoHideScrollBars = true; private bool _useGitHubStyleAvatar = true; private bool _useCompactBranchNamesInGraph = true; diff --git a/src/Views/Launcher.axaml b/src/Views/Launcher.axaml index 00aa09a228..f1b5e8df18 100644 --- a/src/Views/Launcher.axaml +++ b/src/Views/Launcher.axaml @@ -9,6 +9,7 @@ x:Class="SourceGit.Views.Launcher" x:DataType="vm:Launcher" x:Name="ThisControl" + IsVerticalTabsVisible="{Binding Source={x:Static vm:Preferences.Instance}, Path=UseVerticalTabs, Mode=OneWay}" Icon="/App.ico" Title="{Binding Title}" MinWidth="1024" MinHeight="600"> @@ -122,7 +123,11 @@ - + + + + + + + + + + diff --git a/src/Views/LauncherVerticalTabBar.axaml.cs b/src/Views/LauncherVerticalTabBar.axaml.cs new file mode 100644 index 0000000000..ae6923962e --- /dev/null +++ b/src/Views/LauncherVerticalTabBar.axaml.cs @@ -0,0 +1,20 @@ +using Avalonia.Controls; + +namespace SourceGit.Views +{ + public partial class LauncherVerticalTabBar : LauncherTabBarBase + { + protected override string CloseFollowingTabsTextKey => "PageTabBar.Tab.CloseBelow"; + + public LauncherVerticalTabBar() + { + InitializeComponent(); + } + + private void OnTabsSelectionChanged(object sender, SelectionChangedEventArgs _) + { + if (sender is ListBox { SelectedItem: { } selected } list) + list.ScrollIntoView(selected); + } + } +} diff --git a/src/Views/Preferences.axaml b/src/Views/Preferences.axaml index 55c2b17276..61b127d2a8 100644 --- a/src/Views/Preferences.axaml +++ b/src/Views/Preferences.axaml @@ -188,7 +188,7 @@ - + + + -