Skip to content

Commit 119397d

Browse files
love-lingerbiancode
authored andcommitted
feature: supports to scan custom directory (sourcegit-scm#1696)
Signed-off-by: leo <[email protected]>
1 parent 316dbbc commit 119397d

File tree

6 files changed

+81
-4
lines changed

6 files changed

+81
-4
lines changed

src/Resources/Locales/en_US.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,7 @@
730730
<x:String x:Key="Text.SaveAsPatchSuccess" xml:space="preserve">Patch has been saved successfully!</x:String>
731731
<x:String x:Key="Text.ScanRepositories" xml:space="preserve">Scan Repositories</x:String>
732732
<x:String x:Key="Text.ScanRepositories.RootDir" xml:space="preserve">Root Dir:</x:String>
733+
<x:String x:Key="Text.ScanRepositories.UseCustomDir" xml:space="preserve">Scan another custom directory</x:String>
733734
<x:String x:Key="Text.SelfUpdate" xml:space="preserve">Check for Updates...</x:String>
734735
<x:String x:Key="Text.SelfUpdate.Available" xml:space="preserve">New version of this software is available: </x:String>
735736
<x:String x:Key="Text.SelfUpdate.Error" xml:space="preserve">Check for updates failed!</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,7 @@
731731
<x:String x:Key="Text.SaveAsPatchSuccess" xml:space="preserve">补丁已成功保存!</x:String>
732732
<x:String x:Key="Text.ScanRepositories" xml:space="preserve">扫描仓库</x:String>
733733
<x:String x:Key="Text.ScanRepositories.RootDir" xml:space="preserve">根路径 :</x:String>
734+
<x:String x:Key="Text.ScanRepositories.UseCustomDir" xml:space="preserve">扫描其他自定义路径</x:String>
734735
<x:String x:Key="Text.SelfUpdate" xml:space="preserve">检测更新...</x:String>
735736
<x:String x:Key="Text.SelfUpdate.Available" xml:space="preserve">检测到软件有版本更新: </x:String>
736737
<x:String x:Key="Text.SelfUpdate.Error" 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
@@ -731,6 +731,7 @@
731731
<x:String x:Key="Text.SaveAsPatchSuccess" xml:space="preserve">修補檔已成功儲存!</x:String>
732732
<x:String x:Key="Text.ScanRepositories" xml:space="preserve">掃描存放庫</x:String>
733733
<x:String x:Key="Text.ScanRepositories.RootDir" xml:space="preserve">頂層目錄:</x:String>
734+
<x:String x:Key="Text.ScanRepositories.UseCustomDir" xml:space="preserve">掃描其他自訂目錄</x:String>
734735
<x:String x:Key="Text.SelfUpdate" xml:space="preserve">檢查更新...</x:String>
735736
<x:String x:Key="Text.SelfUpdate.Available" xml:space="preserve">軟體有版本更新:</x:String>
736737
<x:String x:Key="Text.SelfUpdate.Error" xml:space="preserve">取得最新版本資訊失敗!</x:String>

src/ViewModels/ScanRepositories.cs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,18 @@ namespace SourceGit.ViewModels
99
{
1010
public class ScanRepositories : Popup
1111
{
12+
public bool UseCustomDir
13+
{
14+
get => _useCustomDir;
15+
set => SetProperty(ref _useCustomDir, value);
16+
}
17+
18+
public string CustomDir
19+
{
20+
get => _customDir;
21+
set => SetProperty(ref _customDir, value);
22+
}
23+
1224
public List<Models.ScanDir> ScanDirs
1325
{
1426
get;
@@ -34,16 +46,28 @@ public ScanRepositories()
3446

3547
if (ScanDirs.Count > 0)
3648
_selected = ScanDirs[0];
49+
else
50+
_useCustomDir = true;
3751

3852
GetManagedRepositories(Preferences.Instance.RepositoryNodes, _managed);
3953
}
4054

4155
public override async Task<bool> Sure()
4256
{
43-
ProgressDescription = $"Scan repositories under '{_selected.Path}' ...";
57+
var selectedDir = _useCustomDir ? _customDir : _selected?.Path;
58+
if (string.IsNullOrEmpty(selectedDir))
59+
{
60+
App.RaiseException(null, "Missing root directory to scan!");
61+
return false;
62+
}
63+
64+
if (!Directory.Exists(selectedDir))
65+
return true;
66+
67+
ProgressDescription = $"Scan repositories under '{selectedDir}' ...";
4468

4569
var minDelay = Task.Delay(500);
46-
var rootDir = new DirectoryInfo(_selected.Path);
70+
var rootDir = new DirectoryInfo(selectedDir);
4771
var found = new List<string>();
4872

4973
// Check if directory exists and is accessible
@@ -213,6 +237,8 @@ private RepositoryNode FindOrCreateGroup(List<RepositoryNode> collection, string
213237
}
214238

215239
private HashSet<string> _managed = new();
240+
private bool _useCustomDir = false;
241+
private string _customDir = string.Empty;
216242
private Models.ScanDir _selected = null;
217243
}
218244
}

src/Views/ScanRepositories.axaml

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<TextBlock FontSize="18"
1212
Classes="bold"
1313
Text="{DynamicResource Text.ScanRepositories}"/>
14-
<Grid Margin="0,16,0,0" RowDefinitions="32" ColumnDefinitions="120,*">
14+
<Grid Margin="0,16,0,0" RowDefinitions="32,32" ColumnDefinitions="120,*">
1515
<TextBlock Grid.Row="0" Grid.Column="0"
1616
HorizontalAlignment="Right" VerticalAlignment="Center"
1717
Margin="0,0,8,0"
@@ -20,7 +20,8 @@
2020
Height="28" Padding="4,0"
2121
VerticalAlignment="Center" HorizontalAlignment="Stretch"
2222
ItemsSource="{Binding ScanDirs, Mode=OneWay}"
23-
SelectedItem="{Binding Selected, Mode=TwoWay}">
23+
SelectedItem="{Binding Selected, Mode=TwoWay}"
24+
IsVisible="{Binding !UseCustomDir, Mode=OneWay}">
2425
<ComboBox.ItemTemplate>
2526
<DataTemplate DataType="m:ScanDir">
2627
<Grid ColumnDefinitions="20,*,Auto">
@@ -38,6 +39,21 @@
3839
</DataTemplate>
3940
</ComboBox.ItemTemplate>
4041
</ComboBox>
42+
<TextBox Grid.Row="0" Grid.Column="1"
43+
Height="28"
44+
CornerRadius="3"
45+
Text="{Binding CustomDir, Mode=TwoWay}"
46+
IsVisible="{Binding UseCustomDir, Mode=OneWay}">
47+
<TextBox.InnerRightContent>
48+
<Button Classes="icon_button" Width="30" Height="30" Click="OnSelectRootDir">
49+
<Path Data="{StaticResource Icons.Folder.Open}" Fill="{DynamicResource Brush.FG1}"/>
50+
</Button>
51+
</TextBox.InnerRightContent>
52+
</TextBox>
53+
54+
<CheckBox Grid.Row="1" Grid.Column="1"
55+
Content="{DynamicResource Text.ScanRepositories.UseCustomDir}"
56+
IsChecked="{Binding UseCustomDir, Mode=TwoWay}"/>
4157
</Grid>
4258
</StackPanel>
4359
</UserControl>

src/Views/ScanRepositories.axaml.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
using System;
2+
13
using Avalonia.Controls;
4+
using Avalonia.Interactivity;
5+
using Avalonia.Platform.Storage;
26

37
namespace SourceGit.Views
48
{
@@ -8,5 +12,33 @@ public ScanRepositories()
812
{
913
InitializeComponent();
1014
}
15+
16+
private async void OnSelectRootDir(object _, RoutedEventArgs e)
17+
{
18+
var provider = TopLevel.GetTopLevel(this)?.StorageProvider;
19+
if (provider == null)
20+
return;
21+
22+
if (DataContext is not ViewModels.ScanRepositories vm)
23+
return;
24+
25+
var options = new FolderPickerOpenOptions() { AllowMultiple = false };
26+
try
27+
{
28+
var selected = await provider.OpenFolderPickerAsync(options);
29+
if (selected.Count == 1)
30+
{
31+
var folder = selected[0];
32+
var folderPath = folder is { Path: { IsAbsoluteUri: true } path } ? path.LocalPath : folder?.Path.ToString();
33+
vm.CustomDir = folderPath;
34+
}
35+
}
36+
catch (Exception ex)
37+
{
38+
App.RaiseException(string.Empty, $"Failed to select root scanning directory: {ex.Message}");
39+
}
40+
41+
e.Handled = true;
42+
}
1143
}
1244
}

0 commit comments

Comments
 (0)