diff --git a/Filtration.ObjectModel/BlockItemBaseTypes/StringBlockItem.cs b/Filtration.ObjectModel/BlockItemBaseTypes/StringBlockItem.cs new file mode 100644 index 0000000..3d3f879 --- /dev/null +++ b/Filtration.ObjectModel/BlockItemBaseTypes/StringBlockItem.cs @@ -0,0 +1,35 @@ +using System.Windows.Media; + +namespace Filtration.ObjectModel.BlockItemBaseTypes +{ + public abstract class StringBlockItem : BlockItemBase, IAudioVisualBlockItem + { + private string _value; + + protected StringBlockItem() + { + } + + protected StringBlockItem(string value) + { + Value = value; + } + + public override string OutputText => PrefixText + " " + Value; + + public override string SummaryText => string.Empty; + public override Color SummaryBackgroundColor => Colors.Transparent; + public override Color SummaryTextColor => Colors.Transparent; + + public string Value + { + get { return _value; } + set + { + _value = value; + IsDirty = true; + OnPropertyChanged(); + } + } + } +} \ No newline at end of file diff --git a/Filtration.ObjectModel/BlockItemTypes/IconBlockItem.cs b/Filtration.ObjectModel/BlockItemTypes/IconBlockItem.cs new file mode 100644 index 0000000..4d84203 --- /dev/null +++ b/Filtration.ObjectModel/BlockItemTypes/IconBlockItem.cs @@ -0,0 +1,21 @@ +using Filtration.ObjectModel.BlockItemBaseTypes; + +namespace Filtration.ObjectModel.BlockItemTypes +{ + public class IconBlockItem : StringBlockItem + { + public IconBlockItem() + { + Value = "Icon1"; + } + + public IconBlockItem(string value) : base(value) + { + } + + public override string PrefixText => "Icon"; + public override int MaximumAllowed => 1; + public override string DisplayHeading => "Drop Icon"; + public override int SortOrder => 28; + } +} diff --git a/Filtration.ObjectModel/Filtration.ObjectModel.csproj b/Filtration.ObjectModel/Filtration.ObjectModel.csproj index 8db75c7..fcf9bdc 100644 --- a/Filtration.ObjectModel/Filtration.ObjectModel.csproj +++ b/Filtration.ObjectModel/Filtration.ObjectModel.csproj @@ -53,6 +53,7 @@ + @@ -65,6 +66,7 @@ + diff --git a/Filtration.ObjectModel/ItemFilterBlock.cs b/Filtration.ObjectModel/ItemFilterBlock.cs index 76eee4f..831d3d0 100644 --- a/Filtration.ObjectModel/ItemFilterBlock.cs +++ b/Filtration.ObjectModel/ItemFilterBlock.cs @@ -23,6 +23,7 @@ namespace Filtration.ObjectModel Color DisplayTextColor { get; } Color DisplayBorderColor { get; } double DisplayFontSize { get; } + string DisplayIcon { get; } bool HasBlockItemOfType(); bool HasBlockGroupInParentHierarchy(ItemFilterBlockGroup targetBlockGroup, ItemFilterBlockGroup startingBlockGroup); } @@ -260,5 +261,14 @@ namespace Filtration.ObjectModel return fontSizeBlockItem?.Value ?? 34; } } + + public string DisplayIcon + { + get + { + var displayIcon = BlockItems.OfType().FirstOrDefault(); + return (displayIcon != null) ? displayIcon.Value : ""; + } + } } } diff --git a/Filtration.Parser.Tests/Services/TestItemFilterBlockTranslator.cs b/Filtration.Parser.Tests/Services/TestItemFilterBlockTranslator.cs index c63fcc8..7ed7f01 100644 --- a/Filtration.Parser.Tests/Services/TestItemFilterBlockTranslator.cs +++ b/Filtration.Parser.Tests/Services/TestItemFilterBlockTranslator.cs @@ -890,6 +890,23 @@ namespace Filtration.Parser.Tests.Services Assert.AreEqual(1, result.BlockItems.Count(b => b is DisableDropSoundBlockItem)); var blockItem = result.BlockItems.OfType().First(); Assert.IsTrue(blockItem.BooleanValue); + } + + [Test] + public void TranslateStringToItemFilterBlock_DropIcon_ReturnsCorrectObject() + { + // Arrange + var inputString = "Show" + Environment.NewLine + + " Icon Icon1"; + + // Act + var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript); + + // Assert + + Assert.AreEqual(1, result.BlockItems.Count(b => b is IconBlockItem)); + var blockItem = result.BlockItems.OfType().First(); + Assert.AreEqual("Icon1", blockItem.Value); } [Test] @@ -925,7 +942,8 @@ namespace Filtration.Parser.Tests.Services " SetBorderColor 0 0 0" + Environment.NewLine + " SetFontSize 50" + Environment.NewLine + " PlayAlertSound 3" + Environment.NewLine + - " DisableDropSound False" + Environment.NewLine; + " DisableDropSound False" + Environment.NewLine + + " Icon Icon2" + Environment.NewLine; // Act var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript); @@ -1030,6 +1048,9 @@ namespace Filtration.Parser.Tests.Services var disableDropSoundBlockItem = result.BlockItems.OfType().First(); Assert.IsFalse(disableDropSoundBlockItem.BooleanValue); + + var iconBlockItem = result.BlockItems.OfType().First(); + Assert.AreEqual("Icon2", iconBlockItem.Value); } [Test] @@ -1856,6 +1877,22 @@ namespace Filtration.Parser.Tests.Services Assert.AreEqual(expectedResult, result); } + [Test] + public void TranslateItemFilterBlockToString_DropIcon_ReturnsCorrectString() + { + // Arrange + var expectedResult = "Show" + Environment.NewLine + + " Icon Icon3"; + + _testUtility.TestBlock.BlockItems.Add(new IconBlockItem("Icon3")); + + // Act + var result = _testUtility.Translator.TranslateItemFilterBlockToString(_testUtility.TestBlock); + + // Assert + Assert.AreEqual(expectedResult, result); + } + [Test] public void TranslateItemFilterBlockToString_Everything_ReturnsCorrectString() { @@ -1887,7 +1924,8 @@ namespace Filtration.Parser.Tests.Services " SetBorderColor 255 1 254" + Environment.NewLine + " SetFontSize 50" + Environment.NewLine + " PlayAlertSound 6 90" + Environment.NewLine + - " DisableDropSound True"; + " DisableDropSound True" + Environment.NewLine + + " Icon Icon4"; _testUtility.TestBlock.BlockItems.Add(new ActionBlockItem(BlockAction.Show)); _testUtility.TestBlock.BlockItems.Add(new IdentifiedBlockItem(true)); @@ -1931,6 +1969,7 @@ namespace Filtration.Parser.Tests.Services _testUtility.TestBlock.BlockItems.Add(new ShapedMapBlockItem(true)); _testUtility.TestBlock.BlockItems.Add(new ElderMapBlockItem(true)); _testUtility.TestBlock.BlockItems.Add(new DisableDropSoundBlockItem(true)); + _testUtility.TestBlock.BlockItems.Add(new IconBlockItem("Icon4")); // Act var result = _testUtility.Translator.TranslateItemFilterBlockToString(_testUtility.TestBlock); diff --git a/Filtration.Parser/Services/ItemFilterBlockTranslator.cs b/Filtration.Parser/Services/ItemFilterBlockTranslator.cs index cfe23d4..9f306fb 100644 --- a/Filtration.Parser/Services/ItemFilterBlockTranslator.cs +++ b/Filtration.Parser/Services/ItemFilterBlockTranslator.cs @@ -297,6 +297,23 @@ namespace Filtration.Parser.Services AddBooleanItemToBlockItems(block, trimmedLine); break; } + case "Icon": + { + // Only ever use the last PlayAlertSound item encountered as multiples aren't valid. + RemoveExistingBlockItemsOfType(block); + + var match = Regex.Match(trimmedLine, @"\S+\s+(\S+)"); + + if (match.Success) + { + var blockItemValue = new IconBlockItem + { + Value = match.Groups[1].Value, + }; + block.BlockItems.Add(blockItemValue); + } + break; + } } } diff --git a/Filtration/Converters/DropIconConverter.cs b/Filtration/Converters/DropIconConverter.cs new file mode 100644 index 0000000..1f4b21a --- /dev/null +++ b/Filtration/Converters/DropIconConverter.cs @@ -0,0 +1,36 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace Filtration.Converters +{ + internal class DropIconConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var iconString = (string)value; + switch(iconString) + { + case "Icon1": + return "/Filtration;component/Resources/DropIcons/Icon1.png"; + case "Icon2": + return "/Filtration;component/Resources/DropIcons/Icon2.png"; + case "Icon3": + return "/Filtration;component/Resources/DropIcons/Icon3.png"; + case "Icon4": + return "/Filtration;component/Resources/DropIcons/Icon4.png"; + case "Icon5": + return "/Filtration;component/Resources/DropIcons/Icon5.png"; + case "Icon6": + return "/Filtration;component/Resources/DropIcons/Icon6.png"; + } + + return ""; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj index 4e0f402..c6a582b 100644 --- a/Filtration/Filtration.csproj +++ b/Filtration/Filtration.csproj @@ -167,6 +167,7 @@ + @@ -190,6 +191,9 @@ EditableListBoxControl.xaml + + ImageComboBoxControl.xaml + ItemPreviewControl.xaml @@ -230,6 +234,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -538,6 +546,12 @@ + + + + + + diff --git a/Filtration/Resources/DropIcons/Icon1.png b/Filtration/Resources/DropIcons/Icon1.png new file mode 100644 index 0000000..38a4314 Binary files /dev/null and b/Filtration/Resources/DropIcons/Icon1.png differ diff --git a/Filtration/Resources/DropIcons/Icon2.png b/Filtration/Resources/DropIcons/Icon2.png new file mode 100644 index 0000000..8d10d5d Binary files /dev/null and b/Filtration/Resources/DropIcons/Icon2.png differ diff --git a/Filtration/Resources/DropIcons/Icon3.png b/Filtration/Resources/DropIcons/Icon3.png new file mode 100644 index 0000000..2ef3b30 Binary files /dev/null and b/Filtration/Resources/DropIcons/Icon3.png differ diff --git a/Filtration/Resources/DropIcons/Icon4.png b/Filtration/Resources/DropIcons/Icon4.png new file mode 100644 index 0000000..b471723 Binary files /dev/null and b/Filtration/Resources/DropIcons/Icon4.png differ diff --git a/Filtration/Resources/DropIcons/Icon5.png b/Filtration/Resources/DropIcons/Icon5.png new file mode 100644 index 0000000..ad3709f Binary files /dev/null and b/Filtration/Resources/DropIcons/Icon5.png differ diff --git a/Filtration/Resources/DropIcons/Icon6.png b/Filtration/Resources/DropIcons/Icon6.png new file mode 100644 index 0000000..8febb46 Binary files /dev/null and b/Filtration/Resources/DropIcons/Icon6.png differ diff --git a/Filtration/UserControls/BlockItemControl.xaml b/Filtration/UserControls/BlockItemControl.xaml index a9f2962..5aa6466 100644 --- a/Filtration/UserControls/BlockItemControl.xaml +++ b/Filtration/UserControls/BlockItemControl.xaml @@ -131,6 +131,13 @@ + + + + + + + diff --git a/Filtration/UserControls/BlockItemControl.xaml.cs b/Filtration/UserControls/BlockItemControl.xaml.cs index 5af5c2f..70d9d0d 100644 --- a/Filtration/UserControls/BlockItemControl.xaml.cs +++ b/Filtration/UserControls/BlockItemControl.xaml.cs @@ -88,6 +88,10 @@ namespace Filtration.UserControls "ShFusing", "ShRegal", "ShVaal" }; + public List IconsAvailable => new List { + "Icon1", "Icon2", "Icon3", "Icon4", "Icon5", "Icon6" + }; + private void OnSetBlockColorCommmand() { var blockItem = BlockItem as ColorBlockItem; diff --git a/Filtration/UserControls/ImageComboBoxControl.xaml b/Filtration/UserControls/ImageComboBoxControl.xaml new file mode 100644 index 0000000..1494353 --- /dev/null +++ b/Filtration/UserControls/ImageComboBoxControl.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/Filtration/UserControls/ImageComboBoxControl.xaml.cs b/Filtration/UserControls/ImageComboBoxControl.xaml.cs new file mode 100644 index 0000000..0921355 --- /dev/null +++ b/Filtration/UserControls/ImageComboBoxControl.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Filtration.UserControls +{ + /// + /// Interaction logic for ImageComboBoxControl.xaml + /// + public partial class ImageComboBoxControl : UserControl + { + public ImageComboBoxControl() + { + InitializeComponent(); + } + } +} diff --git a/Filtration/ViewModels/ItemFilterBlockViewModel.cs b/Filtration/ViewModels/ItemFilterBlockViewModel.cs index f582a56..67761fd 100644 --- a/Filtration/ViewModels/ItemFilterBlockViewModel.cs +++ b/Filtration/ViewModels/ItemFilterBlockViewModel.cs @@ -174,7 +174,8 @@ namespace Filtration.ViewModels typeof (FontSizeBlockItem), typeof (SoundBlockItem), typeof (PositionalSoundBlockItem), - typeof (DisableDropSoundBlockItem) + typeof (DisableDropSoundBlockItem), + typeof (IconBlockItem) }; public bool BlockEnabled @@ -214,7 +215,8 @@ namespace Filtration.ViewModels public Color DisplayBackgroundColor => Block.DisplayBackgroundColor; public Color DisplayBorderColor => Block.DisplayBorderColor; public double DisplayFontSize => Block.DisplayFontSize/1.8; - + public string DisplayIcon => Block.DisplayIcon; + public bool HasSound => Block.HasBlockItemOfType(); public bool HasPositionalSound => Block.HasBlockItemOfType(); @@ -437,6 +439,7 @@ namespace Filtration.ViewModels RaisePropertyChanged(nameof(DisplayBackgroundColor)); RaisePropertyChanged(nameof(DisplayBorderColor)); RaisePropertyChanged(nameof(DisplayFontSize)); + RaisePropertyChanged(nameof(DisplayIcon)); RaisePropertyChanged(nameof(HasSound)); } diff --git a/Filtration/Views/ItemFilterBlockView.xaml b/Filtration/Views/ItemFilterBlockView.xaml index 98b941c..f6bb64a 100644 --- a/Filtration/Views/ItemFilterBlockView.xaml +++ b/Filtration/Views/ItemFilterBlockView.xaml @@ -18,6 +18,7 @@ +