mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-05-21 20:24:59 +00:00
refactor: rewrite searching commit by file path
Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
parent
fa4d9d24e9
commit
64a41dce39
3 changed files with 53 additions and 76 deletions
|
@ -271,14 +271,13 @@ namespace SourceGit.ViewModels
|
|||
{
|
||||
SearchedCommits = new List<Models.Commit>();
|
||||
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<string>();
|
||||
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<string> MatchedFilesForSearching
|
||||
{
|
||||
get => _isSearchCommitSuggestionOpen;
|
||||
set => SetProperty(ref _isSearchCommitSuggestionOpen, value);
|
||||
get => _matchedFilesForSearching;
|
||||
private set => SetProperty(ref _matchedFilesForSearching, value);
|
||||
}
|
||||
|
||||
public AvaloniaList<string> SearchCommitFilterSuggestion
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
} = new AvaloniaList<string>();
|
||||
|
||||
public List<Models.Commit> 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,28 +2383,34 @@ namespace SourceGit.ViewModels
|
|||
if (_searchCommitFilterType != 4)
|
||||
return;
|
||||
|
||||
_revisionFiles.AddRange(files);
|
||||
_worktreeFiles = new List<string>();
|
||||
foreach (var f in files)
|
||||
_worktreeFiles.Add(f);
|
||||
|
||||
if (!string.IsNullOrEmpty(_searchCommitFilter) && _searchCommitFilter.Length > 2 && _revisionFiles.Count > 0)
|
||||
if (_searchCommitFilter is { Length: > 2 })
|
||||
CalcMatchedFilesForSearching();
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void CalcMatchedFilesForSearching()
|
||||
{
|
||||
var suggestion = new List<string>();
|
||||
foreach (var file in _revisionFiles)
|
||||
if (_worktreeFiles == null || _worktreeFiles.Count == 0)
|
||||
return;
|
||||
|
||||
var matched = new List<string>();
|
||||
foreach (var file in _worktreeFiles)
|
||||
{
|
||||
if (file.Contains(_searchCommitFilter, StringComparison.OrdinalIgnoreCase) && file.Length != _searchCommitFilter.Length)
|
||||
{
|
||||
suggestion.Add(file);
|
||||
if (suggestion.Count > 100)
|
||||
matched.Add(file);
|
||||
if (matched.Count > 100)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
SearchCommitFilterSuggestion.Clear();
|
||||
SearchCommitFilterSuggestion.AddRange(suggestion);
|
||||
IsSearchCommitSuggestionOpen = SearchCommitFilterSuggestion.Count > 0;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
MatchedFilesForSearching = matched;
|
||||
}
|
||||
|
||||
private void AutoFetchImpl(object sender)
|
||||
|
@ -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<Models.Commit> _searchedCommits = new List<Models.Commit>();
|
||||
private Models.Commit _searchResultSelectedCommit = null;
|
||||
private List<string> _revisionFiles = new List<string>();
|
||||
private List<string> _worktreeFiles = null;
|
||||
private List<string> _matchedFilesForSearching = null;
|
||||
|
||||
private string _filter = string.Empty;
|
||||
private object _lockRemotes = new object();
|
||||
|
|
|
@ -424,7 +424,7 @@
|
|||
HorizontalOffset="-8" VerticalAlignment="-8">
|
||||
<Popup.IsOpen>
|
||||
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
||||
<Binding Path="IsSearchCommitSuggestionOpen"/>
|
||||
<Binding Path="MatchedFilesForSearching" Converter="{x:Static c:ListConverters.IsNotNullOrEmpty}"/>
|
||||
<Binding Path="$parent[Window].IsActive"/>
|
||||
</MultiBinding>
|
||||
</Popup.IsOpen>
|
||||
|
@ -434,7 +434,7 @@
|
|||
<ListBox x:Name="SearchSuggestionBox"
|
||||
Background="Transparent"
|
||||
SelectionMode="Single"
|
||||
ItemsSource="{Binding SearchCommitFilterSuggestion}"
|
||||
ItemsSource="{Binding MatchedFilesForSearching}"
|
||||
MaxHeight="400"
|
||||
Focusable="True"
|
||||
KeyDown="OnSearchSuggestionBoxKeyDown">
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue