From aa433ad685fc5158263fbef45f1053332452eb7d Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 11 Jun 2015 22:01:52 +0100 Subject: [PATCH] Added Show/Hide functionality to the checkboxes in the Block Group Browser --- .../TestItemFilterBlockTranslator.cs | 30 ++++++++++++++ Filtration/Filtration.csproj | 1 + Filtration/Models/ItemFilterBlock.cs | 41 ++++++++++++++++++- Filtration/Models/ItemFilterBlockGroup.cs | 21 +++++++--- .../Translators/ItemFilterBlockTranslator.cs | 1 + .../AvalonDockWorkspaceViewModel.cs | 1 + 6 files changed, 88 insertions(+), 7 deletions(-) diff --git a/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs b/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs index 93c38b4..b8148ea 100644 --- a/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs +++ b/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs @@ -54,6 +54,36 @@ namespace Filtration.Tests.Translators _testUtility.MockBlockGroupHierarchyBuilder.Verify(); } + [Test] + public void TranslateStringToItemFilterBlock_ShowBlock_SetsBlockGroupIsCheckedCorrectly() + { + // Arrange + var inputString = "Show # TestBlockGroup" + Environment.NewLine; + var inputBlockGroup = new ItemFilterBlockGroup("TestBlockGroup", null); + + // Act + _testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny>())).Returns(inputBlockGroup).Verifiable(); + _testUtility.Translator.TranslateStringToItemFilterBlock(inputString); + + // Assert + Assert.AreEqual(true, inputBlockGroup.IsChecked); + } + + [Test] + public void TranslateStringToItemFilterBlock_HideBlock_SetsBlockGroupIsCheckedCorrectly() + { + // Arrange + var inputString = "Hide # TestBlockGroup" + Environment.NewLine; + var inputBlockGroup = new ItemFilterBlockGroup("TestBlockGroup", null); + + // Act + _testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny>())).Returns(inputBlockGroup).Verifiable(); + _testUtility.Translator.TranslateStringToItemFilterBlock(inputString); + + // Assert + Assert.AreEqual(false, inputBlockGroup.IsChecked); + } + [Test] public void TranslateStringToItemFilterBlock_NoBlockGroupComment_CallsBlockGroupHierarchyBuilder() { diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj index 173b505..46eccf5 100644 --- a/Filtration/Filtration.csproj +++ b/Filtration/Filtration.csproj @@ -61,6 +61,7 @@ + ..\packages\WPFToolkit.3.5.50211.1\lib\System.Windows.Controls.Input.Toolkit.dll diff --git a/Filtration/Models/ItemFilterBlock.cs b/Filtration/Models/ItemFilterBlock.cs index 1495958..3279ee3 100644 --- a/Filtration/Models/ItemFilterBlock.cs +++ b/Filtration/Models/ItemFilterBlock.cs @@ -8,13 +8,40 @@ namespace Filtration.Models { internal class ItemFilterBlock { + private ItemFilterBlockGroup _blockGroup; + public ItemFilterBlock() { BlockItems = new ObservableCollection {new ActionBlockItem(BlockAction.Show)}; } public string Description { get; set; } - public ItemFilterBlockGroup BlockGroup { get; set; } + + public ItemFilterBlockGroup BlockGroup + { + get { return _blockGroup; } + set + { + var oldBlockGroup = _blockGroup; + _blockGroup = value; + + if (_blockGroup != null) + { + _blockGroup.BlockGroupStatusChanged += OnBlockGroupStatusChanged; + if (oldBlockGroup != null) + { + oldBlockGroup.BlockGroupStatusChanged -= OnBlockGroupStatusChanged; + } + } + else + { + if (oldBlockGroup != null) + { + oldBlockGroup.BlockGroupStatusChanged -= OnBlockGroupStatusChanged; + } + } + } + } public BlockAction Action { @@ -47,5 +74,17 @@ namespace Filtration.Models { return BlockItems.Count(b => b is T) > 0; } + + private void OnBlockGroupStatusChanged(object sender, EventArgs e) + { + if (BlockGroup.IsChecked == false && Action == BlockAction.Show) + { + Action = BlockAction.Hide; + } + else if (BlockGroup.IsChecked == true && Action == BlockAction.Hide) + { + Action = BlockAction.Show; + } + } } } diff --git a/Filtration/Models/ItemFilterBlockGroup.cs b/Filtration/Models/ItemFilterBlockGroup.cs index 851542f..6fd6f08 100644 --- a/Filtration/Models/ItemFilterBlockGroup.cs +++ b/Filtration/Models/ItemFilterBlockGroup.cs @@ -1,4 +1,5 @@ -using System.Collections.ObjectModel; +using System; +using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; @@ -17,11 +18,16 @@ namespace Filtration.Models ParentGroup = parent; ChildGroups = new ObservableCollection(); } + + public event EventHandler BlockGroupStatusChanged; + public string GroupName { get; private set; } + public ItemFilterBlockGroup ParentGroup { get; private set; } + public ObservableCollection ChildGroups { get; private set; } public override string ToString() { var currentBlockGroup = this; - + var outputString = GroupName; // TODO: This is retarded, fix this. @@ -37,10 +43,6 @@ namespace Filtration.Models return outputString; } - public string GroupName { get; private set; } - public ItemFilterBlockGroup ParentGroup { get; private set; } - public ObservableCollection ChildGroups { get; private set; } - public bool? IsChecked { get @@ -59,6 +61,13 @@ namespace Filtration.Models _isChecked = value; UpdateCheckState(); OnPropertyChanged(); + + // Raise an event to let blocks that have this block group assigned that + // they might need to change their Action due to the block group status changing. + if (BlockGroupStatusChanged != null) + { + BlockGroupStatusChanged.Invoke(null, null); + } _reentrancyCheck = false; } } diff --git a/Filtration/Translators/ItemFilterBlockTranslator.cs b/Filtration/Translators/ItemFilterBlockTranslator.cs index 4ada0e3..d5e616c 100644 --- a/Filtration/Translators/ItemFilterBlockTranslator.cs +++ b/Filtration/Translators/ItemFilterBlockTranslator.cs @@ -274,6 +274,7 @@ namespace Filtration.Translators if (blockGroups.Count(b => !string.IsNullOrEmpty(b.Trim())) > 0) { block.BlockGroup = _blockGroupHierarchyBuilder.IntegrateStringListIntoBlockGroupHierarchy(blockGroups); + block.BlockGroup.IsChecked = block.Action == BlockAction.Show; } } diff --git a/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs b/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs index e84d040..8b9b3d0 100644 --- a/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs +++ b/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs @@ -112,6 +112,7 @@ namespace Filtration.ViewModels if (document.IsScript) { _sectionBrowserViewModel.ClearDown(); + _blockGroupBrowserViewModel.ClearDown(); } OpenDocuments.Remove(document);