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.Linq;
using System.Windows.Markup; using System.Windows.Markup;
namespace Filtration.Extensions namespace Filtration.Common.Extensions
{ {
internal class EnumerationExtension : MarkupExtension public class EnumerationExtension : MarkupExtension
{ {
private Type _enumType; private Type _enumType;

View File

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

View File

@ -75,6 +75,8 @@
<Compile Include="Converters\ColorToSolidColorBrushConverter.cs" /> <Compile Include="Converters\ColorToSolidColorBrushConverter.cs" />
<Compile Include="Converters\InverseBooleanVisibilityConverter.cs" /> <Compile Include="Converters\InverseBooleanVisibilityConverter.cs" />
<Compile Include="Converters\StringToVisibilityConverter.cs" /> <Compile Include="Converters\StringToVisibilityConverter.cs" />
<Compile Include="Extensions\EnumerationExtension.cs" />
<Compile Include="Extensions\HyperlinkExtensions.cs" />
<Compile Include="Messages\ThemeClosedMessage.cs" /> <Compile Include="Messages\ThemeClosedMessage.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\FileSystemService.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 string PrefixText => "SetBackgroundColor";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Background Color"; 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 SummaryBackgroundColor => Colors.MediumTurquoise;
public override Color SummaryTextColor => Colors.Black; 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 string PrefixText => "SetBorderColor";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Border Color"; 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 SummaryBackgroundColor => Colors.MediumSeaGreen;
public override Color SummaryTextColor => Colors.White; 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 string PrefixText => "CustomAlertSound";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Custom Alert Sound"; 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 string DisplayHeading => "Disable Drop Sound";
public override Color SummaryBackgroundColor => Colors.Transparent; public override Color SummaryBackgroundColor => Colors.Transparent;
public override Color SummaryTextColor => 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 string SummaryText => "Drop Level " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DodgerBlue; public override Color SummaryBackgroundColor => Colors.DodgerBlue;
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 14; public override int SortOrder => 15;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 100; public override int Maximum => 100;
} }

View File

@ -17,7 +17,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string DisplayHeading => "Elder Map"; public override string DisplayHeading => "Elder Map";
public override Color SummaryBackgroundColor => Colors.DarkGoldenrod; public override Color SummaryBackgroundColor => Colors.DarkGoldenrod;
public override Color SummaryTextColor => Colors.White; 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 string PrefixText => "SetFontSize";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Font Size"; public override string DisplayHeading => "Font Size";
public override int SortOrder => 24; public override int SortOrder => 25;
public override int Minimum => 11; public override int Minimum => 11;
public override int Maximum => 45; public override int Maximum => 45;
} }

View File

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

View File

@ -33,6 +33,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override Color SummaryBackgroundColor => Colors.MidnightBlue; public override Color SummaryBackgroundColor => Colors.MidnightBlue;
public override Color SummaryTextColor => Colors.White; 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 string SummaryText => "Height " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.LightBlue; public override Color SummaryBackgroundColor => Colors.LightBlue;
public override Color SummaryTextColor => Colors.Black; public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 11; public override int SortOrder => 12;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 6; 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 string SummaryText => "Item Level " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkSlateGray; public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 13; public override int SortOrder => 14;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 100; 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 string PrefixText => "PlayAlertSoundPositional";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Play Positional Alert Sound"; 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(); ((ItemRarity) FilterPredicate.PredicateOperand).GetAttributeDescription();
public override Color SummaryBackgroundColor => Colors.LightCoral; public override Color SummaryBackgroundColor => Colors.LightCoral;
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 17; public override int SortOrder => 18;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => (int)ItemRarity.Unique; 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 string DisplayHeading => "Shaped Map";
public override Color SummaryBackgroundColor => Colors.DarkGoldenrod; public override Color SummaryBackgroundColor => Colors.DarkGoldenrod;
public override Color SummaryTextColor => Colors.White; 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 SummaryBackgroundColor => Colors.GhostWhite;
public override Color SummaryTextColor => Colors.Black; public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 10; public override int SortOrder => 11;
private SocketColor StringToSocketColor(char socketColorString) private SocketColor StringToSocketColor(char socketColorString)
{ {

View File

@ -17,6 +17,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "PlayAlertSound"; public override string PrefixText => "PlayAlertSound";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Play Alert Sound"; 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 string SummaryText => "Stack Size " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkSlateGray; public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 16; public override int SortOrder => 17;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 1000; public override int Maximum => 1000;
} }

View File

@ -16,6 +16,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "SetTextColor"; public override string PrefixText => "SetTextColor";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Text Color"; 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 string SummaryText => "Width " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.MediumPurple; public override Color SummaryBackgroundColor => Colors.MediumPurple;
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 12; public override int SortOrder => 13;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 2; 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")] [Description("Alert Sound")]
AlertSound, AlertSound,
[Description("Custom Sound")] [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\ColorBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\ColorBooleanBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\ColorBooleanBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\DualIntegerBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\DualIntegerBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\EffectColorBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\IconBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\StringBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\StringBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\StrIntBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\StrIntBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\IntegerBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\IntegerBlockItem.cs" />
@ -77,7 +79,8 @@
<Compile Include="BlockItemBaseTypes\StringListBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\StringListBlockItem.cs" />
<Compile Include="BlockItemTypes\BackgroundColorBlockItem.cs" /> <Compile Include="BlockItemTypes\BackgroundColorBlockItem.cs" />
<Compile Include="BlockItemTypes\BaseTypeBlockItem.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\BorderColorBlockItem.cs" />
<Compile Include="BlockItemTypes\ClassBlockItem.cs" /> <Compile Include="BlockItemTypes\ClassBlockItem.cs" />
<Compile Include="BlockItemTypes\CustomSoundBlockItem.cs" /> <Compile Include="BlockItemTypes\CustomSoundBlockItem.cs" />
@ -85,7 +88,7 @@
<Compile Include="BlockItemTypes\ElderMapBlockItem.cs" /> <Compile Include="BlockItemTypes\ElderMapBlockItem.cs" />
<Compile Include="BlockItemTypes\GemLevelBlockItem.cs" /> <Compile Include="BlockItemTypes\GemLevelBlockItem.cs" />
<Compile Include="BlockItemTypes\HasExplicitModBlockItem.cs" /> <Compile Include="BlockItemTypes\HasExplicitModBlockItem.cs" />
<Compile Include="BlockItemTypes\IconBlockItem.cs" /> <Compile Include="BlockItemTypes\MapIconBlockItem.cs" />
<Compile Include="BlockItemTypes\ShapedMapBlockItem.cs" /> <Compile Include="BlockItemTypes\ShapedMapBlockItem.cs" />
<Compile Include="BlockItemTypes\ShaperItemBlockItem.cs" /> <Compile Include="BlockItemTypes\ShaperItemBlockItem.cs" />
<Compile Include="BlockItemTypes\ElderItemBlockItem.cs" /> <Compile Include="BlockItemTypes\ElderItemBlockItem.cs" />
@ -122,8 +125,12 @@
<Compile Include="Commands\IUndoableCommand.cs" /> <Compile Include="Commands\IUndoableCommand.cs" />
<Compile Include="Enums\BlockAction.cs" /> <Compile Include="Enums\BlockAction.cs" />
<Compile Include="Enums\BlockItemType.cs" /> <Compile Include="Enums\BlockItemType.cs" />
<Compile Include="Enums\EffectColor.cs" />
<Compile Include="Enums\FilterPredicateOperator.cs" /> <Compile Include="Enums\FilterPredicateOperator.cs" />
<Compile Include="Enums\FilterType.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\ItemRarity.cs" />
<Compile Include="Enums\SocketColor.cs" /> <Compile Include="Enums\SocketColor.cs" />
<Compile Include="Enums\ThemeComponentType.cs" /> <Compile Include="Enums\ThemeComponentType.cs" />
@ -148,6 +155,8 @@
<Compile Include="ReplaceColorsParameterSet.cs" /> <Compile Include="ReplaceColorsParameterSet.cs" />
<Compile Include="Socket.cs" /> <Compile Include="Socket.cs" />
<Compile Include="SocketGroup.cs" /> <Compile Include="SocketGroup.cs" />
<Compile Include="ThemeEditor\EffectColorThemeComponent.cs" />
<Compile Include="ThemeEditor\IconThemeComponent.cs" />
<Compile Include="ThemeEditor\StringThemeComponent.cs" /> <Compile Include="ThemeEditor\StringThemeComponent.cs" />
<Compile Include="ThemeEditor\StrIntThemeComponent.cs" /> <Compile Include="ThemeEditor\StrIntThemeComponent.cs" />
<Compile Include="ThemeEditor\IntegerThemeComponent.cs" /> <Compile Include="ThemeEditor\IntegerThemeComponent.cs" />

View File

@ -23,8 +23,10 @@ namespace Filtration.ObjectModel
Color DisplayTextColor { get; } Color DisplayTextColor { get; }
Color DisplayBorderColor { get; } Color DisplayBorderColor { get; }
double DisplayFontSize { get; } double DisplayFontSize { get; }
string DisplayIcon { get; } int DisplayIconSize { get; }
Color DisplayBeamColor { get; } int DisplayIconColor { get; }
int DisplayIconShape { get; }
Color DisplayEffectColor { get; }
bool HasBlockItemOfType<T>(); bool HasBlockItemOfType<T>();
bool HasBlockGroupInParentHierarchy(ItemFilterBlockGroup targetBlockGroup, ItemFilterBlockGroup startingBlockGroup); bool HasBlockGroupInParentHierarchy(ItemFilterBlockGroup targetBlockGroup, ItemFilterBlockGroup startingBlockGroup);
} }
@ -263,21 +265,68 @@ namespace Filtration.ObjectModel
} }
} }
public string DisplayIcon public int DisplayIconSize
{ {
get get
{ {
var displayIcon = BlockItems.OfType<IconBlockItem>().FirstOrDefault(); var mapIconBlockItem = BlockItems.OfType<MapIconBlockItem>().FirstOrDefault();
return (displayIcon != null) ? displayIcon.Value : ""; if (mapIconBlockItem != null)
return (int)mapIconBlockItem.Size;
return -1;
} }
} }
public Color DisplayBeamColor public int DisplayIconColor
{ {
get get
{ {
var beamBlockItem = BlockItems.OfType<BeamBlockItem>().FirstOrDefault(); var mapIconBlockItem = BlockItems.OfType<MapIconBlockItem>().FirstOrDefault();
return beamBlockItem?.Color ?? new Color { A = 0, R = 0, G = 0, B = 0 }; 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; 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) private bool ComponentExists(ThemeComponentType componentType, string componentName)
{ {
var componentCount = var componentCount =

View File

@ -892,42 +892,6 @@ namespace Filtration.Parser.Tests.Services
Assert.IsTrue(blockItem.BooleanValue); 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] [Test]
public void TranslateStringToItemFilterBlock_Everything_ReturnsCorrectObject() public void TranslateStringToItemFilterBlock_Everything_ReturnsCorrectObject()
{ {
@ -961,9 +925,7 @@ namespace Filtration.Parser.Tests.Services
" SetBorderColor 0 0 0" + Environment.NewLine + " SetBorderColor 0 0 0" + Environment.NewLine +
" SetFontSize 50" + Environment.NewLine + " SetFontSize 50" + Environment.NewLine +
" PlayAlertSound 3" + Environment.NewLine + " PlayAlertSound 3" + Environment.NewLine +
" DisableDropSound False" + Environment.NewLine + " DisableDropSound False" + Environment.NewLine;
" Icon Icon2" + Environment.NewLine +
" BeamColor 255 100 5 false" + Environment.NewLine;
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
@ -1068,15 +1030,6 @@ namespace Filtration.Parser.Tests.Services
var disableDropSoundBlockItem = result.BlockItems.OfType<DisableDropSoundBlockItem>().First(); var disableDropSoundBlockItem = result.BlockItems.OfType<DisableDropSoundBlockItem>().First();
Assert.IsFalse(disableDropSoundBlockItem.BooleanValue); 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] [Test]
@ -1903,23 +1856,6 @@ namespace Filtration.Parser.Tests.Services
Assert.AreEqual(expectedResult, result); 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] [Test]
public void TranslateItemFilterBlockToString_Everything_ReturnsCorrectString() public void TranslateItemFilterBlockToString_Everything_ReturnsCorrectString()
{ {
@ -1951,9 +1887,7 @@ namespace Filtration.Parser.Tests.Services
" SetBorderColor 255 1 254" + Environment.NewLine + " SetBorderColor 255 1 254" + Environment.NewLine +
" SetFontSize 50" + Environment.NewLine + " SetFontSize 50" + Environment.NewLine +
" PlayAlertSound 6 90" + Environment.NewLine + " PlayAlertSound 6 90" + Environment.NewLine +
" DisableDropSound True";/* + Environment.NewLine + " DisableDropSound True";
" Icon Icon4";
" BeamColor 120 130 140 False";*/
_testUtility.TestBlock.BlockItems.Add(new ActionBlockItem(BlockAction.Show)); _testUtility.TestBlock.BlockItems.Add(new ActionBlockItem(BlockAction.Show));
_testUtility.TestBlock.BlockItems.Add(new IdentifiedBlockItem(true)); _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 ShapedMapBlockItem(true));
_testUtility.TestBlock.BlockItems.Add(new ElderMapBlockItem(true)); _testUtility.TestBlock.BlockItems.Add(new ElderMapBlockItem(true));
_testUtility.TestBlock.BlockItems.Add(new DisableDropSoundBlockItem(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 // Act
var result = _testUtility.Translator.TranslateItemFilterBlockToString(_testUtility.TestBlock); var result = _testUtility.Translator.TranslateItemFilterBlockToString(_testUtility.TestBlock);

View File

@ -310,36 +310,59 @@ namespace Filtration.Parser.Services
AddBooleanItemToBlockItems<DisableDropSoundBlockItem>(block, trimmedLine); AddBooleanItemToBlockItems<DisableDropSoundBlockItem>(block, trimmedLine);
break; break;
} }
case "Icon": case "MinimapIcon":
{ {
// Only ever use the last Icon item encountered as multiples aren't valid. // 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) 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); block.BlockItems.Add(blockItemValue);
} }
break; break;
} }
case "BeamColor": case "PlayEffect":
{ {
// Only ever use the last BeamColor item encountered as multiples aren't valid. // 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); // TODO: Get colors programmatically
var color = GetColorFromString(result[0].Groups[1].Value); var match = Regex.Match(trimmedLine, @"\S+\s+(Red|Green|Blue|Brown|White|Yellow)\s+(Temp)?\s*([#]?)(.*)", RegexOptions.IgnoreCase);
var beamBlockItem = new BeamBlockItem
if (match.Success)
{ {
Color = GetColorFromString(result[0].Groups[1].Value), var blockItemValue = new PlayEffectBlockItem
BooleanValue = result[0].Groups[2].Value.Trim().ToLowerInvariant() == "true" {
}; Color = EnumHelper.GetEnumValueFromDescription<EffectColor>(match.Groups[1].Value),
block.BlockItems.Add(beamBlockItem); 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; break;
} }
case "CustomAlertSound": case "CustomAlertSound":
@ -367,6 +390,11 @@ namespace Filtration.Parser.Services
} }
break; break;
} }
case "MapTier":
{
AddNumericFilterPredicateItemToBlockItems<MapTierBlockItem>(block, trimmedLine);
break;
}
} }
} }
@ -640,12 +668,6 @@ namespace Filtration.Parser.Services
// ReSharper disable once LoopCanBeConvertedToQuery // ReSharper disable once LoopCanBeConvertedToQuery
foreach (var blockItem in block.BlockItems.Where(b => b.GetType() != typeof(ActionBlockItem)).OrderBy(b => b.SortOrder)) 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) if (blockItem.OutputText != string.Empty)
{ {
outputString += (!block.Enabled ? _disabledNewLine : _newLine) + blockItem.OutputText; outputString += (!block.Enabled ? _disabledNewLine : _newLine) + blockItem.OutputText;

View File

@ -109,6 +109,8 @@
<Compile Include="Services\ThemePersistenceService.cs" /> <Compile Include="Services\ThemePersistenceService.cs" />
<Compile Include="Services\ThemeService.cs" /> <Compile Include="Services\ThemeService.cs" />
<Compile Include="ViewModels\ColorThemeComponentViewModel.cs" /> <Compile Include="ViewModels\ColorThemeComponentViewModel.cs" />
<Compile Include="ViewModels\EffectColorThemeComponentViewModel.cs" />
<Compile Include="ViewModels\IconThemeComponentViewModel.cs" />
<Compile Include="ViewModels\StringThemeComponentViewModel.cs" /> <Compile Include="ViewModels\StringThemeComponentViewModel.cs" />
<Compile Include="ViewModels\StrIntThemeComponentViewModel.cs" /> <Compile Include="ViewModels\StrIntThemeComponentViewModel.cs" />
<Compile Include="ViewModels\IntegerThemeComponentViewModel.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: case ThemeComponentType.CustomSound:
Components.Add(new StringThemeComponent(themeComponentType, "Untitled Component", "placeholder.mp3")); Components.Add(new StringThemeComponent(themeComponentType, "Untitled Component", "placeholder.mp3"));
break; 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:commonConverters="clr-namespace:Filtration.Common.Converters;assembly=Filtration.Common"
xmlns:themeEditor="clr-namespace:Filtration.ObjectModel.ThemeEditor;assembly=Filtration.ObjectModel" xmlns:themeEditor="clr-namespace:Filtration.ObjectModel.ThemeEditor;assembly=Filtration.ObjectModel"
xmlns:views="clr-namespace:Filtration.ThemeEditor.Views" 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" mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=themeEditor:ThemeComponent}" d:DataContext="{d:DesignInstance Type=themeEditor:ThemeComponent}"
d:DesignHeight="100" d:DesignWidth="200"> d:DesignHeight="100" d:DesignWidth="200">
@ -18,7 +19,7 @@
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="25" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.Resources> <Grid.Resources>
<DataTemplate x:Key="EditableComponentNameTemplate"> <DataTemplate x:Key="EditableComponentNameTemplate">
@ -99,6 +100,38 @@
</Button> </Button>
</Grid> </Grid>
</DataTemplate> </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.Resources>
</ContentControl> </ContentControl>
</Grid> </Grid>

View File

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

View File

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

View File

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

View File

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

View File

@ -7,7 +7,7 @@
xmlns:commonConverters="clr-namespace:Filtration.Common.Converters;assembly=Filtration.Common" xmlns:commonConverters="clr-namespace:Filtration.Common.Converters;assembly=Filtration.Common"
xmlns:blockItemBaseTypes="clr-namespace:Filtration.ObjectModel.BlockItemBaseTypes;assembly=Filtration.ObjectModel" xmlns:blockItemBaseTypes="clr-namespace:Filtration.ObjectModel.BlockItemBaseTypes;assembly=Filtration.ObjectModel"
xmlns:blockItemTypes="clr-namespace:Filtration.ObjectModel.BlockItemTypes;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:enums="clr-namespace:Filtration.ObjectModel.Enums;assembly=Filtration.ObjectModel"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:views="clr-namespace:Filtration.Views" xmlns:views="clr-namespace:Filtration.Views"
@ -86,14 +86,25 @@
<userControls:EditableListBoxControl Margin="5,5,5,5" ItemsSource="{Binding Items}" /> <userControls:EditableListBoxControl Margin="5,5,5,5" ItemsSource="{Binding Items}" />
</DataTemplate> </DataTemplate>
<!-- Beam Block Template --> <!-- Play Effect Block Template -->
<DataTemplate DataType="{x:Type blockItemTypes:BeamBlockItem}"> <DataTemplate DataType="{x:Type blockItemTypes:PlayEffectBlockItem}">
<StackPanel> <StackPanel>
<WrapPanel VerticalAlignment="Center" Margin="5,5,5,5"> <WrapPanel VerticalAlignment="Center" Margin="5,5,5,5">
<RadioButton IsChecked="{Binding BooleanValue}" Margin="0,0,10,0">Permanent</RadioButton> <RadioButton IsChecked="{Binding Temporary, Converter={StaticResource BoolInverterConverter}}" Margin="0,0,10,0">Permanent</RadioButton>
<RadioButton IsChecked="{Binding BooleanValue, Converter={StaticResource BoolInverterConverter}}" >Temporary</RadioButton> <RadioButton IsChecked="{Binding Temporary}" >Temporary</RadioButton>
</WrapPanel> </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> </StackPanel>
</DataTemplate> </DataTemplate>
@ -171,11 +182,30 @@
</WrapPanel> </WrapPanel>
</DataTemplate> </DataTemplate>
<!-- Drop Icon Template --> <!-- Map Icon Template -->
<DataTemplate DataType="{x:Type blockItemTypes:IconBlockItem}"> <DataTemplate DataType="{x:Type blockItemTypes:MapIconBlockItem}">
<WrapPanel HorizontalAlignment="Left"> <StackPanel Orientation="Vertical" Margin="5,5,5,5">
<userControls:ImageComboBoxControl/> <ComboBox ItemsSource="{Binding Source={extensions:Enumeration {x:Type enums:IconSize}}}" Style="{StaticResource MetroComboBox}"
</WrapPanel> 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> </DataTemplate>
<!-- Custom Sound Template --> <!-- Custom Sound Template -->

View File

@ -90,10 +90,6 @@ namespace Filtration.UserControls
"ShFusing", "ShRegal", "ShVaal" "ShFusing", "ShRegal", "ShVaal"
}; };
public List<string> IconsAvailable => new List<string> {
"Icon1", "Icon2", "Icon3", "Icon4", "Icon5", "Icon6"
};
private void OnSetBlockValueCommmand() private void OnSetBlockValueCommmand()
{ {
var blockItemWithTheme = BlockItem as IBlockItemWithTheme; var blockItemWithTheme = BlockItem as IBlockItemWithTheme;
@ -121,6 +117,17 @@ namespace Filtration.UserControls
var stringBlockItem = BlockItem as StringBlockItem; var stringBlockItem = BlockItem as StringBlockItem;
stringBlockItem.Value = ((StringThemeComponent)stringBlockItem.ThemeComponent).Value; stringBlockItem.Value = ((StringThemeComponent)stringBlockItem.ThemeComponent).Value;
break; 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"> mc:Ignorable="d">
<UserControl.Resources> <UserControl.Resources>
<Converters:DropIconConverter x:Key="DropIconConverter"/> <Converters:SizeColorToRectConverter x:Key="DropIconConverter"/>
</UserControl.Resources> </UserControl.Resources>
<Grid> <Grid>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
<Window x:Class="Filtration.Views.AboutWindow" <Window x:Class="Filtration.Views.AboutWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 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" Title="About Filtration"
Height="360" Height="360"
Width="580" Width="580"

View File

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