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 @@
+