Skip to content

Commit 68443b0

Browse files
authored
Merge pull request #4312 from IvenBach/Issue3872
Search bar on Code Explorer now filters results after reparse request
2 parents 3628987 + a582eb9 commit 68443b0

File tree

3 files changed

+35
-17
lines changed

3 files changed

+35
-17
lines changed

Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerViewModel.cs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,7 @@ public ObservableCollection<CodeExplorerItemViewModel> Projects
260260
get => _projects;
261261
set
262262
{
263-
ReorderChildNodes(value);
264-
_projects = new ObservableCollection<CodeExplorerItemViewModel>(value.OrderBy(o => o.NameWithSignature));
265-
CanSearch = _projects.Any();
263+
_projects = ForceProjectsRefresh(value);
266264

267265
OnPropertyChanged();
268266
// Once a Project has been set, show the TreeView
@@ -271,6 +269,14 @@ public ObservableCollection<CodeExplorerItemViewModel> Projects
271269
}
272270
}
273271

272+
private ObservableCollection<CodeExplorerItemViewModel> ForceProjectsRefresh(ObservableCollection<CodeExplorerItemViewModel> projects)
273+
{
274+
ReorderChildNodes(projects);
275+
CanSearch = projects.Any();
276+
277+
return new ObservableCollection<CodeExplorerItemViewModel>(projects.OrderBy(o => o.NameWithSignature));
278+
}
279+
274280
private void HandleStateChanged(object sender, ParserStateEventArgs e)
275281
{
276282
if (Projects == null)
@@ -304,6 +310,8 @@ private void HandleStateChanged(object sender, ParserStateEventArgs e)
304310
UpdateNodes(Projects, newProjects);
305311

306312
Projects = new ObservableCollection<CodeExplorerItemViewModel>(newProjects);
313+
314+
FilterByName(Projects, _filterText);
307315
}
308316

309317
private void UpdateNodes(IEnumerable<CodeExplorerItemViewModel> oldList, IEnumerable<CodeExplorerItemViewModel> newList)
@@ -388,7 +396,7 @@ private void ParserState_ModuleStateChanged(object sender, ParseProgressEventArg
388396
folderNode.AddChild(newNode);
389397

390398
// Force a refresh. OnPropertyChanged("Projects") didn't work.
391-
Projects = Projects;
399+
ForceProjectsRefresh(Projects);
392400
}
393401
catch (Exception exception)
394402
{
@@ -479,6 +487,21 @@ private void SwitchNodeState(CodeExplorerItemViewModel node, bool expandedState)
479487
SwitchNodeState(item, expandedState);
480488
}
481489
}
490+
491+
private string _filterText;
492+
public string FilterText
493+
{
494+
get => _filterText;
495+
set
496+
{
497+
if (!_filterText?.Equals(value) ?? true)
498+
{
499+
_filterText = value;
500+
OnPropertyChanged();
501+
FilterByName(Projects, _filterText);
502+
}
503+
}
504+
}
482505

483506
public ObservableCollection<double> FontSizes { get; } = new ObservableCollection<double> { 8, 10, 12, 14, 16 };
484507

@@ -569,10 +592,10 @@ public void FilterByName(IEnumerable<CodeExplorerItemViewModel> nodes, string se
569592
{
570593
FilterByName(item.Items, searchString);
571594
}
572-
573-
item.IsVisible = item.Items.Any(c => c.IsVisible) ||
574-
item.Name.ToLowerInvariant().Contains(searchString.ToLowerInvariant()) ||
575-
string.IsNullOrEmpty(searchString);
595+
596+
item.IsVisible = string.IsNullOrEmpty(searchString) ||
597+
item.Items.Any(c => c.IsVisible) ||
598+
item.Name.ToLowerInvariant().Contains(searchString.ToLowerInvariant());
576599
}
577600
}
578601

Rubberduck.Core/UI/CodeExplorer/CodeExplorerControl.xaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -621,8 +621,8 @@
621621
VerticalContentAlignment="Center"
622622
IsEnabled="{Binding CanSearch}"
623623
PreviewKeyDown="SearchBox_OnPreviewKeyDown"
624-
TextChanged="SearchBox_OnTextChanged" />
625-
624+
Text="{Binding FilterText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
625+
626626
<Image Source="{StaticResource SearchImage}"
627627
HorizontalAlignment="Right" VerticalAlignment="Center"
628628
MaxHeight="16" Margin="0,0,1,0"
@@ -632,7 +632,7 @@
632632

633633
<Button Style="{StaticResource XButtonStyle}"
634634
HorizontalAlignment="Right" VerticalAlignment="Center"
635-
Height="18" Width="18" Margin="0,1,1,0"
635+
Height="16" Width="16" Margin="0,1,1,0"
636636
IsEnabled="{Binding CanSearch}"
637637
Visibility="{Binding ElementName=SearchBox, Path=Text.Length, Converter={StaticResource StringHasNoValueToVisibility}}"
638638
Click="ButtonBase_OnClick" />

Rubberduck.Core/UI/CodeExplorer/CodeExplorerControl.xaml.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public CodeExplorerControl()
1616
}
1717

1818
private CodeExplorerViewModel ViewModel => DataContext as CodeExplorerViewModel;
19-
19+
2020
private void TreeView_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
2121
{
2222
if (ViewModel != null && ViewModel.OpenCommand.CanExecute(ViewModel.SelectedItem))
@@ -32,11 +32,6 @@ private void TreeView_OnMouseRightButtonDown(object sender, MouseButtonEventArgs
3232
e.Handled = true;
3333
}
3434

35-
private void SearchBox_OnTextChanged(object sender, TextChangedEventArgs e)
36-
{
37-
ViewModel.FilterByName(ViewModel.Projects, ((TextBox)sender).Text);
38-
}
39-
4035
private void SearchIcon_OnMouseDown(object sender, MouseButtonEventArgs e)
4136
{
4237
SearchBox.Focus();

0 commit comments

Comments
 (0)