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 @@
-
+