Add new filter fuatures

This commit is contained in:
azakhi 2018-08-29 20:12:02 +03:00
parent a09f0a5090
commit 78b4ddc862
78 changed files with 911 additions and 231 deletions

View File

@ -3,9 +3,9 @@ using System.ComponentModel;
using System.Linq;
using System.Windows.Markup;
namespace Filtration.Extensions
namespace Filtration.Common.Extensions
{
internal class EnumerationExtension : MarkupExtension
public class EnumerationExtension : MarkupExtension
{
private Type _enumType;

View File

@ -4,7 +4,7 @@ using System.Windows;
using System.Windows.Documents;
using System.Windows.Navigation;
namespace Filtration.Extensions
namespace Filtration.Common.Extensions
{
public static class HyperlinkExtensions
{

View File

@ -75,6 +75,8 @@
<Compile Include="Converters\ColorToSolidColorBrushConverter.cs" />
<Compile Include="Converters\InverseBooleanVisibilityConverter.cs" />
<Compile Include="Converters\StringToVisibilityConverter.cs" />
<Compile Include="Extensions\EnumerationExtension.cs" />
<Compile Include="Extensions\HyperlinkExtensions.cs" />
<Compile Include="Messages\ThemeClosedMessage.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\FileSystemService.cs" />

View File

@ -0,0 +1,90 @@
using System;
using System.Windows.Media;
using Filtration.ObjectModel.Enums;
using Filtration.ObjectModel.Extensions;
using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel.BlockItemBaseTypes
{
public abstract class EffectColorBlockItem : BlockItemBase, IAudioVisualBlockItem, IBlockItemWithTheme
{
private EffectColor _color;
private bool _temporary;
private ThemeComponent _themeComponent;
protected EffectColorBlockItem()
{
}
protected EffectColorBlockItem(EffectColor color, bool temporary)
{
Color = color;
Temporary = temporary;
}
public override string OutputText => PrefixText + " " + Color.GetAttributeDescription() +
(Temporary ? " " + "Temp" : string.Empty) +
(ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty);
public override string SummaryText => string.Empty;
public ThemeComponent ThemeComponent
{
get { return _themeComponent; }
set
{
if (_themeComponent == value) { return; }
if (_themeComponent != null)
{
_themeComponent.ThemeComponentUpdated -= OnThemeComponentUpdated;
_themeComponent.ThemeComponentDeleted -= OnThemeComponentDeleted;
}
if (value != null)
{
value.ThemeComponentUpdated += OnThemeComponentUpdated;
value.ThemeComponentDeleted += OnThemeComponentDeleted;
}
_themeComponent = value;
OnPropertyChanged();
}
}
public override Color SummaryBackgroundColor => Colors.Transparent;
public override Color SummaryTextColor => Colors.Transparent;
public EffectColor Color
{
get { return _color; }
set
{
_color = value;
IsDirty = true;
OnPropertyChanged();
}
}
public bool Temporary
{
get { return _temporary; }
set
{
_temporary = value;
IsDirty = true;
OnPropertyChanged();
}
}
private void OnThemeComponentUpdated(object sender, EventArgs e)
{
Color = ((EffectColorThemeComponent)sender).EffectColor;
Temporary = ((EffectColorThemeComponent)sender).Temporary;
}
private void OnThemeComponentDeleted(object sender, EventArgs e)
{
ThemeComponent = null;
}
}
}

View File

@ -0,0 +1,103 @@
using System;
using System.Windows.Media;
using Filtration.ObjectModel.Enums;
using Filtration.ObjectModel.Extensions;
using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel.BlockItemBaseTypes
{
public abstract class IconBlockItem : BlockItemBase, IAudioVisualBlockItem, IBlockItemWithTheme
{
private IconSize _size;
private IconColor _color;
private IconShape _shape;
private ThemeComponent _themeComponent;
protected IconBlockItem()
{
}
protected IconBlockItem(IconSize size, IconColor color, IconShape shape)
{
Size = size;
Color = color;
Shape = shape;
}
public override string OutputText => PrefixText + " " + (int)Size + " " + Color.GetAttributeDescription() + " " + Shape.GetAttributeDescription() +
(ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty);
public override string SummaryText => string.Empty;
public ThemeComponent ThemeComponent
{
get { return _themeComponent; }
set
{
if (_themeComponent == value) { return; }
if (_themeComponent != null)
{
_themeComponent.ThemeComponentUpdated -= OnThemeComponentUpdated;
_themeComponent.ThemeComponentDeleted -= OnThemeComponentDeleted;
}
if (value != null)
{
value.ThemeComponentUpdated += OnThemeComponentUpdated;
value.ThemeComponentDeleted += OnThemeComponentDeleted;
}
_themeComponent = value;
OnPropertyChanged();
}
}
public override Color SummaryBackgroundColor => Colors.Transparent;
public override Color SummaryTextColor => Colors.Transparent;
public IconSize Size
{
get { return _size; }
set
{
_size = value;
IsDirty = true;
OnPropertyChanged();
}
}
public IconColor Color
{
get { return _color; }
set
{
_color = value;
IsDirty = true;
OnPropertyChanged();
}
}
public IconShape Shape
{
get { return _shape; }
set
{
_shape = value;
IsDirty = true;
OnPropertyChanged();
}
}
private void OnThemeComponentUpdated(object sender, EventArgs e)
{
Size = ((IconThemeComponent)sender).IconSize;
Color = ((IconThemeComponent)sender).IconColor;
Shape = ((IconThemeComponent)sender).IconShape;
}
private void OnThemeComponentDeleted(object sender, EventArgs e)
{
ThemeComponent = null;
}
}
}

View File

@ -16,6 +16,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "SetBackgroundColor";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Background Color";
public override int SortOrder => 22;
public override int SortOrder => 23;
}
}

View File

@ -33,6 +33,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override Color SummaryBackgroundColor => Colors.MediumTurquoise;
public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 19;
public override int SortOrder => 20;
}
}

View File

@ -1,21 +0,0 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class BeamBlockItem : ColorBooleanBlockItem
{
public BeamBlockItem()
{
}
public BeamBlockItem(Color color, bool booleanValue) : base(color, booleanValue)
{
}
public override string PrefixText => "BeamColor";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Beam Color";
public override int SortOrder => 29;
}
}

View File

@ -16,6 +16,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "SetBorderColor";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Border Color";
public override int SortOrder => 23;
public override int SortOrder => 24;
}
}

View File

@ -33,6 +33,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override Color SummaryBackgroundColor => Colors.MediumSeaGreen;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 18;
public override int SortOrder => 19;
}
}

View File

@ -16,6 +16,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "CustomAlertSound";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Custom Alert Sound";
public override int SortOrder => 30;
public override int SortOrder => 31;
}
}

View File

@ -17,7 +17,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string DisplayHeading => "Disable Drop Sound";
public override Color SummaryBackgroundColor => Colors.Transparent;
public override Color SummaryTextColor => Colors.Transparent;
public override int SortOrder => 27;
public override int SortOrder => 28;
}
}

View File

@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Drop Level " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DodgerBlue;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 14;
public override int SortOrder => 15;
public override int Minimum => 0;
public override int Maximum => 100;
}

View File

@ -17,7 +17,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string DisplayHeading => "Elder Map";
public override Color SummaryBackgroundColor => Colors.DarkGoldenrod;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 9;
public override int SortOrder => 10;
}
}

View File

@ -16,7 +16,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "SetFontSize";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Font Size";
public override int SortOrder => 24;
public override int SortOrder => 25;
public override int Minimum => 11;
public override int Maximum => 45;
}

View File

@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Gem Level " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 15;
public override int SortOrder => 16;
public override int Minimum => 0;
public override int Maximum => 21;
}

View File

@ -33,6 +33,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override Color SummaryBackgroundColor => Colors.MidnightBlue;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 20;
public override int SortOrder => 21;
}
}

View File

@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Height " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.LightBlue;
public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 11;
public override int SortOrder => 12;
public override int Minimum => 0;
public override int Maximum => 6;
}

View File

@ -1,21 +0,0 @@
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;
}
}

View File

@ -20,7 +20,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Item Level " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 13;
public override int SortOrder => 14;
public override int Minimum => 0;
public override int Maximum => 100;
}

View File

@ -0,0 +1,24 @@
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class MapIconBlockItem : IconBlockItem
{
public MapIconBlockItem()
{
Size = IconSize.Largest;
Color = IconColor.Red;
Shape = IconShape.Circle;
}
public MapIconBlockItem(IconSize size, IconColor iconColor, IconShape iconShape) : base(size, iconColor, iconShape)
{
}
public override string PrefixText => "MinimapIcon";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Minimap Icon";
public override int SortOrder => 29;
}
}

View File

@ -0,0 +1,18 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class MapTierBlockItem : NumericFilterPredicateBlockItem
{
public override string PrefixText => "MapTier";
public override int MaximumAllowed => 2;
public override string DisplayHeading => "Map Tier";
public override string SummaryText => "Map Tier " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 8;
public override int Minimum => 1;
public override int Maximum => 16;
}
}

View File

@ -0,0 +1,23 @@
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class PlayEffectBlockItem : EffectColorBlockItem
{
public PlayEffectBlockItem()
{
Color = EffectColor.Red;
Temporary = false;
}
public PlayEffectBlockItem(EffectColor effectColor, bool temporary) : base(effectColor, temporary)
{
}
public override string PrefixText => "PlayEffect";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Play Effect";
public override int SortOrder => 30;
}
}

View File

@ -17,6 +17,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "PlayAlertSoundPositional";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Play Positional Alert Sound";
public override int SortOrder => 26;
public override int SortOrder => 27;
}
}

View File

@ -30,7 +30,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
((ItemRarity) FilterPredicate.PredicateOperand).GetAttributeDescription();
public override Color SummaryBackgroundColor => Colors.LightCoral;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 17;
public override int SortOrder => 18;
public override int Minimum => 0;
public override int Maximum => (int)ItemRarity.Unique;
}

View File

@ -17,7 +17,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string DisplayHeading => "Shaped Map";
public override Color SummaryBackgroundColor => Colors.DarkGoldenrod;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 8;
public override int SortOrder => 9;
}
}

View File

@ -39,7 +39,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override Color SummaryBackgroundColor => Colors.GhostWhite;
public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 10;
public override int SortOrder => 11;
private SocketColor StringToSocketColor(char socketColorString)
{

View File

@ -17,6 +17,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "PlayAlertSound";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Play Alert Sound";
public override int SortOrder => 25;
public override int SortOrder => 26;
}
}

View File

@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Stack Size " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 16;
public override int SortOrder => 17;
public override int Minimum => 0;
public override int Maximum => 1000;
}

View File

@ -16,6 +16,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "SetTextColor";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Text Color";
public override int SortOrder => 21;
public override int SortOrder => 22;
}
}

View File

@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Width " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.MediumPurple;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 12;
public override int SortOrder => 13;
public override int Minimum => 0;
public override int Maximum => 2;
}

View File

@ -0,0 +1,20 @@
using System.ComponentModel;
namespace Filtration.ObjectModel.Enums
{
public enum EffectColor
{
[Description("Red")]
Red,
[Description("Green")]
Green,
[Description("Blue")]
Blue,
[Description("Brown")]
Brown,
[Description("White")]
White,
[Description("Yellow")]
Yellow
}
}

View File

@ -0,0 +1,20 @@
using System.ComponentModel;
namespace Filtration.ObjectModel.Enums
{
public enum IconColor
{
[Description("Red")]
Red,
[Description("Green")]
Green,
[Description("Blue")]
Blue,
[Description("Brown")]
Brown,
[Description("White")]
White,
[Description("Yellow")]
Yellow
}
}

View File

@ -0,0 +1,20 @@
using System.ComponentModel;
namespace Filtration.ObjectModel.Enums
{
public enum IconShape
{
[Description("Circle")]
Circle,
[Description("Diamond")]
Diamond,
[Description("Hexagon")]
Hexagon,
[Description("Square")]
Square,
[Description("Star")]
Star,
[Description("Triangle")]
Triangle
}
}

View File

@ -0,0 +1,14 @@
using System.ComponentModel;
namespace Filtration.ObjectModel.Enums
{
public enum IconSize
{
[Description("Largest")]
Largest,
[Description("Medium")]
Medium,
[Description("Small")]
Small
}
}

View File

@ -15,6 +15,10 @@ namespace Filtration.ObjectModel.Enums
[Description("Alert Sound")]
AlertSound,
[Description("Custom Sound")]
CustomSound
CustomSound,
[Description("Icon")]
Icon,
[Description("Effect")]
Effect
}
}

View File

@ -70,6 +70,8 @@
<Compile Include="BlockItemBaseTypes\ColorBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\ColorBooleanBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\DualIntegerBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\EffectColorBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\IconBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\StringBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\StrIntBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\IntegerBlockItem.cs" />
@ -77,7 +79,8 @@
<Compile Include="BlockItemBaseTypes\StringListBlockItem.cs" />
<Compile Include="BlockItemTypes\BackgroundColorBlockItem.cs" />
<Compile Include="BlockItemTypes\BaseTypeBlockItem.cs" />
<Compile Include="BlockItemTypes\BeamBlockItem.cs" />
<Compile Include="BlockItemTypes\MapTierBlockItem.cs" />
<Compile Include="BlockItemTypes\PlayEffectBlockItem.cs" />
<Compile Include="BlockItemTypes\BorderColorBlockItem.cs" />
<Compile Include="BlockItemTypes\ClassBlockItem.cs" />
<Compile Include="BlockItemTypes\CustomSoundBlockItem.cs" />
@ -85,7 +88,7 @@
<Compile Include="BlockItemTypes\ElderMapBlockItem.cs" />
<Compile Include="BlockItemTypes\GemLevelBlockItem.cs" />
<Compile Include="BlockItemTypes\HasExplicitModBlockItem.cs" />
<Compile Include="BlockItemTypes\IconBlockItem.cs" />
<Compile Include="BlockItemTypes\MapIconBlockItem.cs" />
<Compile Include="BlockItemTypes\ShapedMapBlockItem.cs" />
<Compile Include="BlockItemTypes\ShaperItemBlockItem.cs" />
<Compile Include="BlockItemTypes\ElderItemBlockItem.cs" />
@ -122,8 +125,12 @@
<Compile Include="Commands\IUndoableCommand.cs" />
<Compile Include="Enums\BlockAction.cs" />
<Compile Include="Enums\BlockItemType.cs" />
<Compile Include="Enums\EffectColor.cs" />
<Compile Include="Enums\FilterPredicateOperator.cs" />
<Compile Include="Enums\FilterType.cs" />
<Compile Include="Enums\IconColor.cs" />
<Compile Include="Enums\IconShape.cs" />
<Compile Include="Enums\IconSize.cs" />
<Compile Include="Enums\ItemRarity.cs" />
<Compile Include="Enums\SocketColor.cs" />
<Compile Include="Enums\ThemeComponentType.cs" />
@ -148,6 +155,8 @@
<Compile Include="ReplaceColorsParameterSet.cs" />
<Compile Include="Socket.cs" />
<Compile Include="SocketGroup.cs" />
<Compile Include="ThemeEditor\EffectColorThemeComponent.cs" />
<Compile Include="ThemeEditor\IconThemeComponent.cs" />
<Compile Include="ThemeEditor\StringThemeComponent.cs" />
<Compile Include="ThemeEditor\StrIntThemeComponent.cs" />
<Compile Include="ThemeEditor\IntegerThemeComponent.cs" />

View File

@ -23,8 +23,10 @@ namespace Filtration.ObjectModel
Color DisplayTextColor { get; }
Color DisplayBorderColor { get; }
double DisplayFontSize { get; }
string DisplayIcon { get; }
Color DisplayBeamColor { get; }
int DisplayIconSize { get; }
int DisplayIconColor { get; }
int DisplayIconShape { get; }
Color DisplayEffectColor { get; }
bool HasBlockItemOfType<T>();
bool HasBlockGroupInParentHierarchy(ItemFilterBlockGroup targetBlockGroup, ItemFilterBlockGroup startingBlockGroup);
}
@ -263,21 +265,68 @@ namespace Filtration.ObjectModel
}
}
public string DisplayIcon
public int DisplayIconSize
{
get
{
var displayIcon = BlockItems.OfType<IconBlockItem>().FirstOrDefault();
return (displayIcon != null) ? displayIcon.Value : "";
var mapIconBlockItem = BlockItems.OfType<MapIconBlockItem>().FirstOrDefault();
if (mapIconBlockItem != null)
return (int)mapIconBlockItem.Size;
return -1;
}
}
public Color DisplayBeamColor
public int DisplayIconColor
{
get
{
var beamBlockItem = BlockItems.OfType<BeamBlockItem>().FirstOrDefault();
return beamBlockItem?.Color ?? new Color { A = 0, R = 0, G = 0, B = 0 };
var mapIconBlockItem = BlockItems.OfType<MapIconBlockItem>().FirstOrDefault();
if (mapIconBlockItem != null)
return (int)mapIconBlockItem.Color;
return -1;
}
}
public int DisplayIconShape
{
get
{
var mapIconBlockItem = BlockItems.OfType<MapIconBlockItem>().FirstOrDefault();
if (mapIconBlockItem != null)
return (int)mapIconBlockItem.Shape;
return -1;
}
}
public Color DisplayEffectColor
{
get
{
var beamBlockItem = BlockItems.OfType<PlayEffectBlockItem>().FirstOrDefault();
if (beamBlockItem != null)
{
switch (beamBlockItem.Color)
{
case EffectColor.Red:
return Colors.Red;
case EffectColor.Green:
return Colors.Green;
case EffectColor.Blue:
return Colors.Blue;
case EffectColor.Brown:
return Colors.Brown;
case EffectColor.White:
return Colors.White;
case EffectColor.Yellow:
return Colors.Yellow;
}
}
return Colors.Transparent;
}
}
}

View File

@ -0,0 +1,47 @@
using System;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.ThemeEditor
{
[Serializable]
public class EffectColorThemeComponent : ThemeComponent
{
private EffectColor _effectColor;
private bool _temporary;
public EffectColorThemeComponent(ThemeComponentType componentType, string componentName, EffectColor componentEffectColor, bool componentTemporary)
{
if (componentName == null)
{
throw new ArgumentException("Null parameters not allowed in EffectColorThemeComponent constructor");
}
ComponentType = componentType;
ComponentName = componentName;
EffectColor = componentEffectColor;
Temporary = componentTemporary;
}
public EffectColor EffectColor
{
get { return _effectColor; }
set
{
_effectColor = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
public bool Temporary
{
get { return _temporary; }
set
{
_temporary = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
}
}

View File

@ -0,0 +1,60 @@
using System;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.ThemeEditor
{
[Serializable]
public class IconThemeComponent : ThemeComponent
{
private IconSize _iconSize;
private IconColor _iconColor;
private IconShape _iconShape;
public IconThemeComponent(ThemeComponentType componentType, string componentName, IconSize componentIconSize, IconColor componentIconColor, IconShape componentIconShape)
{
if (componentName == null)
{
throw new ArgumentException("Null parameters not allowed in IconThemeComponent constructor");
}
ComponentType = componentType;
ComponentName = componentName;
IconSize = componentIconSize;
IconColor = componentIconColor;
IconShape = componentIconShape;
}
public IconSize IconSize
{
get { return _iconSize; }
set
{
_iconSize = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
public IconColor IconColor
{
get { return _iconColor; }
set
{
_iconColor = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
public IconShape IconShape
{
get { return _iconShape; }
set
{
_iconShape = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
}
}

View File

@ -61,6 +61,32 @@ namespace Filtration.ObjectModel.ThemeEditor
return component;
}
public ThemeComponent AddComponent(ThemeComponentType componentType, string componentName, IconSize componentIconSize, IconColor componentIconColor, IconShape componentIconShape)
{
if (ComponentExists(componentType, componentName))
{
return Items.FirstOrDefault(t => t.ComponentName == componentName && t.ComponentType == componentType);
}
var component = new IconThemeComponent(componentType, componentName, componentIconSize, componentIconColor, componentIconShape);
Items.Add(component);
return component;
}
public ThemeComponent AddComponent(ThemeComponentType componentType, string componentName, EffectColor componentEffectColor, bool componentTemporary)
{
if (ComponentExists(componentType, componentName))
{
return Items.FirstOrDefault(t => t.ComponentName == componentName && t.ComponentType == componentType);
}
var component = new EffectColorThemeComponent(componentType, componentName, componentEffectColor, componentTemporary);
Items.Add(component);
return component;
}
private bool ComponentExists(ThemeComponentType componentType, string componentName)
{
var componentCount =

View File

@ -892,42 +892,6 @@ namespace Filtration.Parser.Tests.Services
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<IconBlockItem>().First();
Assert.AreEqual("Icon1", blockItem.Value);
}
[Test]
public void TranslateStringToItemFilterBlock_BeamColor_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" BeamColor 255 20 100 True";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is BeamBlockItem));
var blockItem = result.BlockItems.OfType<BeamBlockItem>().First();
Assert.AreEqual(255, blockItem.Color.R);
Assert.AreEqual(20, blockItem.Color.G);
Assert.AreEqual(100, blockItem.Color.B);
Assert.IsTrue(blockItem.BooleanValue);
}
[Test]
public void TranslateStringToItemFilterBlock_Everything_ReturnsCorrectObject()
{
@ -961,9 +925,7 @@ namespace Filtration.Parser.Tests.Services
" SetBorderColor 0 0 0" + Environment.NewLine +
" SetFontSize 50" + Environment.NewLine +
" PlayAlertSound 3" + Environment.NewLine +
" DisableDropSound False" + Environment.NewLine +
" Icon Icon2" + Environment.NewLine +
" BeamColor 255 100 5 false" + Environment.NewLine;
" DisableDropSound False" + Environment.NewLine;
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
@ -1068,15 +1030,6 @@ namespace Filtration.Parser.Tests.Services
var disableDropSoundBlockItem = result.BlockItems.OfType<DisableDropSoundBlockItem>().First();
Assert.IsFalse(disableDropSoundBlockItem.BooleanValue);
var iconBlockItem = result.BlockItems.OfType<IconBlockItem>().First();
Assert.AreEqual("Icon2", iconBlockItem.Value);
var beamBlockItem = result.BlockItems.OfType<BeamBlockItem>().First();
Assert.AreEqual(255, beamBlockItem.Color.R);
Assert.AreEqual(100, beamBlockItem.Color.G);
Assert.AreEqual(5, beamBlockItem.Color.B);
Assert.IsFalse(beamBlockItem.BooleanValue);
}
[Test]
@ -1903,23 +1856,6 @@ namespace Filtration.Parser.Tests.Services
Assert.AreEqual(expectedResult, result);
}
[Ignore("Ignore until the new block type is fully implemented")]
[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()
{
@ -1951,9 +1887,7 @@ namespace Filtration.Parser.Tests.Services
" SetBorderColor 255 1 254" + Environment.NewLine +
" SetFontSize 50" + Environment.NewLine +
" PlayAlertSound 6 90" + Environment.NewLine +
" DisableDropSound True";/* + Environment.NewLine +
" Icon Icon4";
" BeamColor 120 130 140 False";*/
" DisableDropSound True";
_testUtility.TestBlock.BlockItems.Add(new ActionBlockItem(BlockAction.Show));
_testUtility.TestBlock.BlockItems.Add(new IdentifiedBlockItem(true));
@ -1997,8 +1931,6 @@ 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"));
_testUtility.TestBlock.BlockItems.Add(new BeamBlockItem(new Color { A = 255, R = 120, G = 130, B = 140 }, false));
// Act
var result = _testUtility.Translator.TranslateItemFilterBlockToString(_testUtility.TestBlock);

View File

@ -310,36 +310,59 @@ namespace Filtration.Parser.Services
AddBooleanItemToBlockItems<DisableDropSoundBlockItem>(block, trimmedLine);
break;
}
case "Icon":
case "MinimapIcon":
{
// Only ever use the last Icon item encountered as multiples aren't valid.
RemoveExistingBlockItemsOfType<IconBlockItem>(block);
RemoveExistingBlockItemsOfType<MapIconBlockItem>(block);
var match = Regex.Match(trimmedLine, @"\S+\s+""(\S+)""");
// TODO: Get size, color, shape values programmatically
var match = Regex.Match(trimmedLine,
@"\S+\s+(0|1|2)\s+(Red|Green|Blue|Brown|White|Yellow)\s+(Circle|Diamond|Hexagon|Square|Star|Triangle)\s*([#]?)(.*)",
RegexOptions.IgnoreCase);
if (match.Success)
{
var blockItemValue = new IconBlockItem
var blockItemValue = new MapIconBlockItem
{
Value = match.Groups[1].Value
Size = (IconSize)Int16.Parse(match.Groups[1].Value),
Color = EnumHelper.GetEnumValueFromDescription<IconColor>(match.Groups[2].Value),
Shape = EnumHelper.GetEnumValueFromDescription<IconShape>(match.Groups[3].Value)
};
if(match.Groups[4].Value == "#" && !string.IsNullOrWhiteSpace(match.Groups[5].Value))
{
ThemeComponent themeComponent = _masterComponentCollection.AddComponent(ThemeComponentType.Icon, match.Groups[5].Value.Trim(),
blockItemValue.Size, blockItemValue.Color, blockItemValue.Shape);
blockItemValue.ThemeComponent = themeComponent;
}
block.BlockItems.Add(blockItemValue);
}
break;
}
case "BeamColor":
case "PlayEffect":
{
// Only ever use the last BeamColor item encountered as multiples aren't valid.
RemoveExistingBlockItemsOfType<BeamBlockItem>(block);
RemoveExistingBlockItemsOfType<PlayEffectBlockItem>(block);
var result = Regex.Matches(trimmedLine, @"([\w\s]*)(True|False)[#]?(.*)", RegexOptions.IgnoreCase);
var color = GetColorFromString(result[0].Groups[1].Value);
var beamBlockItem = new BeamBlockItem
// TODO: Get colors programmatically
var match = Regex.Match(trimmedLine, @"\S+\s+(Red|Green|Blue|Brown|White|Yellow)\s+(Temp)?\s*([#]?)(.*)", RegexOptions.IgnoreCase);
if (match.Success)
{
Color = GetColorFromString(result[0].Groups[1].Value),
BooleanValue = result[0].Groups[2].Value.Trim().ToLowerInvariant() == "true"
};
block.BlockItems.Add(beamBlockItem);
var blockItemValue = new PlayEffectBlockItem
{
Color = EnumHelper.GetEnumValueFromDescription<EffectColor>(match.Groups[1].Value),
Temporary = match.Groups[2].Value.Trim().ToLower() == "temp"
};
if(match.Groups[3].Value == "#" && !string.IsNullOrWhiteSpace(match.Groups[4].Value))
{
ThemeComponent themeComponent = _masterComponentCollection.AddComponent(ThemeComponentType.Effect, match.Groups[4].Value.Trim(),
blockItemValue.Color, blockItemValue.Temporary);
blockItemValue.ThemeComponent = themeComponent;
}
block.BlockItems.Add(blockItemValue);
}
break;
}
case "CustomAlertSound":
@ -367,6 +390,11 @@ namespace Filtration.Parser.Services
}
break;
}
case "MapTier":
{
AddNumericFilterPredicateItemToBlockItems<MapTierBlockItem>(block, trimmedLine);
break;
}
}
}
@ -640,12 +668,6 @@ namespace Filtration.Parser.Services
// ReSharper disable once LoopCanBeConvertedToQuery
foreach (var blockItem in block.BlockItems.Where(b => b.GetType() != typeof(ActionBlockItem)).OrderBy(b => b.SortOrder))
{
// Do not save temporary blocks until the new features are fully implemented
if (blockItem is IconBlockItem || blockItem is BeamBlockItem)
{
continue;
}
if (blockItem.OutputText != string.Empty)
{
outputString += (!block.Enabled ? _disabledNewLine : _newLine) + blockItem.OutputText;

View File

@ -109,6 +109,8 @@
<Compile Include="Services\ThemePersistenceService.cs" />
<Compile Include="Services\ThemeService.cs" />
<Compile Include="ViewModels\ColorThemeComponentViewModel.cs" />
<Compile Include="ViewModels\EffectColorThemeComponentViewModel.cs" />
<Compile Include="ViewModels\IconThemeComponentViewModel.cs" />
<Compile Include="ViewModels\StringThemeComponentViewModel.cs" />
<Compile Include="ViewModels\StrIntThemeComponentViewModel.cs" />
<Compile Include="ViewModels\IntegerThemeComponentViewModel.cs" />

View File

@ -0,0 +1,10 @@
using Filtration.ObjectModel.Enums;
namespace Filtration.ThemeEditor.ViewModels
{
public class EffectColorThemeComponentViewModel : ThemeComponentViewModel
{
public EffectColor EffectColor { get; set; }
public bool Temporary { get; set; }
}
}

View File

@ -0,0 +1,11 @@
using Filtration.ObjectModel.Enums;
namespace Filtration.ThemeEditor.ViewModels
{
public class IconThemeComponentViewModel : ThemeComponentViewModel
{
public IconSize IconSize { get; set; }
public IconColor IconColor { get; set; }
public IconShape IconShape { get; set; }
}
}

View File

@ -211,6 +211,12 @@ namespace Filtration.ThemeEditor.ViewModels
case ThemeComponentType.CustomSound:
Components.Add(new StringThemeComponent(themeComponentType, "Untitled Component", "placeholder.mp3"));
break;
case ThemeComponentType.Icon:
Components.Add(new IconThemeComponent(themeComponentType, "Untitled Component", IconSize.Largest, IconColor.Red, IconShape.Circle));
break;
case ThemeComponentType.Effect:
Components.Add(new EffectColorThemeComponent(themeComponentType, "Untitled Component", EffectColor.Red, false));
break;
}
}

View File

@ -7,7 +7,8 @@
xmlns:commonConverters="clr-namespace:Filtration.Common.Converters;assembly=Filtration.Common"
xmlns:themeEditor="clr-namespace:Filtration.ObjectModel.ThemeEditor;assembly=Filtration.ObjectModel"
xmlns:views="clr-namespace:Filtration.ThemeEditor.Views"
xmlns:viewModels="clr-namespace:Filtration.ThemeEditor.ViewModels"
xmlns:extensions="clr-namespace:Filtration.Common.Extensions;assembly=Filtration.Common"
xmlns:enums="clr-namespace:Filtration.ObjectModel.Enums;assembly=Filtration.ObjectModel"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=themeEditor:ThemeComponent}"
d:DesignHeight="100" d:DesignWidth="200">
@ -18,7 +19,7 @@
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="25" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.Resources>
<DataTemplate x:Key="EditableComponentNameTemplate">
@ -99,6 +100,38 @@
</Button>
</Grid>
</DataTemplate>
<!--Icon Theme Template-->
<DataTemplate DataType="{x:Type themeEditor:IconThemeComponent}">
<StackPanel Orientation="Vertical" Margin="5,5,5,5">
<ComboBox ItemsSource="{Binding Source={extensions:Enumeration {x:Type enums:IconSize}}}" Style="{StaticResource MetroComboBox}"
DisplayMemberPath="Description"
SelectedValue="{Binding IconSize}"
SelectedValuePath="Value" />
<ComboBox ItemsSource="{Binding Source={extensions:Enumeration {x:Type enums:IconColor}}}" Style="{StaticResource MetroComboBox}"
DisplayMemberPath="Description"
SelectedValue="{Binding IconColor}"
SelectedValuePath="Value" />
<ComboBox ItemsSource="{Binding Source={extensions:Enumeration {x:Type enums:IconShape}}}" Style="{StaticResource MetroComboBox}"
DisplayMemberPath="Description"
SelectedValue="{Binding IconShape}"
SelectedValuePath="Value" />
</StackPanel>
</DataTemplate>
<!--Effect Color Theme Template-->
<DataTemplate DataType="{x:Type themeEditor:EffectColorThemeComponent}">
<StackPanel>
<WrapPanel VerticalAlignment="Center" Margin="5,5,5,5">
<RadioButton IsChecked="{Binding Temporary, Converter={StaticResource BoolInverterConverter}}" Margin="0,0,10,0">Permanent</RadioButton>
<RadioButton IsChecked="{Binding Temporary}" >Temporary</RadioButton>
</WrapPanel>
<ComboBox ItemsSource="{Binding Source={extensions:Enumeration {x:Type enums:EffectColor}}}" Style="{StaticResource MetroComboBox}"
DisplayMemberPath="Description"
SelectedValue="{Binding EffectColor}"
SelectedValuePath="Value" />
</StackPanel>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</Grid>

View File

@ -50,6 +50,8 @@ namespace Filtration
cfg.CreateMap<IntegerThemeComponent, IntegerThemeComponentViewModel>().ReverseMap();
cfg.CreateMap<StrIntThemeComponent, StrIntThemeComponentViewModel>().ReverseMap();
cfg.CreateMap<StringThemeComponent, StringThemeComponentViewModel>().ReverseMap();
cfg.CreateMap<IconThemeComponent, IconThemeComponentViewModel>().ReverseMap();
cfg.CreateMap<EffectColorThemeComponent, EffectColorThemeComponentViewModel>().ReverseMap();
cfg.CreateMap<IThemeEditorViewModel, Theme>();
});

View File

@ -45,6 +45,14 @@ namespace Filtration.Converters
{
themeComponentType = ThemeComponentType.CustomSound;
}
else if (blockItem.GetType() == typeof(MapIconBlockItem))
{
themeComponentType = ThemeComponentType.Icon;
}
else if (blockItem.GetType() == typeof(PlayEffectBlockItem))
{
themeComponentType = ThemeComponentType.Effect;
}
else
{
return null;

View File

@ -1,28 +1,29 @@
using System;
using Filtration.ObjectModel.Enums;
using System;
using System.Globalization;
using System.Windows.Data;
namespace Filtration.Converters
{
internal class DropIconConverter : IValueConverter
internal class IconShapeToSourceConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var iconString = (string)value;
switch(iconString)
var iconShape = (IconShape)(int)value;
switch (iconShape)
{
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";
case IconShape.Circle:
return "/Filtration;component/Resources/DropIcons/Circle.png";
case IconShape.Diamond:
return "/Filtration;component/Resources/DropIcons/Diamond.png";
case IconShape.Hexagon:
return "/Filtration;component/Resources/DropIcons/Hexagon.png";
case IconShape.Square:
return "/Filtration;component/Resources/DropIcons/Square.png";
case IconShape.Star:
return "/Filtration;component/Resources/DropIcons/Star.png";
case IconShape.Triangle:
return "/Filtration;component/Resources/DropIcons/Triangle.png";
}
return "/Filtration;component/Resources/DropIcons/NoIcon.png";

View File

@ -0,0 +1,33 @@
using Filtration.ObjectModel.Enums;
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace Filtration.Converters
{
internal class SizeColorToRectConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var size = (int)(values[0]);
var color = (int)(values[1]);
if (size < 0 || color < 0)
return new Rect(0, 0, 0, 0);
Rect cropArea = new Rect();
cropArea.Width = 64;
cropArea.Height = 64;
cropArea.X = 0 + size * 64;
cropArea.Y = 0 + color * 64;
return cropArea;
}
public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@ -167,12 +167,11 @@
<Compile Include="Converters\BooleanToBlockActionInverseConverter.cs" />
<Compile Include="Converters\BooleanToBlockActionConverter.cs" />
<Compile Include="Converters\BlockItemToRemoveEnabledVisibilityConverter.cs" />
<Compile Include="Converters\DropIconConverter.cs" />
<Compile Include="Converters\SizeColorToRectConverter.cs" />
<Compile Include="Converters\HashSignRemovalConverter.cs" />
<Compile Include="Converters\IconShapeToSourceConverter.cs" />
<Compile Include="Converters\ItemRarityConverter.cs" />
<Compile Include="Converters\TreeViewMarginConverter.cs" />
<Compile Include="Extensions\EnumerationExtension.cs" />
<Compile Include="Extensions\HyperlinkExtensions.cs" />
<Compile Include="Models\UpdateData.cs" />
<Compile Include="Properties\Annotations.cs" />
<Compile Include="Repositories\ItemFilterScriptRepository.cs" />
@ -546,13 +545,13 @@
</None>
<Resource Include="Resources\Icons\redo_icon.png" />
<Resource Include="Resources\Icons\undo_icon.png" />
<Resource Include="Resources\DropIcons\Icon1.png" />
<Resource Include="Resources\DropIcons\Icon2.png" />
<Resource Include="Resources\DropIcons\Icon3.png" />
<Resource Include="Resources\DropIcons\Icon4.png" />
<Resource Include="Resources\DropIcons\Icon5.png" />
<Resource Include="Resources\DropIcons\Icon6.png" />
<Resource Include="Resources\DropIcons\NoIcon.png" />
<Resource Include="Resources\DropIcons\Circle.png" />
<Resource Include="Resources\DropIcons\Diamond.png" />
<Resource Include="Resources\DropIcons\Hexagon.png" />
<Resource Include="Resources\DropIcons\Square.png" />
<Resource Include="Resources\DropIcons\Star.png" />
<Resource Include="Resources\DropIcons\Triangle.png" />
<Content Include="Resources\ItemBaseTypes.txt" />
<Content Include="Resources\ItemClasses.txt" />
</ItemGroup>

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

View File

@ -1,5 +1,6 @@
A Mother's Parting Gift
Abandoned Wealth
Aberrant Fossil
Abyssal Axe
Abyssal Cry
Abyssal Sceptre
@ -10,6 +11,7 @@ Added Cold Damage Support
Added Fire Damage Support
Added Lightning Damage Support
Additional Accuracy Support
Aetheric Fossil
Agate Amulet
Albino Rhoa Feather
Alchemy Shard
@ -111,6 +113,7 @@ Battle Sword
Bazaar Map
Beach Map
Bear Trap
Beauty Through Death
Behemoth Mace
Belfry Map
Bestel's Manuscript
@ -148,6 +151,7 @@ Blood Raiment
Blood Sceptre
Bloodlines Leaguestone
Bloodlust Support
Bloodstained Fossil
Blue Pearl Amulet
Blunt Arrow Quiver
Boarding Axe
@ -161,9 +165,11 @@ Bone Helmet
Bone Offering
Bone Spirit Shield
Bonespire Talisman
Boon of the First Ones
Boot Blade
Boot Knife
Bottled Storm
Bound Fossil
Boundless Realms
Bowyer's Dream
Branded Kite Shield
@ -293,6 +299,7 @@ Conjurer Boots
Conjurer Gloves
Conjurer's Vestment
Conquest Chainmail
Consecrated Path
Conservatory Map
Contagion
Controlled Destruction Support
@ -309,6 +316,7 @@ Core Map
Coronal Leather
Coronal Maul
Corroded Blade
Corroded Fossil
Corroded Tower Shield
Corrugated Buckler
Corsair Sword
@ -388,6 +396,7 @@ Defiled Cathedral Map
Deicide Mask
Demon Dagger
Demon's Horn
Dense Fossil
Desecrate
Desert Brigandine
Desert Map
@ -463,6 +472,8 @@ Emperor of Purity
Emperor's Luck
Empower Support
Enameled Buckler
Enchanted Fossil
Encrusted Fossil
Endurance Charge on Melee Stun Support
Enduring Cry
Enfeeble
@ -508,6 +519,7 @@ Ezomyte Dagger
Ezomyte Spiked Shield
Ezomyte Staff
Ezomyte Tower Shield
Faceted Fossil
Factory Map
Fancy Foil
Fangjaw Talisman
@ -552,6 +564,7 @@ Fork Support
Fortify Support
Fossilised Spirit Shield
Foul Staff
Fractured Fossil
Fragment of the Chimera
Fragment of the Hydra
Fragment of the Minotaur
@ -561,6 +574,7 @@ Freezing Pulse
Frenzy
Fright Claw
Fright Maul
Frigid Fossil
Frontier Leather
Frost Blades
Frost Bomb
@ -590,6 +604,7 @@ Giant Mana Flask
Gift of the Gemling Queen
Gilded Axe
Gilded Buckler
Gilded Fossil
Gilded Sallet
Girded Tower Shield
Glacial Cascade
@ -602,6 +617,7 @@ Glassblower's Bauble
Glimmer of Hope
Glorious Leather
Glorious Plate
Glyphic Fossil
Gnarled Branch
Goat's Horn
Goathide Boots
@ -675,8 +691,10 @@ Heavy Quiver
Heavy Strike
Hellion's Paw
Her Mask
Herald of Agony
Herald of Ash
Herald of Ice
Herald of Purity
Herald of Thunder
Heterochromia
Hexclaw Talisman
@ -684,6 +702,7 @@ Highborn Bow
Highborn Staff
Highland Blade
Hinekora's Hair
Hollow Fossil
Holy Chainmail
Hook Sword
Hope
@ -759,6 +778,7 @@ Jade Chopper
Jade Flask
Jade Hatchet
Jagged Foil
Jagged Fossil
Jagged Maul
Jasper Axe
Jasper Chopper
@ -843,6 +863,7 @@ Lordly Plate
Loricated Ringmail
Lost Worlds
Loyalty
Lucent Fossil
Lucky Connections
Lucky Deck
Lunaris Circlet
@ -884,6 +905,7 @@ Merciless Armament
Mesa Map
Mesh Boots
Mesh Gloves
Metallic Fossil
Miasmeter
Midnight Blade
Might is Right
@ -995,13 +1017,13 @@ Penetrating Arrow Quiver
Peninsula Map
Perandus Coin
Perandus Leaguestone
Perfect Fossil
Perfection
Pernarch
Petrified Club
Phantasmagoria Map
Phantom Mace
Phase Run
Physical Projectile Attack Damage Support
Physical to Lightning Support
Pier Map
Pierce Support
@ -1031,19 +1053,29 @@ Port Map
Portal
Portal Scroll
Portal Shredder
Potent Alchemical Resonator
Potent Chaotic Resonator
Power Charge On Critical Support
Power Siphon
Powerful Alchemical Resonator
Powerful Chaotic Resonator
Praetor Crown
Precinct Map
Prehistoric Claw
Pride Before the Fall
Primal Skull Talisman
Prime Alchemical Resonator
Prime Chaotic Resonator
Primeval Rapier
Primitive Alchemical Resonator
Primitive Chaotic Resonator
Primitive Staff
Primordial Pool Map
Primordial Staff
Prismatic Fossil
Prismatic Jewel
Prismatic Ring
Pristine Fossil
Profane Wand
Projectile Weakness
Promenade Map
@ -1157,6 +1189,7 @@ Sambar Sceptre
Samite Gloves
Samite Helmet
Samite Slippers
Sanctified Fossil
Sanctified Life Flask
Sanctified Mana Flask
Sand of Eternity
@ -1173,7 +1206,9 @@ Scarlet Round Shield
Scholar Boots
Scholar of the Seas
Scholar's Robe
Scorched Fossil
Scorching Ray
Scourge Arrow
Screaming Essence
Screaming Essence of Anger
Screaming Essence of Anguish
@ -1212,6 +1247,7 @@ Serpentscale Boots
Serpentscale Gauntlets
Serrated Arrow Quiver
Serrated Foil
Serrated Fossil
Shabby Jerkin
Shackled Boots
Shadow Axe
@ -1221,7 +1257,6 @@ Shagreen Gloves
Shagreen Tower Shield
Shaper's Orb
Shaper's Orb (Tier 1)
Shaper's Orb (Tier 10)
Shaper's Orb (Tier 2)
Shaper's Orb (Tier 3)
Shaper's Orb (Tier 4)
@ -1230,6 +1265,7 @@ Shaper's Orb (Tier 6)
Shaper's Orb (Tier 7)
Shaper's Orb (Tier 8)
Shaper's Orb (Tier 9)
Shaper's Orb (Tier 10)
Shard of Fate
Sharkskin Boots
Sharkskin Gloves
@ -1265,6 +1301,7 @@ Shrieking Essence of Woe
Shrieking Essence of Wrath
Shrieking Essence of Zeal
Shrine Map
Shuddering Fossil
Siege Axe
Siege Ballista
Siege Helmet
@ -1299,6 +1336,7 @@ Small Hybrid Flask
Small Life Flask
Small Mana Flask
Smallsword
Smite
Smoke Mine
Sniper Bow
Solar Maul
@ -1385,6 +1423,7 @@ Sulphur Vents Map
Summit Map
Summon Chaos Golem
Summon Flame Golem
Summon Holy Relic
Summon Ice Golem
Summon Lightning Golem
Summon Phantasm on Kill Support
@ -1402,6 +1441,7 @@ Sweep
Swift Affliction Support
Talisman Leaguestone
Talon Axe
Tangled Fossil
Tarnished Spirit Shield
Teak Round Shield
Tectonic Slam
@ -1431,6 +1471,7 @@ The Blazing Fire
The Body
The Breach
The Brittle Emperor
The Cacophony
The Calling
The Carrion Crow
The Cartographer
@ -1456,6 +1497,7 @@ The Dreamer
The Dreamland
The Drunken Aristocrat
The Encroaching Darkness
The Endless Darkness
The Endurance
The Enlightened
The Ethereal
@ -1483,6 +1525,7 @@ The Hoarder
The Hunger
The Immortal
The Incantation
The Innocent
The Inoculated
The Insatiable
The Inventor
@ -1512,6 +1555,7 @@ The Penitent
The Poet
The Polymath
The Porcupine
The Price of Protection
The Professor
The Puzzle
The Queen
@ -1548,6 +1592,7 @@ The Throne
The Tower
The Traitor
The Trial
The Twilight Moon
The Twins
The Tyrant
The Undaunted
@ -1562,6 +1607,7 @@ The Warden
The Warlord
The Watcher
The Web
The Wilted Rose
The Wind
The Witch
The Wolf
@ -1589,6 +1635,7 @@ Tiger's Paw
Timber Axe
Time-Lost Relic
Timeworn Claw
Timeworn Reliquary Key
Titan Gauntlets
Titan Greaves
Titanium Spirit Shield
@ -1604,6 +1651,7 @@ Torture Chamber Map
Totemic Maul
Tower Key
Tower Map
Toxic Rain
Toxic Sewer Map
Tranquillity
Transmutation Shard
@ -1644,6 +1692,7 @@ Unset Ring
Unshaping Orb
Ursine Pelt
Uul-Netol's Breachstone
Vaal Ancestral Warchief
Vaal Arc
Vaal Axe
Vaal Blade
@ -1713,6 +1762,7 @@ Vial of Summoning
Vial of the Ghost
Vial of the Ritual
Vial of Transcendence
Vicious Projectiles Support
Vigilant Strike
Vile Staff
Vile Toxins Support
@ -1790,6 +1840,7 @@ Wild Leather
Wild Strike
Wings of Vastiri
Wither
Withering Touch Support
Wolf Pelt
Woodful Staff
Woodsplitter

View File

@ -9,6 +9,7 @@ Bows
Claws
Currency
Daggers
Delve Stackable Currency
Divination Card
Fishing Rods
Flasks

View File

@ -7,7 +7,7 @@
xmlns:commonConverters="clr-namespace:Filtration.Common.Converters;assembly=Filtration.Common"
xmlns:blockItemBaseTypes="clr-namespace:Filtration.ObjectModel.BlockItemBaseTypes;assembly=Filtration.ObjectModel"
xmlns:blockItemTypes="clr-namespace:Filtration.ObjectModel.BlockItemTypes;assembly=Filtration.ObjectModel"
xmlns:extensions="clr-namespace:Filtration.Extensions"
xmlns:extensions="clr-namespace:Filtration.Common.Extensions;assembly=Filtration.Common"
xmlns:enums="clr-namespace:Filtration.ObjectModel.Enums;assembly=Filtration.ObjectModel"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:views="clr-namespace:Filtration.Views"
@ -86,14 +86,25 @@
<userControls:EditableListBoxControl Margin="5,5,5,5" ItemsSource="{Binding Items}" />
</DataTemplate>
<!-- Beam Block Template -->
<DataTemplate DataType="{x:Type blockItemTypes:BeamBlockItem}">
<!-- Play Effect Block Template -->
<DataTemplate DataType="{x:Type blockItemTypes:PlayEffectBlockItem}">
<StackPanel>
<WrapPanel VerticalAlignment="Center" Margin="5,5,5,5">
<RadioButton IsChecked="{Binding BooleanValue}" Margin="0,0,10,0">Permanent</RadioButton>
<RadioButton IsChecked="{Binding BooleanValue, Converter={StaticResource BoolInverterConverter}}" >Temporary</RadioButton>
<RadioButton IsChecked="{Binding Temporary, Converter={StaticResource BoolInverterConverter}}" Margin="0,0,10,0">Permanent</RadioButton>
<RadioButton IsChecked="{Binding Temporary}" >Temporary</RadioButton>
</WrapPanel>
<xctk:ColorPicker SelectedColor="{Binding Color}" AvailableColors="{Binding ElementName=BlockItemContentControl, Path=DataContext.AvailableColors }" ShowAvailableColors="True" AvailableColorsHeader="Path of Exile Colors"/>
<ComboBox ItemsSource="{Binding Source={extensions:Enumeration {x:Type enums:EffectColor}}}" Style="{StaticResource MetroComboBox}"
DisplayMemberPath="Description"
SelectedValue="{Binding Color}"
SelectedValuePath="Value" />
<userControls:ThemeComponentSelectionControl ThemeComponent="{Binding ThemeComponent}" Margin="0,2,0,0">
<userControls:ThemeComponentSelectionControl.AvailableThemeComponents>
<MultiBinding Converter="{StaticResource AvailableThemeComponentsConverter}">
<Binding Path="DataContext.Script.ThemeComponents" RelativeSource="{RelativeSource AncestorType={x:Type views:ItemFilterScriptView}}"/>
<Binding Path="." />
</MultiBinding>
</userControls:ThemeComponentSelectionControl.AvailableThemeComponents>
</userControls:ThemeComponentSelectionControl>
</StackPanel>
</DataTemplate>
@ -171,11 +182,30 @@
</WrapPanel>
</DataTemplate>
<!-- Drop Icon Template -->
<DataTemplate DataType="{x:Type blockItemTypes:IconBlockItem}">
<WrapPanel HorizontalAlignment="Left">
<userControls:ImageComboBoxControl/>
</WrapPanel>
<!-- Map Icon Template -->
<DataTemplate DataType="{x:Type blockItemTypes:MapIconBlockItem}">
<StackPanel Orientation="Vertical" Margin="5,5,5,5">
<ComboBox ItemsSource="{Binding Source={extensions:Enumeration {x:Type enums:IconSize}}}" Style="{StaticResource MetroComboBox}"
DisplayMemberPath="Description"
SelectedValue="{Binding Size}"
SelectedValuePath="Value" />
<ComboBox ItemsSource="{Binding Source={extensions:Enumeration {x:Type enums:IconColor}}}" Style="{StaticResource MetroComboBox}"
DisplayMemberPath="Description"
SelectedValue="{Binding Color}"
SelectedValuePath="Value" />
<ComboBox ItemsSource="{Binding Source={extensions:Enumeration {x:Type enums:IconShape}}}" Style="{StaticResource MetroComboBox}"
DisplayMemberPath="Description"
SelectedValue="{Binding Shape}"
SelectedValuePath="Value" />
<userControls:ThemeComponentSelectionControl ThemeComponent="{Binding ThemeComponent}" Margin="0,2,0,0">
<userControls:ThemeComponentSelectionControl.AvailableThemeComponents>
<MultiBinding Converter="{StaticResource AvailableThemeComponentsConverter}">
<Binding Path="DataContext.Script.ThemeComponents" RelativeSource="{RelativeSource AncestorType={x:Type views:ItemFilterScriptView}}"/>
<Binding Path="." />
</MultiBinding>
</userControls:ThemeComponentSelectionControl.AvailableThemeComponents>
</userControls:ThemeComponentSelectionControl>
</StackPanel>
</DataTemplate>
<!-- Custom Sound Template -->

View File

@ -90,10 +90,6 @@ namespace Filtration.UserControls
"ShFusing", "ShRegal", "ShVaal"
};
public List<string> IconsAvailable => new List<string> {
"Icon1", "Icon2", "Icon3", "Icon4", "Icon5", "Icon6"
};
private void OnSetBlockValueCommmand()
{
var blockItemWithTheme = BlockItem as IBlockItemWithTheme;
@ -121,6 +117,17 @@ namespace Filtration.UserControls
var stringBlockItem = BlockItem as StringBlockItem;
stringBlockItem.Value = ((StringThemeComponent)stringBlockItem.ThemeComponent).Value;
break;
case ThemeComponentType.Icon:
var iconBlockItem = BlockItem as IconBlockItem;
iconBlockItem.Size = ((IconThemeComponent)iconBlockItem.ThemeComponent).IconSize;
iconBlockItem.Color = ((IconThemeComponent)iconBlockItem.ThemeComponent).IconColor;
iconBlockItem.Shape = ((IconThemeComponent)iconBlockItem.ThemeComponent).IconShape;
break;
case ThemeComponentType.Effect:
var effectColorBlockItem = BlockItem as EffectColorBlockItem;
effectColorBlockItem.Color = ((EffectColorThemeComponent)effectColorBlockItem.ThemeComponent).EffectColor;
effectColorBlockItem.Temporary = ((EffectColorThemeComponent)effectColorBlockItem.ThemeComponent).Temporary;
break;
}
}

View File

@ -8,7 +8,7 @@
mc:Ignorable="d">
<UserControl.Resources>
<Converters:DropIconConverter x:Key="DropIconConverter"/>
<Converters:SizeColorToRectConverter x:Key="DropIconConverter"/>
</UserControl.Resources>
<Grid>

View File

@ -8,7 +8,7 @@
d:DataContext="{d:DesignInstance Type=userControls:ItemPreviewControl}"
d:DesignHeight="35" d:DesignWidth="170">
<Border BorderBrush="Black" BorderThickness="1">
<Grid Width="166" Height="39">
<Grid Width="200" Height="39">
<Image Source="pack://application:,,,/resources/groundtile.png" Stretch="Fill" />
<Grid>
<Grid.RowDefinitions>

View File

@ -5,7 +5,7 @@
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:extensions="clr-namespace:Filtration.Extensions"
xmlns:extensions="clr-namespace:Filtration.Common.Extensions;assembly=Filtration.Common"
xmlns:userControls="clr-namespace:Filtration.UserControls"
xmlns:enums="clr-namespace:Filtration.ObjectModel.Enums;assembly=Filtration.ObjectModel"
mc:Ignorable="d"

View File

@ -67,6 +67,14 @@
<DataTemplate DataType="{x:Type themeEditor:StringThemeComponent}">
<!--TODO: How to show theese?-->
</DataTemplate>
<DataTemplate DataType="{x:Type themeEditor:IconThemeComponent}">
<!--TODO: How to show theese?-->
</DataTemplate>
<DataTemplate DataType="{x:Type themeEditor:EffectColorThemeComponent}">
<!--TODO: How to show theese?-->
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</Grid>

View File

@ -8,6 +8,7 @@ using System.Windows.Media;
using Filtration.ObjectModel;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.BlockItemTypes;
using Filtration.ObjectModel.Enums;
using Filtration.Services;
using Filtration.Views;
using GalaSoft.MvvmLight.CommandWpf;
@ -181,6 +182,7 @@ namespace Filtration.ViewModels
typeof (CorruptedBlockItem),
typeof (ElderItemBlockItem),
typeof (ShaperItemBlockItem),
typeof (MapTierBlockItem),
typeof (ShapedMapBlockItem),
typeof (ElderMapBlockItem),
typeof (GemLevelBlockItem),
@ -197,8 +199,8 @@ namespace Filtration.ViewModels
typeof (SoundBlockItem),
typeof (PositionalSoundBlockItem),
typeof (DisableDropSoundBlockItem),
typeof (IconBlockItem),
typeof (BeamBlockItem),
typeof (MapIconBlockItem),
typeof (PlayEffectBlockItem),
typeof (CustomSoundBlockItem)
};
@ -241,8 +243,10 @@ 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 Color DisplayBeamColor => Block.DisplayBeamColor;
public int DisplayIconSize => Block.DisplayIconSize;
public int DisplayIconColor => Block.DisplayIconColor;
public int DisplayIconShape => Block.DisplayIconShape;
public Color DisplayEffectColor => Block.DisplayEffectColor;
public bool HasSound => Block.HasBlockItemOfType<SoundBlockItem>();
public bool HasPositionalSound => Block.HasBlockItemOfType<PositionalSoundBlockItem>();
@ -476,8 +480,10 @@ namespace Filtration.ViewModels
RaisePropertyChanged(nameof(DisplayBackgroundColor));
RaisePropertyChanged(nameof(DisplayBorderColor));
RaisePropertyChanged(nameof(DisplayFontSize));
RaisePropertyChanged(nameof(DisplayIcon));
RaisePropertyChanged(nameof(DisplayBeamColor));
RaisePropertyChanged(nameof(DisplayIconSize));
RaisePropertyChanged(nameof(DisplayIconColor));
RaisePropertyChanged(nameof(DisplayIconShape));
RaisePropertyChanged(nameof(DisplayEffectColor));
RaisePropertyChanged(nameof(HasSound));
RaisePropertyChanged(nameof(HasPositionalSound));
RaisePropertyChanged(nameof(HasCustomSound));

View File

@ -117,6 +117,8 @@ namespace Filtration.ViewModels
AddFontSizeThemeComponentCommand = new RelayCommand(OnAddFontSizeThemeComponentCommand, () => ActiveDocumentIsTheme && ActiveThemeIsEditable);
AddAlertSoundThemeComponentCommand = new RelayCommand(OnAddAlertSoundThemeComponentCommand, () => ActiveDocumentIsTheme && ActiveThemeIsEditable);
AddCustomSoundThemeComponentCommand = new RelayCommand(OnAddCustomSoundThemeComponentCommand, () => ActiveDocumentIsTheme && ActiveThemeIsEditable);
AddIconThemeComponentCommand = new RelayCommand(OnAddIconThemeComponentCommand, () => ActiveDocumentIsTheme && ActiveThemeIsEditable);
AddEffectColorThemeComponentCommand = new RelayCommand(OnAddEffectColorThemeComponentCommand, () => ActiveDocumentIsTheme && ActiveThemeIsEditable);
DeleteThemeComponentCommand = new RelayCommand(OnDeleteThemeComponentCommand, () => ActiveDocumentIsTheme && ActiveThemeIsEditable && _avalonDockWorkspaceViewModel.ActiveThemeViewModel.SelectedThemeComponent != null);
ExpandAllBlocksCommand = new RelayCommand(OnExpandAllBlocksCommand, () => ActiveDocumentIsScript);
@ -219,6 +221,8 @@ namespace Filtration.ViewModels
public RelayCommand AddFontSizeThemeComponentCommand { get; }
public RelayCommand AddAlertSoundThemeComponentCommand { get; }
public RelayCommand AddCustomSoundThemeComponentCommand { get; }
public RelayCommand AddIconThemeComponentCommand { get; }
public RelayCommand AddEffectColorThemeComponentCommand { get; }
public RelayCommand DeleteThemeComponentCommand { get; }
public RelayCommand AddBlockCommand { get; }
@ -698,6 +702,16 @@ namespace Filtration.ViewModels
_avalonDockWorkspaceViewModel.ActiveThemeViewModel.AddThemeComponentCommand.Execute(ThemeComponentType.CustomSound);
}
private void OnAddIconThemeComponentCommand()
{
_avalonDockWorkspaceViewModel.ActiveThemeViewModel.AddThemeComponentCommand.Execute(ThemeComponentType.Icon);
}
private void OnAddEffectColorThemeComponentCommand()
{
_avalonDockWorkspaceViewModel.ActiveThemeViewModel.AddThemeComponentCommand.Execute(ThemeComponentType.Effect);
}
private void OnDeleteThemeComponentCommand()
{
_avalonDockWorkspaceViewModel.ActiveThemeViewModel.DeleteThemeComponentCommand.Execute(

View File

@ -1,7 +1,7 @@
<Window x:Class="Filtration.Views.AboutWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:extensions="clr-namespace:Filtration.Extensions"
xmlns:extensions="clr-namespace:Filtration.Common.Extensions;assembly=Filtration.Common"
Title="About Filtration"
Height="360"
Width="580"

View File

@ -18,7 +18,8 @@
<ResourceDictionary>
<views:BindingProxy x:Key="Proxy" Data="{Binding}" />
<converters:BlockGroupAdvancedFillColorConverter x:Key="BlockGroupAdvancedFillColorConverter" />
<converters:DropIconConverter x:Key="DropIconConverter"/>
<converters:IconShapeToSourceConverter x:Key="IconShapeToSourceConverter"/>
<converters:SizeColorToRectConverter x:Key="SizeColorToRectConverter"/>
<Style TargetType="{x:Type ContentPresenter}" x:Key="BlockItemFadeInStyle">
<Setter Property="LayoutTransform">
<Setter.Value>
@ -131,12 +132,19 @@
<!-- Item Preview Box -->
<WrapPanel Grid.Row="0" Grid.Column="2" VerticalAlignment="Center">
<Image Source="{Binding DisplayIcon, Converter={StaticResource DropIconConverter}, Mode=OneWay}" Width="30" Height="30" Margin="0,0,10,0" />
<Line Y2="41" StrokeThickness="2" Stroke="{Binding DisplayBeamColor, Converter={StaticResource ColorToSolidColorBrushConverter}, Mode=OneWay}" Margin="0,2,10,0" >
<Line.Effect>
<DropShadowEffect BlurRadius="5" ShadowDepth="0" Color="{Binding DisplayBeamColor, Mode=OneWay}" Direction="0"/>
</Line.Effect>
</Line>
<Rectangle Height="40" Width="40" Margin="0,0,10,0">
<Rectangle.Fill>
<ImageBrush ImageSource="{Binding DisplayIconShape, Converter={StaticResource IconShapeToSourceConverter}, Mode=OneWay}"
ViewboxUnits="Absolute" Stretch="Fill">
<ImageBrush.Viewbox>
<MultiBinding Converter="{StaticResource SizeColorToRectConverter}">
<Binding Path="DisplayIconSize"/>
<Binding Path="DisplayIconColor"/>
</MultiBinding>
</ImageBrush.Viewbox>
</ImageBrush>
</Rectangle.Fill>
</Rectangle>
<Button Command="{Binding PlaySoundCommand}"
Width="25"
Height="25"
@ -173,7 +181,14 @@
ToolTip="Click to preview drop sound">
<Image Source="/Filtration;component/Resources/Icons/speaker_icon.png" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Button>
<ToggleButton Margin="0,2,2,2"
<Line Y1="5" Y2="38" StrokeThickness="2" Panel.ZIndex="999"
Stroke="{Binding DisplayEffectColor, Converter={StaticResource ColorToSolidColorBrushConverter}, Mode=OneWay}"
Margin="10,2,0,0" >
<Line.Effect>
<DropShadowEffect BlurRadius="5" ShadowDepth="0" Color="{Binding DisplayEffectColor, Mode=OneWay}" Direction="0"/>
</Line.Effect>
</Line>
<ToggleButton Margin="-10,2,2,2"
Style="{StaticResource ChromelessToggleButton}"
x:Name="ItemPreviewButton"
IsChecked="{Binding AudioVisualBlockItemsGridVisible}"

View File

@ -132,6 +132,8 @@
<fluent:Button SizeDefinition="Middle" Header="Add Font Size" Icon="{StaticResource AddIcon}" Command="{Binding AddFontSizeThemeComponentCommand}" />
<fluent:Button SizeDefinition="Middle" Header="Add Alert Sound" Icon="{StaticResource AddIcon}" Command="{Binding AddAlertSoundThemeComponentCommand}" />
<fluent:Button SizeDefinition="Middle" Header="Add Custom Sound" Icon="{StaticResource AddIcon}" Command="{Binding AddCustomSoundThemeComponentCommand}" />
<fluent:Button SizeDefinition="Middle" Header="Add Icon" Icon="{StaticResource AddIcon}" Command="{Binding AddIconThemeComponentCommand}" />
<fluent:Button SizeDefinition="Middle" Header="Add Effect Color" Icon="{StaticResource AddIcon}" Command="{Binding AddEffectColorThemeComponentCommand}" />
</fluent:RibbonGroupBox>
<fluent:RibbonGroupBox Header="Delete">
<fluent:Button Header="Delete Theme Component" Icon="{StaticResource ThemeComponentDeleteIcon}" LargeIcon="{StaticResource ThemeComponentDeleteIcon}" Command="{Binding DeleteThemeComponentCommand}" />