Skip to content

Commit 9614b99

Browse files
committed
refactor: workspace/page switcher (#1330)
- add `Switch Tab` popup - change hotkey to open `Preferences` to `Ctrl+,/⌘+,` - change hotkey to open `Switch Workspace` to `Ctrl+Shift+P/⌘+⇧+P` - change hotkey to open `Switch Tab` to `Ctrl+P/⌘+P` Signed-off-by: leo <[email protected]>
1 parent 36c2e08 commit 9614b99

17 files changed

+417
-179
lines changed

src/Resources/Locales/en_US.axaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@
387387
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">Create new page</x:String>
388388
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">Open Preferences dialog</x:String>
389389
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">Switch active workspace</x:String>
390+
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">Switch active page</x:String>
390391
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">REPOSITORY</x:String>
391392
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">Commit staged changes</x:String>
392393
<x:String x:Key="Text.Hotkeys.Repo.CommitAndPush" xml:space="preserve">Commit and push staged changes</x:String>
@@ -429,6 +430,8 @@
429430
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">Open in Browser</x:String>
430431
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">ERROR</x:String>
431432
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">NOTICE</x:String>
433+
<x:String x:Key="Text.Launcher.SwitchWorkspace" xml:space="preserve">Switch Workspace</x:String>
434+
<x:String x:Key="Text.Launcher.SwitchTab" xml:space="preserve">Switch Tab</x:String>
432435
<x:String x:Key="Text.Merge" xml:space="preserve">Merge Branch</x:String>
433436
<x:String x:Key="Text.Merge.Into" xml:space="preserve">Into:</x:String>
434437
<x:String x:Key="Text.Merge.Mode" xml:space="preserve">Merge Option:</x:String>
@@ -635,7 +638,6 @@
635638
<x:String x:Key="Text.Repository.UseRelativeTimeInHistories" xml:space="preserve">Use relative time in histories</x:String>
636639
<x:String x:Key="Text.Repository.ViewLogs" xml:space="preserve">View Logs</x:String>
637640
<x:String x:Key="Text.Repository.Visit" xml:space="preserve">Visit '{0}' in Browser</x:String>
638-
<x:String x:Key="Text.Repository.WorkspaceSwitcher" xml:space="preserve">Switch Workspace</x:String>
639641
<x:String x:Key="Text.Repository.Worktrees" xml:space="preserve">WORKTREES</x:String>
640642
<x:String x:Key="Text.Repository.Worktrees.Add" xml:space="preserve">Add Worktree</x:String>
641643
<x:String x:Key="Text.Repository.Worktrees.Prune" xml:space="preserve">Prune</x:String>

src/Resources/Locales/ru_RU.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@
433433
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">Открыть в браузере</x:String>
434434
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">ОШИБКА</x:String>
435435
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">УВЕДОМЛЕНИЕ</x:String>
436+
<x:String x:Key="Text.Launcher.SwitchWorkspace" xml:space="preserve">Переключить рабочее место</x:String>
436437
<x:String x:Key="Text.Merge" xml:space="preserve">Влить ветку</x:String>
437438
<x:String x:Key="Text.Merge.Into" xml:space="preserve">В:</x:String>
438439
<x:String x:Key="Text.Merge.Mode" xml:space="preserve">Опции слияния:</x:String>
@@ -639,7 +640,6 @@
639640
<x:String x:Key="Text.Repository.UseRelativeTimeInHistories" xml:space="preserve">Использовать относительное время в историях</x:String>
640641
<x:String x:Key="Text.Repository.ViewLogs" xml:space="preserve">Просмотр журналов</x:String>
641642
<x:String x:Key="Text.Repository.Visit" xml:space="preserve">Посетить '{0}' в браузере</x:String>
642-
<x:String x:Key="Text.Repository.WorkspaceSwitcher" xml:space="preserve">Переключить рабочее место</x:String>
643643
<x:String x:Key="Text.Repository.Worktrees" xml:space="preserve">РАБОЧИЕ КАТАЛОГИ</x:String>
644644
<x:String x:Key="Text.Repository.Worktrees.Add" xml:space="preserve">ДОБАВИТЬ РАБОЧИЙ КАТАЛОГ</x:String>
645645
<x:String x:Key="Text.Repository.Worktrees.Prune" xml:space="preserve">ОБРЕЗАТЬ</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@
391391
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">新建页面</x:String>
392392
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">打开偏好设置面板</x:String>
393393
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">切换工作区</x:String>
394+
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">切换显示页面</x:String>
394395
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">仓库页面快捷键</x:String>
395396
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">提交暂存区更改</x:String>
396397
<x:String x:Key="Text.Hotkeys.Repo.CommitAndPush" xml:space="preserve">提交暂存区更改并推送</x:String>
@@ -433,6 +434,8 @@
433434
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">在浏览器中访问</x:String>
434435
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">出错了</x:String>
435436
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">系统提示</x:String>
437+
<x:String x:Key="Text.Launcher.SwitchWorkspace" xml:space="preserve">切换工作区</x:String>
438+
<x:String x:Key="Text.Launcher.SwitchTab" xml:space="preserve">切换页面</x:String>
436439
<x:String x:Key="Text.Merge" xml:space="preserve">合并分支</x:String>
437440
<x:String x:Key="Text.Merge.Into" xml:space="preserve">目标分支 :</x:String>
438441
<x:String x:Key="Text.Merge.Mode" xml:space="preserve">合并方式 :</x:String>
@@ -639,7 +642,6 @@
639642
<x:String x:Key="Text.Repository.UseRelativeTimeInHistories" xml:space="preserve">在提交列表中使用相对时间</x:String>
640643
<x:String x:Key="Text.Repository.ViewLogs" xml:space="preserve">查看命令日志</x:String>
641644
<x:String x:Key="Text.Repository.Visit" xml:space="preserve">访问远程仓库 '{0}'</x:String>
642-
<x:String x:Key="Text.Repository.WorkspaceSwitcher" xml:space="preserve">切换工作区</x:String>
643645
<x:String x:Key="Text.Repository.Worktrees" xml:space="preserve">工作树列表</x:String>
644646
<x:String x:Key="Text.Repository.Worktrees.Add" xml:space="preserve">新增工作树</x:String>
645647
<x:String x:Key="Text.Repository.Worktrees.Prune" xml:space="preserve">清理</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@
391391
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">新增頁面</x:String>
392392
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">開啟偏好設定面板</x:String>
393393
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">切換工作區</x:String>
394+
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">切換目前頁面</x:String>
394395
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">存放庫頁面快速鍵</x:String>
395396
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">提交暫存區變更</x:String>
396397
<x:String x:Key="Text.Hotkeys.Repo.CommitAndPush" xml:space="preserve">提交暫存區變更並推送</x:String>
@@ -433,6 +434,8 @@
433434
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">在瀏覽器中開啟連結</x:String>
434435
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">發生錯誤</x:String>
435436
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">系統提示</x:String>
437+
<x:String x:Key="Text.Launcher.SwitchWorkspace" xml:space="preserve">切換工作區</x:String>
438+
<x:String x:Key="Text.Launcher.SwitchTab" xml:space="preserve">切換目前頁面</x:String>
436439
<x:String x:Key="Text.Merge" xml:space="preserve">合併分支</x:String>
437440
<x:String x:Key="Text.Merge.Into" xml:space="preserve">目標分支:</x:String>
438441
<x:String x:Key="Text.Merge.Mode" xml:space="preserve">合併方式:</x:String>
@@ -639,7 +642,6 @@
639642
<x:String x:Key="Text.Repository.UseRelativeTimeInHistories" xml:space="preserve">在提交列表中使用相對時間</x:String>
640643
<x:String x:Key="Text.Repository.ViewLogs" xml:space="preserve">檢視 Git 指令記錄</x:String>
641644
<x:String x:Key="Text.Repository.Visit" xml:space="preserve">檢視遠端存放庫 '{0}'</x:String>
642-
<x:String x:Key="Text.Repository.WorkspaceSwitcher" xml:space="preserve">切換工作區</x:String>
643645
<x:String x:Key="Text.Repository.Worktrees" xml:space="preserve">工作區列表</x:String>
644646
<x:String x:Key="Text.Repository.Worktrees.Add" xml:space="preserve">新增工作區</x:String>
645647
<x:String x:Key="Text.Repository.Worktrees.Prune" xml:space="preserve">清理</x:String>

src/ViewModels/Launcher.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,6 @@ public AvaloniaList<LauncherPage> Pages
2323
private set;
2424
}
2525

26-
public WorkspaceSwitcher WorkspaceSwitcher
27-
{
28-
get => _workspaceSwitcher;
29-
set => SetProperty(ref _workspaceSwitcher, value);
30-
}
31-
3226
public Workspace ActiveWorkspace
3327
{
3428
get => _activeWorkspace;
@@ -50,6 +44,12 @@ public LauncherPage ActivePage
5044
}
5145
}
5246

47+
public object Switcher
48+
{
49+
get => _switcher;
50+
set => SetProperty(ref _switcher, value);
51+
}
52+
5353
public Launcher(string startupRepo)
5454
{
5555
_ignoreIndexChange = true;
@@ -138,12 +138,17 @@ public void Quit(double width, double height)
138138

139139
public void OpenWorkspaceSwitcher()
140140
{
141-
WorkspaceSwitcher = new WorkspaceSwitcher(this);
141+
Switcher = new WorkspaceSwitcher(this);
142+
}
143+
144+
public void OpenTabSwitcher()
145+
{
146+
Switcher = new LauncherPageSwitcher(this);
142147
}
143148

144-
public void CancelWorkspaceSwitcher()
149+
public void CancelSwitcher()
145150
{
146-
WorkspaceSwitcher = null;
151+
Switcher = null;
147152
}
148153

149154
public void SwitchWorkspace(Workspace to)
@@ -618,6 +623,6 @@ private void UpdateTitle()
618623
private LauncherPage _activePage = null;
619624
private bool _ignoreIndexChange = false;
620625
private string _title = string.Empty;
621-
private WorkspaceSwitcher _workspaceSwitcher = null;
626+
private object _switcher = null;
622627
}
623628
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using CommunityToolkit.Mvvm.ComponentModel;
4+
5+
namespace SourceGit.ViewModels
6+
{
7+
public class LauncherPageSwitcher : ObservableObject
8+
{
9+
public List<LauncherPage> VisiblePages
10+
{
11+
get => _visiblePages;
12+
private set => SetProperty(ref _visiblePages, value);
13+
}
14+
15+
public string SearchFilter
16+
{
17+
get => _searchFilter;
18+
set
19+
{
20+
if (SetProperty(ref _searchFilter, value))
21+
UpdateVisiblePages();
22+
}
23+
}
24+
25+
public LauncherPage SelectedPage
26+
{
27+
get => _selectedPage;
28+
set => SetProperty(ref _selectedPage, value);
29+
}
30+
31+
public LauncherPageSwitcher(Launcher launcher)
32+
{
33+
_launcher = launcher;
34+
UpdateVisiblePages();
35+
}
36+
37+
public void ClearFilter()
38+
{
39+
SearchFilter = string.Empty;
40+
}
41+
42+
public void Switch()
43+
{
44+
if (_selectedPage is { })
45+
_launcher.ActivePage = _selectedPage;
46+
47+
_launcher.CancelSwitcher();
48+
}
49+
50+
private void UpdateVisiblePages()
51+
{
52+
var visible = new List<LauncherPage>();
53+
if (string.IsNullOrEmpty(_searchFilter))
54+
{
55+
visible.AddRange(_launcher.Pages);
56+
}
57+
else
58+
{
59+
foreach (var page in _launcher.Pages)
60+
{
61+
if (page.Node.Name.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase) ||
62+
(page.Node.IsRepository && page.Node.Id.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase)))
63+
{
64+
visible.Add(page);
65+
}
66+
}
67+
}
68+
69+
VisiblePages = visible;
70+
}
71+
72+
private Launcher _launcher = null;
73+
private List<LauncherPage> _visiblePages = [];
74+
private string _searchFilter = string.Empty;
75+
private LauncherPage _selectedPage = null;
76+
}
77+
}

src/ViewModels/Repository.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2632,7 +2632,7 @@ private BranchTreeNode FindBranchNode(List<BranchTreeNode> nodes, string path)
26322632
if (node.Path.Equals(path, StringComparison.Ordinal))
26332633
return node;
26342634

2635-
if (path!.StartsWith(node.Path, StringComparison.Ordinal))
2635+
if (path.StartsWith(node.Path, StringComparison.Ordinal))
26362636
{
26372637
var founded = FindBranchNode(node.Children, path);
26382638
if (founded != null)

src/ViewModels/WorkspaceSwitcher.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public void Switch()
4444
if (_selectedWorkspace is { })
4545
_launcher.SwitchWorkspace(_selectedWorkspace);
4646

47-
_launcher.CancelWorkspaceSwitcher();
47+
_launcher.CancelSwitcher();
4848
}
4949

5050
private void UpdateVisibleWorkspaces()

src/Views/Hotkeys.axaml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
FontSize="{Binding Source={x:Static vm:Preferences.Instance}, Path=DefaultFontSize, Converter={x:Static c:DoubleConverters.Increase}}"
4646
Margin="0,0,0,8"/>
4747

48-
<Grid RowDefinitions="20,20,20,20,20,20,20,20,20" ColumnDefinitions="150,*">
49-
<TextBlock Grid.Row="0" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Ctrl+Shift+P, macOS=⌘+\,}"/>
48+
<Grid RowDefinitions="20,20,20,20,20,20,20,20,20,20" ColumnDefinitions="150,*">
49+
<TextBlock Grid.Row="0" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Ctrl+\,, macOS=⌘+\,}"/>
5050
<TextBlock Grid.Row="0" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Global.OpenPreferences}"/>
5151

5252
<TextBlock Grid.Row="1" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Ctrl+T, macOS=⌘+T}"/>
@@ -55,7 +55,7 @@
5555
<TextBlock Grid.Row="2" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Ctrl+W, macOS=⌘+W}" />
5656
<TextBlock Grid.Row="2" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Global.CloseTab}" />
5757

58-
<TextBlock Grid.Row="3" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Shift+Ctrl+Tab, macOS=⌘+⌥+←}"/>
58+
<TextBlock Grid.Row="3" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Ctrl+Shift+Tab, macOS=⌘+⌥+←}"/>
5959
<TextBlock Grid.Row="3" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Global.GotoPrevTab}" />
6060

6161
<TextBlock Grid.Row="4" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Ctrl+Tab, macOS=⌘+⌥+→}"/>
@@ -70,8 +70,11 @@
7070
<TextBlock Grid.Row="7" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Ctrl+Q, macOS=⌘+Q}"/>
7171
<TextBlock Grid.Row="7" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Quit}" />
7272

73-
<TextBlock Grid.Row="8" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Ctrl+P, macOS=⌘+P}"/>
73+
<TextBlock Grid.Row="8" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Ctrl+Shift+P, macOS=⌘+⇧+P}"/>
7474
<TextBlock Grid.Row="8" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Global.SwitchWorkspace}" />
75+
76+
<TextBlock Grid.Row="9" Grid.Column="0" Classes="primary bold" Text="{OnPlatform Ctrl+P, macOS=⌘+P}"/>
77+
<TextBlock Grid.Row="9" Grid.Column="1" Margin="16,0,0,0" Text="{DynamicResource Text.Hotkeys.Global.SwitchTab}" />
7578
</Grid>
7679

7780
<TextBlock Text="{DynamicResource Text.Hotkeys.Repo}"

src/Views/Launcher.axaml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,18 @@
106106
<!-- Workspace Switcher -->
107107
<Border Grid.Row="1"
108108
Background="Transparent"
109-
IsVisible="{Binding WorkspaceSwitcher, Converter={x:Static ObjectConverters.IsNotNull}}">
109+
IsVisible="{Binding Switcher, Converter={x:Static ObjectConverters.IsNotNull}}">
110110
<Border HorizontalAlignment="Center" VerticalAlignment="Center" Effect="drop-shadow(0 0 12 #A0000000)">
111111
<Border Background="{DynamicResource Brush.Popup}" CornerRadius="8">
112-
<ContentControl Margin="16" Content="{Binding WorkspaceSwitcher}">
112+
<ContentControl Margin="16" Content="{Binding Switcher}">
113113
<ContentControl.DataTemplates>
114114
<DataTemplate DataType="vm:WorkspaceSwitcher">
115115
<v:WorkspaceSwitcher/>
116116
</DataTemplate>
117+
118+
<DataTemplate DataType="vm:LauncherPageSwitcher">
119+
<v:LauncherPageSwitcher/>
120+
</DataTemplate>
117121
</ContentControl.DataTemplates>
118122
</ContentControl>
119123
</Border>

0 commit comments

Comments
 (0)