Add section search feature

This commit is contained in:
azakhi 2018-08-24 18:03:38 +03:00
parent 1eaf0b6fe5
commit d0bc0b6864
3 changed files with 62 additions and 4 deletions

View File

@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Windows.Data;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using GalaSoft.MvvmLight.Messaging; using GalaSoft.MvvmLight.Messaging;
@ -15,6 +17,8 @@ namespace Filtration.ViewModels.ToolPanes
{ {
private IEnumerable<IItemFilterCommentBlockViewModel> _itemFilterCommentBlockViewModels; private IEnumerable<IItemFilterCommentBlockViewModel> _itemFilterCommentBlockViewModels;
private IItemFilterCommentBlockViewModel _selectedItemFilterCommentBlockViewModel; private IItemFilterCommentBlockViewModel _selectedItemFilterCommentBlockViewModel;
private CollectionView _commentBlocksView;
private string _searchText;
public CommentBlockBrowserViewModel() : base("Section Browser") public CommentBlockBrowserViewModel() : base("Section Browser")
{ {
@ -24,7 +28,9 @@ namespace Filtration.ViewModels.ToolPanes
icon.UriSource = new Uri("pack://application:,,,/Filtration;component/Resources/Icons/add_section_icon.png"); icon.UriSource = new Uri("pack://application:,,,/Filtration;component/Resources/Icons/add_section_icon.png");
icon.EndInit(); icon.EndInit();
IconSource = icon; IconSource = icon;
_searchText = "";
_commentBlocksView = (CollectionView)CollectionViewSource.GetDefaultView(new List<IItemFilterCommentBlockViewModel>());
Messenger.Default.Register<NotificationMessage>(this, message => Messenger.Default.Register<NotificationMessage>(this, message =>
{ {
switch (message.Notification) switch (message.Notification)
@ -46,7 +52,23 @@ namespace Filtration.ViewModels.ToolPanes
private set private set
{ {
_itemFilterCommentBlockViewModels = value; _itemFilterCommentBlockViewModels = value;
RaisePropertyChanged();
_commentBlocksView = _itemFilterCommentBlockViewModels != null ?
(CollectionView)CollectionViewSource.GetDefaultView(_itemFilterCommentBlockViewModels)
: (CollectionView)CollectionViewSource.GetDefaultView(new List<IItemFilterCommentBlockViewModel>());
_commentBlocksView.Filter = SearchFilter;
_commentBlocksView.Refresh();
RaisePropertyChanged("CommentBlocksView");
}
}
public CollectionView CommentBlocksView
{
get => _commentBlocksView;
private set
{
_commentBlocksView = value;
} }
} }
@ -64,6 +86,18 @@ namespace Filtration.ViewModels.ToolPanes
} }
} }
public string SearchText
{
get => _searchText;
set
{
_searchText = value;
_commentBlocksView.Refresh();
RaisePropertyChanged();
RaisePropertyChanged("CommentBlocksView");
}
}
protected override void OnActiveDocumentChanged(object sender, EventArgs e) protected override void OnActiveDocumentChanged(object sender, EventArgs e)
{ {
if (AvalonDockWorkspaceViewModel.ActiveScriptViewModel != null && AvalonDockWorkspaceViewModel.ActiveDocument.IsScript) if (AvalonDockWorkspaceViewModel.ActiveScriptViewModel != null && AvalonDockWorkspaceViewModel.ActiveDocument.IsScript)
@ -81,5 +115,24 @@ namespace Filtration.ViewModels.ToolPanes
ItemFilterCommentBlockViewModels = null; ItemFilterCommentBlockViewModels = null;
SelectedItemFilterCommentBlockViewModel = null; SelectedItemFilterCommentBlockViewModel = null;
} }
private bool SearchFilter(object obj)
{
if (string.IsNullOrEmpty(_searchText))
return true;
var block = obj as IItemFilterCommentBlockViewModel;
var searchWords = Regex.Split(_searchText, @"\s+");
foreach(var word in searchWords)
{
if (string.IsNullOrEmpty(word))
continue;
if (block.Comment.IndexOf(word, StringComparison.OrdinalIgnoreCase) >= 0)
return true;
}
return false;
}
} }
} }

View File

@ -94,7 +94,7 @@
<xcad:LayoutRoot> <xcad:LayoutRoot>
<xcad:LayoutPanel Orientation="Horizontal"> <xcad:LayoutPanel Orientation="Horizontal">
<xcad:LayoutAnchorablePane Name="SectionBrowserPane" DockWidth="150" /> <xcad:LayoutAnchorablePane Name="SectionBrowserPane" DockWidth="200" />
<xcad:LayoutPanel Orientation="Vertical"> <xcad:LayoutPanel Orientation="Vertical">
<xcad:LayoutDocumentPane /> <xcad:LayoutDocumentPane />
</xcad:LayoutPanel> </xcad:LayoutPanel>

View File

@ -13,7 +13,12 @@
<converters:HashSignRemovalConverter x:Key="HashSignRemovalConverter" /> <converters:HashSignRemovalConverter x:Key="HashSignRemovalConverter" />
</UserControl.Resources> </UserControl.Resources>
<Grid> <Grid>
<ListBox ItemsSource="{Binding ItemFilterCommentBlockViewModels}" <Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" Height="30" Padding="0,-10,0,0" />
<ListBox Grid.Row="1" ItemsSource="{Binding CommentBlocksView}"
SelectedItem="{Binding SelectedItemFilterCommentBlockViewModel}" SelectedItem="{Binding SelectedItemFilterCommentBlockViewModel}"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"><!--SelectionChanged="SectionBrowserListBox_OnSelectionChanged"--> ScrollViewer.HorizontalScrollBarVisibility="Hidden"><!--SelectionChanged="SectionBrowserListBox_OnSelectionChanged"-->
<ListBox.Resources> <ListBox.Resources>