Skip to content

Commit 3b9e578

Browse files
committed
refactor: rewrite Ctrl+P/⌘+P feature
Signed-off-by: leo <longshuang@msn.cn>
1 parent 6c61a30 commit 3b9e578

File tree

11 files changed

+318
-186
lines changed

11 files changed

+318
-186
lines changed

src/Resources/Locales/en_US.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,7 @@
512512
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">Open in Browser</x:String>
513513
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">ERROR</x:String>
514514
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">NOTICE</x:String>
515+
<x:String x:Key="Text.Launcher.OpenRepository" xml:space="preserve">Open Repositories</x:String>
515516
<x:String x:Key="Text.Launcher.Pages" xml:space="preserve">Tabs</x:String>
516517
<x:String x:Key="Text.Launcher.Workspaces" xml:space="preserve">Workspaces</x:String>
517518
<x:String x:Key="Text.Merge" xml:space="preserve">Merge Branch</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@
516516
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">在浏览器中访问</x:String>
517517
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">出错了</x:String>
518518
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">系统提示</x:String>
519+
<x:String x:Key="Text.Launcher.OpenRepository" xml:space="preserve">打开其他仓库</x:String>
519520
<x:String x:Key="Text.Launcher.Pages" xml:space="preserve">页面列表</x:String>
520521
<x:String x:Key="Text.Launcher.Workspaces" xml:space="preserve">工作区列表</x:String>
521522
<x:String x:Key="Text.Merge" xml:space="preserve">合并分支</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@
516516
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">在瀏覽器中開啟連結</x:String>
517517
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">發生錯誤</x:String>
518518
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">系統提示</x:String>
519+
<x:String x:Key="Text.Launcher.OpenRepository" xml:space="preserve">開啟存放庫</x:String>
519520
<x:String x:Key="Text.Launcher.Pages" xml:space="preserve">頁面列表</x:String>
520521
<x:String x:Key="Text.Launcher.Workspaces" xml:space="preserve">工作區列表</x:String>
521522
<x:String x:Key="Text.Merge" xml:space="preserve">合併分支</x:String>

src/ViewModels/Launcher.cs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ public LauncherPage ActivePage
4343
}
4444
}
4545

46-
public IDisposable Switcher
46+
public QuickLauncher QuickLauncher
4747
{
48-
get => _switcher;
49-
private set => SetProperty(ref _switcher, value);
48+
get => _quickLauncher;
49+
set => SetProperty(ref _quickLauncher, value);
5050
}
5151

5252
public Launcher(string startupRepo)
@@ -127,17 +127,6 @@ public void Quit()
127127
_ignoreIndexChange = false;
128128
}
129129

130-
public void OpenTabSwitcher()
131-
{
132-
Switcher = new LauncherPageSwitcher(this);
133-
}
134-
135-
public void CancelSwitcher()
136-
{
137-
Switcher?.Dispose();
138-
Switcher = null;
139-
}
140-
141130
public void SwitchWorkspace(Workspace to)
142131
{
143132
if (to == null || to.IsActive)
@@ -492,6 +481,6 @@ private void UpdateTitle()
492481
private LauncherPage _activePage = null;
493482
private bool _ignoreIndexChange = false;
494483
private string _title = string.Empty;
495-
private IDisposable _switcher = null;
484+
private QuickLauncher _quickLauncher = null;
496485
}
497486
}

src/ViewModels/LauncherPageSwitcher.cs

Lines changed: 0 additions & 84 deletions
This file was deleted.

src/ViewModels/QuickLauncher.cs

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using CommunityToolkit.Mvvm.ComponentModel;
4+
5+
namespace SourceGit.ViewModels
6+
{
7+
public class QuickLauncher : ObservableObject
8+
{
9+
public List<LauncherPage> VisiblePages
10+
{
11+
get => _visiblePages;
12+
private set => SetProperty(ref _visiblePages, value);
13+
}
14+
15+
public List<RepositoryNode> VisibleRepos
16+
{
17+
get => _visibleRepos;
18+
private set => SetProperty(ref _visibleRepos, value);
19+
}
20+
21+
public string SearchFilter
22+
{
23+
get => _searchFilter;
24+
set
25+
{
26+
if (SetProperty(ref _searchFilter, value))
27+
UpdateVisible();
28+
}
29+
}
30+
31+
public LauncherPage SelectedPage
32+
{
33+
get => _selectedPage;
34+
set
35+
{
36+
if (SetProperty(ref _selectedPage, value) && value != null)
37+
SelectedRepo = null;
38+
}
39+
}
40+
41+
public RepositoryNode SelectedRepo
42+
{
43+
get => _selectedRepo;
44+
set
45+
{
46+
if (SetProperty(ref _selectedRepo, value) && value != null)
47+
SelectedPage = null;
48+
}
49+
}
50+
51+
public QuickLauncher(Launcher launcher)
52+
{
53+
_launcher = launcher;
54+
55+
foreach (var page in _launcher.Pages)
56+
{
57+
if (page.Node.IsRepository)
58+
_opened.Add(page.Node.Id);
59+
}
60+
61+
UpdateVisible();
62+
}
63+
64+
public void ClearFilter()
65+
{
66+
SearchFilter = string.Empty;
67+
}
68+
69+
public void OpenOrSwitchTo()
70+
{
71+
if (_selectedPage != null)
72+
_launcher.ActivePage = _selectedPage;
73+
else if (_selectedRepo != null)
74+
_launcher.OpenRepositoryInTab(_selectedRepo, null);
75+
76+
_launcher.QuickLauncher = null;
77+
}
78+
79+
private void UpdateVisible()
80+
{
81+
var pages = new List<LauncherPage>();
82+
foreach (var page in _launcher.Pages)
83+
{
84+
if (string.IsNullOrEmpty(_searchFilter) ||
85+
page.Node.Name.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase) ||
86+
(page.Node.IsRepository && page.Node.Id.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase)))
87+
pages.Add(page);
88+
}
89+
90+
var repos = new List<RepositoryNode>();
91+
CollectVisibleRepository(repos, Preferences.Instance.RepositoryNodes);
92+
93+
VisiblePages = pages;
94+
VisibleRepos = repos;
95+
}
96+
97+
private void CollectVisibleRepository(List<RepositoryNode> outs, List<RepositoryNode> nodes)
98+
{
99+
foreach (var node in nodes)
100+
{
101+
if (!node.IsRepository)
102+
{
103+
CollectVisibleRepository(outs, node.SubNodes);
104+
continue;
105+
}
106+
107+
if (_opened.Contains(node.Id))
108+
continue;
109+
110+
if (string.IsNullOrEmpty(_searchFilter) ||
111+
node.Id.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase) ||
112+
node.Name.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase))
113+
outs.Add(node);
114+
}
115+
}
116+
117+
private Launcher _launcher = null;
118+
private HashSet<string> _opened = new HashSet<string>();
119+
private List<LauncherPage> _visiblePages = [];
120+
private List<RepositoryNode> _visibleRepos = [];
121+
private string _searchFilter = string.Empty;
122+
private LauncherPage _selectedPage = null;
123+
private RepositoryNode _selectedRepo = null;
124+
}
125+
}

src/Views/Launcher.axaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
</Button>
9191

9292
<!-- Pages Switcher Toggle Button -->
93-
<Button Grid.Column="2" Classes="icon_button" VerticalAlignment="Bottom" Margin="0,0,0,1" Command="{Binding OpenTabSwitcher}" HotKey="{OnPlatform Ctrl+P, macOS=⌘+P}">
93+
<Button Grid.Column="2" Classes="icon_button" VerticalAlignment="Bottom" Margin="0,0,0,1" Click="OnOpenQuickLauncher" HotKey="{OnPlatform Ctrl+P, macOS=⌘+P}">
9494
<ToolTip.Tip>
9595
<StackPanel Orientation="Horizontal">
9696
<TextBlock Text="{DynamicResource Text.Launcher.Pages}"
@@ -123,17 +123,17 @@
123123
</ContentControl.DataTemplates>
124124
</ContentControl>
125125

126-
<!-- Pages Switcher -->
126+
<!-- Quick Launcher Popup -->
127127
<Border Grid.Row="0" Grid.RowSpan="2"
128128
Background="Transparent"
129-
IsVisible="{Binding Switcher, Converter={x:Static ObjectConverters.IsNotNull}}"
130-
PointerPressed="OnCancelSwitcher">
129+
IsVisible="{Binding QuickLauncher, Converter={x:Static ObjectConverters.IsNotNull}}"
130+
PointerPressed="OnCloseQuickLauncher">
131131
<Border HorizontalAlignment="Center" VerticalAlignment="Center" Effect="drop-shadow(0 0 12 #A0000000)">
132132
<Border Background="{DynamicResource Brush.Popup}" CornerRadius="8">
133-
<ContentControl Margin="16,10,16,12" Content="{Binding Switcher}">
133+
<ContentControl Margin="16,10,16,12" Content="{Binding QuickLauncher}">
134134
<ContentControl.DataTemplates>
135-
<DataTemplate DataType="vm:LauncherPageSwitcher">
136-
<v:LauncherPageSwitcher/>
135+
<DataTemplate DataType="vm:QuickLauncher">
136+
<v:QuickLauncher/>
137137
</DataTemplate>
138138
</ContentControl.DataTemplates>
139139
</ContentControl>

src/Views/Launcher.axaml.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,8 @@ protected override async void OnKeyDown(KeyEventArgs e)
250250
}
251251
else if (e.Key == Key.Escape)
252252
{
253-
if (vm.Switcher != null)
254-
vm.CancelSwitcher();
253+
if (vm.QuickLauncher != null)
254+
vm.QuickLauncher = null;
255255
else
256256
vm.ActivePage.CancelPopup();
257257

@@ -355,10 +355,17 @@ private void OnOpenWorkspaceMenu(object sender, RoutedEventArgs e)
355355
e.Handled = true;
356356
}
357357

358-
private void OnCancelSwitcher(object sender, PointerPressedEventArgs e)
358+
private void OnOpenQuickLauncher(object sender, RoutedEventArgs e)
359359
{
360-
if (e.Source == sender)
361-
(DataContext as ViewModels.Launcher)?.CancelSwitcher();
360+
if (DataContext is ViewModels.Launcher launcher)
361+
launcher.QuickLauncher = new ViewModels.QuickLauncher(launcher);
362+
e.Handled = true;
363+
}
364+
365+
private void OnCloseQuickLauncher(object sender, PointerPressedEventArgs e)
366+
{
367+
if (e.Source == sender && DataContext is ViewModels.Launcher launcher)
368+
launcher.QuickLauncher = null;
362369
e.Handled = true;
363370
}
364371

0 commit comments

Comments
 (0)