From bdd121f48c43401724043f0b9c92fcf8bfdd30ee Mon Sep 17 00:00:00 2001 From: azakhi Date: Mon, 3 Sep 2018 11:26:13 +0300 Subject: [PATCH] Fix block group browser not filtering --- .../ViewModels/ItemFilterScriptViewModel.cs | 141 ++++++------------ 1 file changed, 43 insertions(+), 98 deletions(-) diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs index a5b3c15..67db330 100644 --- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs +++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs @@ -84,7 +84,7 @@ namespace Filtration.ViewModels void MoveBlockUp(IItemFilterBlockViewModelBase targetBlockViewModelBase); void MoveBlockDown(IItemFilterBlockViewModelBase targetBlockViewModelBase); void MoveBlockToBottom(IItemFilterBlockViewModelBase targetBlockViewModelBase); - void ToggleSection(IItemFilterCommentBlockViewModel targetCommentBlockViewModelBase, bool updateViewModels = true); + void ToggleSection(IItemFilterCommentBlockViewModel targetCommentBlockViewModelBase, bool deferPropertyChanged = false); } internal class ItemFilterScriptViewModel : PaneViewModel, IItemFilterScriptViewModel @@ -103,8 +103,6 @@ namespace Filtration.ViewModels private IItemFilterBlockViewModelBase _selectedBlockViewModel; private IItemFilterCommentBlockViewModel _sectionBrowserSelectedBlockViewModel; private readonly ObservableCollection _itemFilterBlockViewModels; - private ObservableCollection _viewItemFilterBlockViewModels; - private ICollectionView _itemFilterBlockViewModelsCollectionView; private Predicate _blockFilterPredicate; private ICommandManager _scriptCommandManager; @@ -164,8 +162,6 @@ namespace Filtration.ViewModels icon.EndInit(); IconSource = icon; - _viewItemFilterBlockViewModels = new ObservableCollection(); - _customSoundsAvailable = new ObservableCollection(); var poeFolderFiles = Directory.GetFiles(persistenceService.DefaultPathOfExileDirectory() + "\\").Where( @@ -217,7 +213,6 @@ namespace Filtration.ViewModels ContentId = "ScriptContentId"; CollapseAllSections(); - UpdateBlockModelsForView(); } private void ItemFilterBlocksOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs) @@ -241,7 +236,7 @@ namespace Filtration.ViewModels } } - UpdateBlockModelsForView(); + RaisePropertyChanged(nameof(ViewItemFilterBlockViewModels)); } private void CustomSoundsAvailableOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs) @@ -353,16 +348,34 @@ namespace Filtration.ViewModels } } - public ObservableCollection ViewItemFilterBlockViewModels + public ICollectionView ViewItemFilterBlockViewModels { get { - return _viewItemFilterBlockViewModels; - } - set - { - _viewItemFilterBlockViewModels = value; - RaisePropertyChanged(); + ICollectionView filteredView = CollectionViewSource.GetDefaultView(ItemFilterBlockViewModels); + filteredView.Filter = BlockFilter; + + IItemFilterBlockViewModelBase previousBlock = null; + foreach (IItemFilterBlockViewModelBase block in filteredView) + { + if (block is IItemFilterBlockViewModel) + { + if (previousBlock is IItemFilterCommentBlockViewModel) + { + (previousBlock as IItemFilterCommentBlockViewModel).HasChild = true; + } + } + else if (block is IItemFilterCommentBlockViewModel) + { + (block as IItemFilterCommentBlockViewModel).HasChild = false; + } + previousBlock = block; + } + + ICollectionView visibilityView = CollectionViewSource.GetDefaultView(filteredView.Cast()); + visibilityView.Filter = BlockVisibilityFilter; + + return visibilityView; } } @@ -370,10 +383,6 @@ namespace Filtration.ViewModels { get { - _itemFilterBlockViewModelsCollectionView = - CollectionViewSource.GetDefaultView(_itemFilterBlockViewModels); - _itemFilterBlockViewModelsCollectionView.Filter = BlockFilter; - return _itemFilterBlockViewModels; } } @@ -392,6 +401,11 @@ namespace Filtration.ViewModels return ShowBlockBasedOnAdvanced(blockViewModel); } + private bool BlockVisibilityFilter(object item) + { + return (bool)(item as IItemFilterBlockViewModelBase)?.IsVisible; + } + private bool ShowBlockBasedOnAdvanced(IItemFilterBlockViewModel blockViewModel) { if (ShowAdvanced) @@ -414,7 +428,7 @@ namespace Filtration.ViewModels set { _blockFilterPredicate = value; - RaisePropertyChanged(nameof(ItemFilterBlockViewModels)); + RaisePropertyChanged(nameof(ViewItemFilterBlockViewModels)); } } @@ -436,7 +450,7 @@ namespace Filtration.ViewModels { _showAdvanced = value; RaisePropertyChanged(); - RaisePropertyChanged(nameof(ItemFilterBlockViewModels)); + RaisePropertyChanged(nameof(ViewItemFilterBlockViewModels)); } } @@ -1353,124 +1367,55 @@ namespace Filtration.ViewModels } } - public void ToggleSection(IItemFilterCommentBlockViewModel targetCommentBlockViewModelBase, bool updateViewModels = true) + public void ToggleSection(IItemFilterCommentBlockViewModel targetCommentBlockViewModelBase, bool deferPropertyChanged = false) { var newState = !targetCommentBlockViewModelBase.IsExpanded; targetCommentBlockViewModelBase.IsExpanded = newState; var sectionIndex = ItemFilterBlockViewModels.IndexOf(targetCommentBlockViewModelBase); - var viewIndex = ViewItemFilterBlockViewModels.IndexOf(targetCommentBlockViewModelBase); for (int i = sectionIndex + 1; i < ItemFilterBlockViewModels.Count; i++) { var block = ItemFilterBlockViewModels[i] as IItemFilterBlockViewModel; if (block != null) { - if (newState) - viewIndex++; - - if (newState == block.IsVisible) - { - continue; - } - - if(updateViewModels) - { - if(newState) - { - if(viewIndex < ViewItemFilterBlockViewModels.Count) - { - ViewItemFilterBlockViewModels.Insert(viewIndex, block); - } - else - { - ViewItemFilterBlockViewModels.Add(block); - } - } - else - { - ViewItemFilterBlockViewModels.RemoveAt(viewIndex + 1); - } - } block.IsVisible = newState; } else break; } - } - private void UpdateBlockModelsForView() - { - ObservableCollection blocksForView = new ObservableCollection(); - for (var i = 0; i < ItemFilterBlockViewModels.Count; i++) - { - var block = ItemFilterBlockViewModels[i]; - if (block.IsVisible) - { - blocksForView.Add(block); - - var blockAsComment = block as IItemFilterCommentBlockViewModel; - if(blockAsComment != null && i < (ItemFilterBlockViewModels.Count - 1)) - { - var followingBlock = ItemFilterBlockViewModels[i + 1] as IItemFilterBlockViewModel; - if(followingBlock != null) - { - blockAsComment.HasChild = true; - } - else - { - blockAsComment.HasChild = false; - } - } - } - } - - ViewItemFilterBlockViewModels = blocksForView; + if (!deferPropertyChanged) + RaisePropertyChanged(nameof(ViewItemFilterBlockViewModels)); } private void CollapseAllSections() { - ObservableCollection blocksForView = new ObservableCollection(); for (int i = 0; i < ItemFilterBlockViewModels.Count; i++) { var block = ItemFilterBlockViewModels[i] as IItemFilterCommentBlockViewModel; if (block != null) { - blocksForView.Add(block); - if(block.IsExpanded) { - ToggleSection(block, false); + ToggleSection(block, true); } } } - - if (SelectedBlockViewModel == null && blocksForView.Count > 0) - { - SelectedBlockViewModel = blocksForView[0]; - } - - ViewItemFilterBlockViewModels = blocksForView; + + RaisePropertyChanged(nameof(ViewItemFilterBlockViewModels)); } private void ExpandAllSections() { - ObservableCollection blocksForView = new ObservableCollection(); for (int i = 0; i < ItemFilterBlockViewModels.Count; i++) { - blocksForView.Add(ItemFilterBlockViewModels[i]); - var block = ItemFilterBlockViewModels[i] as IItemFilterCommentBlockViewModel; if (block != null && !block.IsExpanded) { - ToggleSection(block, false); + ToggleSection(block, true); } } - - if(SelectedBlockViewModel == null && blocksForView.Count > 0) - { - SelectedBlockViewModel = blocksForView[0]; - } - - ViewItemFilterBlockViewModels = blocksForView; + + RaisePropertyChanged(nameof(ViewItemFilterBlockViewModels)); } } }