From 08d9cf277b7244f63db14715103a6b148025278a Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 14 Jun 2015 19:17:39 +0100 Subject: [PATCH] Added partial support for Advanced BlockGroups --- .../Models/TestItemFilterBlock.cs | 17 ++++++++++ .../TestItemFilterBlockTranslator.cs | 3 +- .../BlockGroupAdvancedColorConverter.cs | 22 +++++++++++++ Filtration/Filtration.csproj | 3 ++ Filtration/Models/ItemFilterBlockGroup.cs | 29 ++++++++++++++++-- .../Resources/Icons/show_advanced_icon.png | Bin 0 -> 305 bytes .../Translators/BlockGroupHierarchyBuilder.cs | 24 ++++++++++++++- .../ViewModels/ItemFilterScriptViewModel.cs | 21 +++++++++++++ Filtration/Views/IconsDictionary.xaml | 1 + Filtration/Views/ItemFilterScriptView.xaml | 1 + .../ToolPanes/BlockGroupBrowserView.xaml | 8 +++-- 11 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 Filtration/Converters/BlockGroupAdvancedColorConverter.cs create mode 100644 Filtration/Resources/Icons/show_advanced_icon.png diff --git a/Filtration.Tests/Models/TestItemFilterBlock.cs b/Filtration.Tests/Models/TestItemFilterBlock.cs index 661247b..8b45168 100644 --- a/Filtration.Tests/Models/TestItemFilterBlock.cs +++ b/Filtration.Tests/Models/TestItemFilterBlock.cs @@ -51,5 +51,22 @@ namespace Filtration.Tests.Models // Assert Assert.IsFalse(result); } + + [Test] + public void HasParentInBlockGroupHierarchy_ReturnsCorrectResult() + { + // Arrange + var testInputRootBlockGroup = new ItemFilterBlockGroup("Root Block Group", null); + var testInputSubBlockGroup = new ItemFilterBlockGroup("Sub Block Group", testInputRootBlockGroup); + var testInputSubSubBlockGroup = new ItemFilterBlockGroup("Sub Sub Block Group", testInputSubBlockGroup); + + var block = new ItemFilterBlock {BlockGroup = testInputSubSubBlockGroup}; + + // Act + + // Assert + Assert.AreEqual(true, block.HasBlockGroupInParentHierarchy(testInputRootBlockGroup, block.BlockGroup)); + Assert.AreEqual(true, block.HasBlockGroupInParentHierarchy(testInputSubBlockGroup, block.BlockGroup)); + } } } diff --git a/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs b/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs index b8148ea..a693aff 100644 --- a/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs +++ b/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs @@ -45,9 +45,10 @@ namespace Filtration.Tests.Translators { // Arrange var inputString = "Show # TestBlockGroup" + Environment.NewLine; + var inputBlockGroup = new ItemFilterBlockGroup("TestBlockGroup", null); // Act - _testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny>())).Verifiable(); + _testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny>())).Returns(inputBlockGroup).Verifiable(); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString); // Assert diff --git a/Filtration/Converters/BlockGroupAdvancedColorConverter.cs b/Filtration/Converters/BlockGroupAdvancedColorConverter.cs new file mode 100644 index 0000000..b04657d --- /dev/null +++ b/Filtration/Converters/BlockGroupAdvancedColorConverter.cs @@ -0,0 +1,22 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using System.Windows.Media; + +namespace Filtration.Converters +{ + internal class BlockGroupAdvancedColorConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var advanced = (bool) value; + + return advanced ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Black); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj index c28c718..8e3e161 100644 --- a/Filtration/Filtration.csproj +++ b/Filtration/Filtration.csproj @@ -107,6 +107,8 @@ Designer + + @@ -372,6 +374,7 @@ + Always diff --git a/Filtration/Models/ItemFilterBlockGroup.cs b/Filtration/Models/ItemFilterBlockGroup.cs index 6fd6f08..5d6edf5 100644 --- a/Filtration/Models/ItemFilterBlockGroup.cs +++ b/Filtration/Models/ItemFilterBlockGroup.cs @@ -12,10 +12,11 @@ namespace Filtration.Models private bool? _isChecked; private bool _reentrancyCheck; - public ItemFilterBlockGroup(string groupName, ItemFilterBlockGroup parent) + public ItemFilterBlockGroup(string groupName, ItemFilterBlockGroup parent, bool advanced = false) { GroupName = groupName; ParentGroup = parent; + Advanced = advanced; ChildGroups = new ObservableCollection(); } @@ -43,6 +44,8 @@ namespace Filtration.Models return outputString; } + public bool Advanced { get; private set; } + public bool? IsChecked { get @@ -91,7 +94,7 @@ namespace Filtration.Models private void UpdateChildrenCheckState() { - foreach (var childGroup in ChildGroups.Where(c => IsChecked != null)) + foreach (var childGroup in ChildGroups.Where(c => IsChecked != null && !c.Advanced)) { childGroup.IsChecked = IsChecked; } @@ -114,6 +117,28 @@ namespace Filtration.Models return null; } + public ItemFilterBlockGroup Search(Func predicate) + { + // if node is a leaf + if (ChildGroups == null || ChildGroups.Count == 0) + { + return predicate(this) ? this : null; + } + + var results = ChildGroups + .Select(i => i.Search(predicate)) + .Where(i => i != null).ToList(); + + if (results.Any()) + { + var result = (ItemFilterBlockGroup)MemberwiseClone(); + result.ChildGroups = new ObservableCollection(results); + return result; + } + return null; + } + + public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] diff --git a/Filtration/Resources/Icons/show_advanced_icon.png b/Filtration/Resources/Icons/show_advanced_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b224961db028eb7f88d5b14678df81f7d8b0f149 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMpx|Rq z7srr_xZX*-d7BL+T8zEiI*zdUOqe#$afN_(3ezkPJqd*%E4BqESX>qr99~>fJ&!A9J-_KZ<8sHZtZAu|uXgdh|LK45uvD9b#re+{zVBt9uxusQ zg;$BaZ3Yg#`x!S)v}L^~E~*{cPtyYR%wS^5GqW zj){Tj+5^@J<*gs({vGW35w7s&p>)Rc`Ul?*==&JP?_YbWL=5O%22WQ%mvv4FO#mR( Bd{zJe literal 0 HcmV?d00001 diff --git a/Filtration/Translators/BlockGroupHierarchyBuilder.cs b/Filtration/Translators/BlockGroupHierarchyBuilder.cs index 144a6c9..dd6c358 100644 --- a/Filtration/Translators/BlockGroupHierarchyBuilder.cs +++ b/Filtration/Translators/BlockGroupHierarchyBuilder.cs @@ -33,6 +33,10 @@ namespace Filtration.Translators { var inputGroups = groupStrings.ToList(); var firstGroup = inputGroups.First().Trim(); + if (firstGroup.StartsWith("~")) + { + firstGroup = firstGroup.Substring(1); + } ItemFilterBlockGroup matchingChildItemGroup = null; if (startItemGroup.ChildGroups.Count(g => g.GroupName == firstGroup) > 0) @@ -42,7 +46,7 @@ namespace Filtration.Translators if (matchingChildItemGroup == null) { - var newItemGroup = new ItemFilterBlockGroup(inputGroups.First().Trim(), startItemGroup); + var newItemGroup = CreateBlockGroup(inputGroups.First().Trim(), startItemGroup); startItemGroup.ChildGroups.Add(newItemGroup); inputGroups = inputGroups.Skip(1).ToList(); return inputGroups.Count > 0 ? IntegrateStringListIntoBlockGroupHierarchy(inputGroups, newItemGroup) : newItemGroup; @@ -50,5 +54,23 @@ namespace Filtration.Translators inputGroups = inputGroups.Skip(1).ToList(); return inputGroups.Count > 0 ? IntegrateStringListIntoBlockGroupHierarchy(inputGroups, matchingChildItemGroup) : matchingChildItemGroup; } + + private ItemFilterBlockGroup CreateBlockGroup(string groupNameString, ItemFilterBlockGroup parentGroup) + { + var advanced = false; + + if (groupNameString.StartsWith("~")) + { + groupNameString = groupNameString.Substring(1); + advanced = true; + } + + if (parentGroup.Advanced) + { + advanced = true; + } + + return new ItemFilterBlockGroup(groupNameString, parentGroup, advanced); + } } } diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs index d9ba011..3727cf0 100644 --- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs +++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs @@ -13,6 +13,7 @@ using Filtration.Models; using Filtration.Services; using Filtration.Translators; using GalaSoft.MvvmLight.CommandWpf; +using GalaSoft.MvvmLight.Messaging; using Clipboard = System.Windows.Clipboard; using MessageBox = System.Windows.MessageBox; @@ -27,6 +28,7 @@ namespace Filtration.ViewModels IEnumerable ItemFilterSectionViewModels { get; } Predicate BlockFilterPredicate { get; set; } bool IsDirty { get; } + bool ShowAdvanced { get; } string Description { get; set; } string DisplayName { get; } @@ -67,6 +69,7 @@ namespace Filtration.ViewModels _persistenceService = persistenceService; _itemFilterBlockViewModels = new ObservableCollection(); + ToggleShowAdvancedCommand = new RelayCommand(OnToggleShowAdvancedCommand); ClearFilterCommand = new RelayCommand(OnClearFilterCommand, () => BlockFilterPredicate != null); CloseCommand = new RelayCommand(OnCloseCommand); DeleteBlockCommand = new RelayCommand(OnDeleteBlockCommand, () => SelectedBlockViewModel != null); @@ -80,6 +83,7 @@ namespace Filtration.ViewModels PasteBlockCommand = new RelayCommand(OnPasteBlockCommand, () => SelectedBlockViewModel != null); } + public RelayCommand ToggleShowAdvancedCommand { get; private set; } public RelayCommand ClearFilterCommand { get; private set; } public RelayCommand CloseCommand { get; private set; } public RelayCommand DeleteBlockCommand { get; private set; } @@ -150,6 +154,16 @@ namespace Filtration.ViewModels } } + public bool ShowAdvanced + { + get { return _showAdvanced; } + private set + { + _showAdvanced = value; + RaisePropertyChanged(); + } + } + public IItemFilterBlockViewModel SelectedBlockViewModel { get { return _selectedBlockViewModel; } @@ -223,6 +237,7 @@ namespace Filtration.ViewModels } private bool _filenameIsFake; + private bool _showAdvanced; public void Initialise(ItemFilterScript itemFilterScript, bool newScript) { @@ -384,6 +399,12 @@ namespace Filtration.ViewModels _avalonDockWorkspaceViewModel.CloseDocument(this); } + private void OnToggleShowAdvancedCommand(bool showAdvanced) + { + ShowAdvanced = !ShowAdvanced; + Messenger.Default.Send(new NotificationMessage(ShowAdvanced, "ShowAdvancedToggled")); + } + private void OnClearFilterCommand() { BlockFilterPredicate = null; diff --git a/Filtration/Views/IconsDictionary.xaml b/Filtration/Views/IconsDictionary.xaml index d5b4f3b..5e80a81 100644 --- a/Filtration/Views/IconsDictionary.xaml +++ b/Filtration/Views/IconsDictionary.xaml @@ -19,4 +19,5 @@ + \ No newline at end of file diff --git a/Filtration/Views/ItemFilterScriptView.xaml b/Filtration/Views/ItemFilterScriptView.xaml index b9ed597..5c08248 100644 --- a/Filtration/Views/ItemFilterScriptView.xaml +++ b/Filtration/Views/ItemFilterScriptView.xaml @@ -61,6 +61,7 @@