diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml
index 8832a6b5..997e1051 100644
--- a/src/Resources/Locales/en_US.axaml
+++ b/src/Resources/Locales/en_US.axaml
@@ -733,6 +733,7 @@
Patch has been saved successfully!
Scan Repositories
Root Dir:
+ Scan another custom directory
Check for Updates...
New version of this software is available:
Check for updates failed!
diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml
index fcac7e03..e5b4ddae 100644
--- a/src/Resources/Locales/zh_CN.axaml
+++ b/src/Resources/Locales/zh_CN.axaml
@@ -737,6 +737,7 @@
补丁已成功保存!
扫描仓库
根路径 :
+ 扫描其他自定义路径
检测更新...
检测到软件有版本更新:
获取最新版本信息失败!
diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml
index a0c3a2c2..1775cf23 100644
--- a/src/Resources/Locales/zh_TW.axaml
+++ b/src/Resources/Locales/zh_TW.axaml
@@ -737,6 +737,7 @@
修補檔已成功儲存!
掃描存放庫
頂層目錄:
+ 掃描其他自訂目錄
檢查更新...
軟體有版本更新:
取得最新版本資訊失敗!
diff --git a/src/ViewModels/ScanRepositories.cs b/src/ViewModels/ScanRepositories.cs
index b0154770..95a57fbb 100644
--- a/src/ViewModels/ScanRepositories.cs
+++ b/src/ViewModels/ScanRepositories.cs
@@ -8,6 +8,18 @@ namespace SourceGit.ViewModels
{
public class ScanRepositories : Popup
{
+ public bool UseCustomDir
+ {
+ get => _useCustomDir;
+ set => SetProperty(ref _useCustomDir, value);
+ }
+
+ public string CustomDir
+ {
+ get => _customDir;
+ set => SetProperty(ref _customDir, value);
+ }
+
public List ScanDirs
{
get;
@@ -33,16 +45,28 @@ namespace SourceGit.ViewModels
if (ScanDirs.Count > 0)
_selected = ScanDirs[0];
+ else
+ _useCustomDir = true;
GetManagedRepositories(Preferences.Instance.RepositoryNodes, _managed);
}
public override async Task Sure()
{
- ProgressDescription = $"Scan repositories under '{_selected.Path}' ...";
+ var selectedDir = _useCustomDir ? _customDir : _selected?.Path;
+ if (string.IsNullOrEmpty(selectedDir))
+ {
+ App.RaiseException(null, "Missing root directory to scan!");
+ return false;
+ }
+
+ if (!Directory.Exists(selectedDir))
+ return true;
+
+ ProgressDescription = $"Scan repositories under '{selectedDir}' ...";
var minDelay = Task.Delay(500);
- var rootDir = new DirectoryInfo(_selected.Path);
+ var rootDir = new DirectoryInfo(selectedDir);
var found = new List();
await GetUnmanagedRepositoriesAsync(rootDir, found, new EnumerationOptions()
@@ -162,6 +186,8 @@ namespace SourceGit.ViewModels
}
private HashSet _managed = new();
+ private bool _useCustomDir = false;
+ private string _customDir = string.Empty;
private Models.ScanDir _selected = null;
}
}
diff --git a/src/Views/ScanRepositories.axaml b/src/Views/ScanRepositories.axaml
index b9e87b46..9ca7bbd7 100644
--- a/src/Views/ScanRepositories.axaml
+++ b/src/Views/ScanRepositories.axaml
@@ -11,7 +11,7 @@
-
+
+ SelectedItem="{Binding Selected, Mode=TwoWay}"
+ IsVisible="{Binding !UseCustomDir, Mode=OneWay}">
@@ -38,6 +39,21 @@
+
+
+
+
+
+
+
diff --git a/src/Views/ScanRepositories.axaml.cs b/src/Views/ScanRepositories.axaml.cs
index 4848112a..3f218153 100644
--- a/src/Views/ScanRepositories.axaml.cs
+++ b/src/Views/ScanRepositories.axaml.cs
@@ -1,4 +1,8 @@
+using System;
+
using Avalonia.Controls;
+using Avalonia.Interactivity;
+using Avalonia.Platform.Storage;
namespace SourceGit.Views
{
@@ -8,5 +12,33 @@ namespace SourceGit.Views
{
InitializeComponent();
}
+
+ private async void OnSelectRootDir(object _, RoutedEventArgs e)
+ {
+ var provider = TopLevel.GetTopLevel(this)?.StorageProvider;
+ if (provider == null)
+ return;
+
+ if (DataContext is not ViewModels.ScanRepositories vm)
+ return;
+
+ var options = new FolderPickerOpenOptions() { AllowMultiple = false };
+ try
+ {
+ var selected = await provider.OpenFolderPickerAsync(options);
+ if (selected.Count == 1)
+ {
+ var folder = selected[0];
+ var folderPath = folder is { Path: { IsAbsoluteUri: true } path } ? path.LocalPath : folder?.Path.ToString();
+ vm.CustomDir = folderPath;
+ }
+ }
+ catch (Exception ex)
+ {
+ App.RaiseException(string.Empty, $"Failed to select root scanning directory: {ex.Message}");
+ }
+
+ e.Handled = true;
+ }
}
}