From 3a628df74457e50339764b280732ba5e5bdee133 Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 28 Jun 2015 22:46:29 +0100 Subject: [PATCH] Fixed single line script description bug Style tweaks inc. block selection style --- .../TestItemFilterBlockTranslator.cs | 34 ++++++++++++++++++- .../TestItemFilterScriptTranslator.cs | 21 ++++++++++++ .../Translators/ItemFilterBlockTranslator.cs | 19 ++++++++--- .../Translators/ItemFilterScriptTranslator.cs | 4 ++- .../ViewModels/ItemFilterBlockViewModel.cs | 14 ++++++-- .../ViewModels/ItemFilterScriptViewModel.cs | 6 ++++ Filtration/Views/ItemFilterBlockView.xaml | 2 +- Filtration/Views/ItemFilterScriptView.xaml | 32 +++++++++-------- Filtration/Views/MainWindow.xaml | 4 +++ Filtration/Views/ReplaceColorsWindow.xaml | 4 +-- 10 files changed, 115 insertions(+), 25 deletions(-) diff --git a/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs b/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs index 4393ff5..75d8244 100644 --- a/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs +++ b/Filtration.Tests/Translators/TestItemFilterBlockTranslator.cs @@ -1346,6 +1346,7 @@ namespace Filtration.Tests.Translators Assert.AreEqual(new Color { R = 240, G = 200, B = 150, A = 255}, textColorBlockItem.Color); } + [Ignore("Not currently possible - will not be necessary once commanding (to enable undo history) is implemented anyway")] [Test] public void ReplaceColorBlockItemsFromString_MalformedLine_DoesNothing() { @@ -1409,8 +1410,9 @@ namespace Filtration.Tests.Translators "SetBackgroundColor 0 0 0 # Rarest Currency Background" + Environment.NewLine + "SetBorderColor 255 255 255 # Rarest Currency Border"; + var testInputBlockItems = new ObservableCollection(); - + // Act _testUtility.Translator.ReplaceColorBlockItemsFromString(testInputBlockItems, testInputString); @@ -1428,6 +1430,36 @@ namespace Filtration.Tests.Translators Assert.AreEqual(new Color { A = 255, R = 255, G = 255, B = 255 }, borderColorBlockItem.Color); } + [Test] + public void ReplaceColorBlockItemsFromString_MultipleLines_SomeExistingBlockItems() + { + // Arrange + var testInputString = "SetTextColor 240 200 150 # Rarest Currency" + Environment.NewLine + + "SetBackgroundColor 0 0 0 # Rarest Currency Background"; + + var testInputBlockItems = new ObservableCollection(); + var testInputTextColorBlockItem = new TextColorBlockItem(Colors.Red); + var testInputBackgroundColorBlockItem = new BackgroundColorBlockItem(Colors.Blue); + var testInpuBorderColorBlockItem = new BorderColorBlockItem(Colors.Yellow); + testInputBlockItems.Add(testInputTextColorBlockItem); + testInputBlockItems.Add(testInputBackgroundColorBlockItem); + testInputBlockItems.Add(testInpuBorderColorBlockItem); + + // Act + _testUtility.Translator.ReplaceColorBlockItemsFromString(testInputBlockItems, testInputString); + + // Assert + var textColorBlockItem = testInputBlockItems.First(b => b is TextColorBlockItem) as TextColorBlockItem; + Assert.IsNotNull(textColorBlockItem); + Assert.AreEqual(new Color { A = 255, R = 240, G = 200, B = 150 }, textColorBlockItem.Color); + + var backgroundColorBlockItem = testInputBlockItems.First(b => b is BackgroundColorBlockItem) as BackgroundColorBlockItem; + Assert.IsNotNull(backgroundColorBlockItem); + Assert.AreEqual(new Color { A = 255, R = 0, G = 0, B = 0 }, backgroundColorBlockItem.Color); + + Assert.AreEqual(0, testInputBlockItems.Count(b => b is BorderColorBlockItem)); + } + private class ItemFilterBlockTranslatorTestUtility { public ItemFilterBlockTranslatorTestUtility() diff --git a/Filtration.Tests/Translators/TestItemFilterScriptTranslator.cs b/Filtration.Tests/Translators/TestItemFilterScriptTranslator.cs index 86b5015..cb38bf9 100644 --- a/Filtration.Tests/Translators/TestItemFilterScriptTranslator.cs +++ b/Filtration.Tests/Translators/TestItemFilterScriptTranslator.cs @@ -265,7 +265,28 @@ namespace Filtration.Tests.Translators Assert.AreEqual(4, block.BlockItems.Count); var baseTypeItem = block.BlockItems.OfType().First(); Assert.AreEqual(2, baseTypeItem.Items.Count); + } + [Test] + public void TranslateStringToItemFilterScript_OneLineDescriptionNoBlockDescriptionAddsDescriptionToScript() + { + // Arrange + var testInputScript = "# Script edited with Filtration - https://github.com/ben-wallis/Filtration" + + Environment.NewLine + + "Show" + Environment.NewLine + + "BaseType \"Maelström Staff\"" + Environment.NewLine + Environment.NewLine; + var blockTranslator = new ItemFilterBlockTranslator(_testUtility.MockBlockGroupHierarchyBuilder.Object, + _testUtility.MockThemeComponentListBuilder.Object); + var translator = new ItemFilterScriptTranslator(blockTranslator, + _testUtility.MockBlockGroupHierarchyBuilder.Object, _testUtility.MockThemeComponentListBuilder.Object); + + // Act + var result = translator.TranslateStringToItemFilterScript(testInputScript); + + // Assert + Assert.AreEqual("Script edited with Filtration - https://github.com/ben-wallis/Filtration", result.Description); + var firstBlock = result.ItemFilterBlocks.First(); + Assert.IsNullOrEmpty(firstBlock.Description); } private class ItemFilterScriptTranslatorTestUtility diff --git a/Filtration/Translators/ItemFilterBlockTranslator.cs b/Filtration/Translators/ItemFilterBlockTranslator.cs index c4f2ecc..6169dec 100644 --- a/Filtration/Translators/ItemFilterBlockTranslator.cs +++ b/Filtration/Translators/ItemFilterBlockTranslator.cs @@ -302,6 +302,15 @@ namespace Filtration.Translators public void ReplaceColorBlockItemsFromString(ObservableCollection blockItems , string inputString) { + // Reverse iterate to remove existing IAudioVisualBlockItems + for (var idx = blockItems.Count - 1; idx >= 0; idx--) + { + if (blockItems[idx] is IAudioVisualBlockItem) + { + blockItems.RemoveAt(idx); + } + } + foreach (var line in new LineReader(() => new StringReader(inputString))) { var matches = Regex.Match(line, @"(\w+)"); @@ -310,22 +319,24 @@ namespace Filtration.Translators { case "SetTextColor": { - ReplaceColorBlockItem(blockItems, line); + blockItems.Add(GetColorBlockItemFromString(line)); break; } case "SetBackgroundColor": { - ReplaceColorBlockItem(blockItems, line); + blockItems.Add(GetColorBlockItemFromString(line)); break; } case "SetBorderColor": { - ReplaceColorBlockItem(blockItems, line); + blockItems.Add(GetColorBlockItemFromString(line)); break; } case "SetFontSize": { - ReplaceFontSizeBlockItem(blockItems, line); + var match = Regex.Match(line, @"\s+(\d+)"); + if (!match.Success) break; + blockItems.Add(new FontSizeBlockItem(Convert.ToInt16(match.Value))); break; } } diff --git a/Filtration/Translators/ItemFilterScriptTranslator.cs b/Filtration/Translators/ItemFilterScriptTranslator.cs index bc0f61e..81d0f18 100644 --- a/Filtration/Translators/ItemFilterScriptTranslator.cs +++ b/Filtration/Translators/ItemFilterScriptTranslator.cs @@ -90,7 +90,9 @@ namespace Filtration.Translators { // If the line previous to the Show or Hide line is a comment then we should include that in the block // as it represents the block description. - blockBoundaries.AddLast(previousLine.StartsWith("#") && !previousLine.StartsWith("# Section:") ? currentLine - 2 : currentLine - 1); + // currentLine > 2 caters for an edge case where the script description is a single line and the first + // block has no description. This prevents the script description from being assigned to the first block's description. + blockBoundaries.AddLast(previousLine.StartsWith("#") && !previousLine.StartsWith("# Section:") && currentLine > 2 ? currentLine - 2 : currentLine - 1); } previousLine = line; } diff --git a/Filtration/ViewModels/ItemFilterBlockViewModel.cs b/Filtration/ViewModels/ItemFilterBlockViewModel.cs index bd9d4da..adee0b0 100644 --- a/Filtration/ViewModels/ItemFilterBlockViewModel.cs +++ b/Filtration/ViewModels/ItemFilterBlockViewModel.cs @@ -32,7 +32,8 @@ namespace Filtration.ViewModels private ItemFilterScriptViewModel _parentScriptViewModel; private bool _displaySettingsPopupOpen; - + private bool _isExpanded; + public ItemFilterBlockViewModel(IStaticDataService staticDataService, IReplaceColorsViewModel replaceColorsViewModel) { _staticDataService = staticDataService; @@ -98,7 +99,16 @@ namespace Filtration.ViewModels public ItemFilterBlock Block { get; private set; } public bool IsDirty { get; set; } - public bool IsExpanded { get; set; } + + public bool IsExpanded + { + get { return _isExpanded; } + set + { + _isExpanded = value; + RaisePropertyChanged(); + } + } public ObservableCollection BlockItems { diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs index c764d14..a7295fe 100644 --- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs +++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs @@ -308,6 +308,11 @@ namespace Filtration.ViewModels Script.FilePath = "Untitled.filter"; } + if (ItemFilterBlockViewModels.Count > 0) + { + SelectedBlockViewModel = ItemFilterBlockViewModels.First(); + } + Title = Filename; ContentId = "testcontentid"; } @@ -645,6 +650,7 @@ namespace Filtration.ViewModels } SelectedBlockViewModel = vm; + vm.IsExpanded = true; IsDirty = true; } diff --git a/Filtration/Views/ItemFilterBlockView.xaml b/Filtration/Views/ItemFilterBlockView.xaml index 6e86fa2..3906c19 100644 --- a/Filtration/Views/ItemFilterBlockView.xaml +++ b/Filtration/Views/ItemFilterBlockView.xaml @@ -117,7 +117,7 @@ Height="15" Width="15" Margin="0,0,3,0" Visibility="{Binding HasSound, Converter={StaticResource BooleanVisibilityConverter}}" /> - - + - + @@ -51,10 +51,9 @@ - + - - - diff --git a/Filtration/Views/MainWindow.xaml b/Filtration/Views/MainWindow.xaml index 1ceba38..9361499 100644 --- a/Filtration/Views/MainWindow.xaml +++ b/Filtration/Views/MainWindow.xaml @@ -12,6 +12,10 @@ mc:Ignorable="d" d:DataContext="{d:DesignInstance Type=viewModels:MainWindowViewModel}" Title="{Binding WindowTitle}" Height="768" Width="1100" BorderThickness="1" BorderBrush="Black" IsIconVisible="True" > + + + + diff --git a/Filtration/Views/ReplaceColorsWindow.xaml b/Filtration/Views/ReplaceColorsWindow.xaml index f03fb47..a932a5e 100644 --- a/Filtration/Views/ReplaceColorsWindow.xaml +++ b/Filtration/Views/ReplaceColorsWindow.xaml @@ -8,9 +8,9 @@ xmlns:userControls="clr-namespace:Filtration.UserControls" mc:Ignorable="d" d:DataContext="{d:DesignInstance Type=viewModels:ReplaceColorsViewModel}" - Title="Replace Script Colors" Height="230" Width="500" + Title="Replace Script Colors" Height="245" Width="515" BorderThickness="1" BorderBrush="Black" - Loaded="ReplaceColorsWindow_OnLoaded"> + Loaded="ReplaceColorsWindow_OnLoaded" ResizeMode="CanMinimize">