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; + } } }