From 64a41dce39a5ccc9915ce0ef82ed0b5c24202243 Mon Sep 17 00:00:00 2001 From: leo Date: Tue, 11 Mar 2025 20:55:39 +0800 Subject: [PATCH] refactor: rewrite searching commit by file path Signed-off-by: leo --- src/ViewModels/Repository.cs | 112 +++++++++++++++------------------- src/Views/Repository.axaml | 4 +- src/Views/Repository.axaml.cs | 13 +--- 3 files changed, 53 insertions(+), 76 deletions(-) diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index ebf9210e..9e10390a 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -271,14 +271,13 @@ namespace SourceGit.ViewModels { SearchedCommits = new List(); SearchCommitFilter = string.Empty; - SearchCommitFilterSuggestion.Clear(); - IsSearchCommitSuggestionOpen = false; - _revisionFiles.Clear(); + MatchedFilesForSearching = null; + _worktreeFiles = null; if (value) { SelectedViewIndex = 0; - UpdateCurrentRevisionFilesForSearchSuggestion(); + CalcWorktreeFilesForSearching(); } } } @@ -307,7 +306,7 @@ namespace SourceGit.ViewModels { if (SetProperty(ref _searchCommitFilterType, value)) { - UpdateCurrentRevisionFilesForSearchSuggestion(); + CalcWorktreeFilesForSearching(); if (!string.IsNullOrEmpty(_searchCommitFilter)) StartSearchCommits(); @@ -320,47 +319,22 @@ namespace SourceGit.ViewModels get => _searchCommitFilter; set { - if (SetProperty(ref _searchCommitFilter, value) && - _searchCommitFilterType == 4 && - !string.IsNullOrEmpty(value) && - value.Length >= 2 && - _revisionFiles.Count > 0) + if (SetProperty(ref _searchCommitFilter, value)) { - var suggestion = new List(); - foreach (var file in _revisionFiles) - { - if (file.Contains(value, StringComparison.OrdinalIgnoreCase) && file.Length != value.Length) - { - suggestion.Add(file); - if (suggestion.Count > 100) - break; - } - } - - SearchCommitFilterSuggestion.Clear(); - SearchCommitFilterSuggestion.AddRange(suggestion); - IsSearchCommitSuggestionOpen = SearchCommitFilterSuggestion.Count > 0; - } - else if (SearchCommitFilterSuggestion.Count > 0) - { - SearchCommitFilterSuggestion.Clear(); - IsSearchCommitSuggestionOpen = false; + if (_searchCommitFilterType == 4 && value is { Length: > 2 }) + CalcMatchedFilesForSearching(); + else if (_matchedFilesForSearching is { }) + MatchedFilesForSearching = null; } } } - public bool IsSearchCommitSuggestionOpen + public List MatchedFilesForSearching { - get => _isSearchCommitSuggestionOpen; - set => SetProperty(ref _isSearchCommitSuggestionOpen, value); + get => _matchedFilesForSearching; + private set => SetProperty(ref _matchedFilesForSearching, value); } - public AvaloniaList SearchCommitFilterSuggestion - { - get; - private set; - } = new AvaloniaList(); - public List SearchedCommits { get => _searchedCommits; @@ -551,8 +525,8 @@ namespace SourceGit.ViewModels _visibleSubmodules.Clear(); _searchedCommits.Clear(); - _revisionFiles.Clear(); - SearchCommitFilterSuggestion.Clear(); + _worktreeFiles = null; + _matchedFilesForSearching = null; } public bool CanCreatePopup() @@ -723,6 +697,11 @@ namespace SourceGit.ViewModels SearchCommitFilter = string.Empty; } + public void ClearMatchedFilesForSearching() + { + MatchedFilesForSearching = null; + } + public void StartSearchCommits() { if (_histories == null) @@ -730,8 +709,7 @@ namespace SourceGit.ViewModels IsSearchLoadingVisible = true; SearchResultSelectedCommit = null; - IsSearchCommitSuggestionOpen = false; - SearchCommitFilterSuggestion.Clear(); + MatchedFilesForSearching = null; Task.Run(() => { @@ -2391,9 +2369,9 @@ namespace SourceGit.ViewModels menu.Items.Add(new MenuItem() { Header = "-" }); } - private void UpdateCurrentRevisionFilesForSearchSuggestion() + private void CalcWorktreeFilesForSearching() { - _revisionFiles.Clear(); + _worktreeFiles = null; if (_searchCommitFilterType == 4) { @@ -2405,30 +2383,36 @@ namespace SourceGit.ViewModels if (_searchCommitFilterType != 4) return; - _revisionFiles.AddRange(files); + _worktreeFiles = new List(); + foreach (var f in files) + _worktreeFiles.Add(f); - if (!string.IsNullOrEmpty(_searchCommitFilter) && _searchCommitFilter.Length > 2 && _revisionFiles.Count > 0) - { - var suggestion = new List(); - foreach (var file in _revisionFiles) - { - if (file.Contains(_searchCommitFilter, StringComparison.OrdinalIgnoreCase) && file.Length != _searchCommitFilter.Length) - { - suggestion.Add(file); - if (suggestion.Count > 100) - break; - } - } - - SearchCommitFilterSuggestion.Clear(); - SearchCommitFilterSuggestion.AddRange(suggestion); - IsSearchCommitSuggestionOpen = SearchCommitFilterSuggestion.Count > 0; - } + if (_searchCommitFilter is { Length: > 2 }) + CalcMatchedFilesForSearching(); }); }); } } + private void CalcMatchedFilesForSearching() + { + if (_worktreeFiles == null || _worktreeFiles.Count == 0) + return; + + var matched = new List(); + foreach (var file in _worktreeFiles) + { + if (file.Contains(_searchCommitFilter, StringComparison.OrdinalIgnoreCase) && file.Length != _searchCommitFilter.Length) + { + matched.Add(file); + if (matched.Count > 100) + break; + } + } + + MatchedFilesForSearching = matched; + } + private void AutoFetchImpl(object sender) { if (!_settings.EnableAutoFetch || _isAutoFetching) @@ -2475,13 +2459,13 @@ namespace SourceGit.ViewModels private bool _isSearching = false; private bool _isSearchLoadingVisible = false; - private bool _isSearchCommitSuggestionOpen = false; private int _searchCommitFilterType = 3; private bool _onlySearchCommitsInCurrentBranch = false; private string _searchCommitFilter = string.Empty; private List _searchedCommits = new List(); private Models.Commit _searchResultSelectedCommit = null; - private List _revisionFiles = new List(); + private List _worktreeFiles = null; + private List _matchedFilesForSearching = null; private string _filter = string.Empty; private object _lockRemotes = new object(); diff --git a/src/Views/Repository.axaml b/src/Views/Repository.axaml index bfa5a5e1..9caac015 100644 --- a/src/Views/Repository.axaml +++ b/src/Views/Repository.axaml @@ -424,7 +424,7 @@ HorizontalOffset="-8" VerticalAlignment="-8"> - + @@ -434,7 +434,7 @@ diff --git a/src/Views/Repository.axaml.cs b/src/Views/Repository.axaml.cs index 2b3b7c30..00218a85 100644 --- a/src/Views/Repository.axaml.cs +++ b/src/Views/Repository.axaml.cs @@ -134,7 +134,7 @@ namespace SourceGit.Views } else if (e.Key == Key.Down) { - if (repo.IsSearchCommitSuggestionOpen) + if (repo.MatchedFilesForSearching is { Count: > 0 }) { SearchSuggestionBox.Focus(NavigationMethod.Tab); SearchSuggestionBox.SelectedIndex = 0; @@ -144,12 +144,7 @@ namespace SourceGit.Views } else if (e.Key == Key.Escape) { - if (repo.IsSearchCommitSuggestionOpen) - { - repo.SearchCommitFilterSuggestion.Clear(); - repo.IsSearchCommitSuggestionOpen = false; - } - + repo.ClearMatchedFilesForSearching(); e.Handled = true; } } @@ -369,9 +364,7 @@ namespace SourceGit.Views if (e.Key == Key.Escape) { - repo.IsSearchCommitSuggestionOpen = false; - repo.SearchCommitFilterSuggestion.Clear(); - + repo.ClearMatchedFilesForSearching(); e.Handled = true; } else if (e.Key == Key.Enter && SearchSuggestionBox.SelectedItem is string content)