10 Commits

Author SHA1 Message Date
Ben Wallis
a20c988380 Bumped version to 1.1.0-beta4 2018-12-05 07:04:35 +00:00
Glen M
7ce5aaa861 Support for Path of Exile 3.5 and Betrayal league. (#108)
* Fix #107 by pulling SortOrder form an enum.
* Add initial support for the Prophecy block item.
* Update the static data.
* Hook Prophecy data into the static data service.
* Fill out the initial prophecy data.
2018-12-05 06:59:10 +00:00
Glen M
4b6cee9d94 Add a few missing item classes. (#106) 2018-12-04 19:30:25 +00:00
Ben Wallis
6fb0ec8084 Fixed EditableListBoxControl mouse wheel scrolling 2018-12-03 17:41:44 +00:00
Ben Wallis
a13dc44a7d Added comments 2018-12-03 16:31:19 +00:00
Ben Wallis
05b729edf8 Fixed ScrollViewer in ItemFilterBlockView handling mouse wheel events (#105) 2018-12-03 16:28:22 +00:00
Ben Wallis
876e98437e Shortened/fixed SummaryText for several block items 2018-12-02 21:51:19 +00:00
Ben Wallis
30e76e333c * Bumped version to 1.1.0-beta3
* Fixed Switch to Appearance/Regular Block Items text overlapping block item controls
* Added Enable/Disable toggle button to Appearance block items control
* Added horizontal scrollbar to block items view
* Moved Enable/Disable toggle button to separate user control(previously it was only visible when viewing Regular block items)
* Added DesignTimeItemFilterBlockViewModel
2018-12-02 21:36:01 +00:00
Glen M
f840fb69ad Throttle selections to improve Select All performance. (#104)
Throttle selections to improve Select All performance in ItemFilterScriptViewModel.
2018-12-02 16:30:50 +00:00
Ben Wallis
ae98c2d5de Bumped version to 1.1.0-beta2 2018-11-28 22:29:52 +00:00
65 changed files with 1735 additions and 902 deletions

View File

@@ -41,7 +41,7 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes
public override Color SummaryTextColor => Action == BlockAction.Show ? Colors.Black : Colors.White;
public override int SortOrder => 0;
public override BlockItemOrdering SortOrder => BlockItemOrdering.Action;
public void ToggleAction()
{

View File

@@ -2,6 +2,7 @@
using System.Runtime.CompilerServices;
using System.Windows.Media;
using Filtration.ObjectModel.Annotations;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemBaseTypes
{
@@ -16,7 +17,7 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes
public abstract string SummaryText { get; }
public abstract Color SummaryBackgroundColor { get; }
public abstract Color SummaryTextColor { get; }
public abstract int SortOrder { get; }
public abstract BlockItemOrdering SortOrder { get; }
public string Comment { get; set; }
public bool IsDirty

View File

@@ -27,7 +27,7 @@
}
public override string OutputText => PrefixText + " " + BooleanValue;
public override string SummaryText => PrefixText + " = " + BooleanValue;
public override string SummaryText => DisplayHeading + " = " + BooleanValue;
public override int MaximumAllowed => 1;
public void ToggleValue()

View File

@@ -1,4 +1,5 @@
using System.Windows.Media;
using Filtration.ObjectModel.Enums;
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
@@ -17,6 +18,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 => 23;
public override BlockItemOrdering SortOrder => BlockItemOrdering.SetBackgroundColor;
}
}

View File

@@ -1,6 +1,7 @@
using System.Linq;
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -16,23 +17,23 @@ namespace Filtration.ObjectModel.BlockItemTypes
{
if (Items.Count > 0 && Items.Count < 4)
{
return "Item Base Types: " +
return "Base Types: " +
Items.Aggregate(string.Empty, (current, i) => current + i + ", ").TrimEnd(' ').TrimEnd(',');
}
if (Items.Count >= 4)
{
var remaining = Items.Count - 3;
return "Item Base Types: " + Items.Take(3)
return "Base Types: " + Items.Take(3)
.Aggregate(string.Empty, (current, i) => current + i + ", ")
.TrimEnd(' ')
.TrimEnd(',') + " (+" + remaining + " more)";
}
return "Item Base Types: (none)";
return "Base Types: (none)";
}
}
public override Color SummaryBackgroundColor => Colors.MediumTurquoise;
public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 20;
public override BlockItemOrdering SortOrder => BlockItemOrdering.BaseType;
}
}

View File

@@ -1,5 +1,6 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -17,6 +18,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 => 24;
public override BlockItemOrdering SortOrder => BlockItemOrdering.SetBorderColor;
}
}

View File

@@ -1,6 +1,7 @@
using System.Linq;
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -16,23 +17,23 @@ namespace Filtration.ObjectModel.BlockItemTypes
{
if (Items.Count > 0 && Items.Count < 4)
{
return "Item Classes: " +
return "Classes: " +
Items.Aggregate(string.Empty, (current, i) => current + i + ", ").TrimEnd(' ').TrimEnd(',');
}
if (Items.Count >= 4)
{
var remaining = Items.Count - 3;
return "Item Classes: " + Items.Take(3)
return "Classes: " + Items.Take(3)
.Aggregate(string.Empty, (current, i) => current + i + ", ")
.TrimEnd(' ')
.TrimEnd(',') + " (+" + remaining + " more)";
}
return "Item Classes: (none)";
return "Classes: (none)";
}
}
public override Color SummaryBackgroundColor => Colors.MediumSeaGreen;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 19;
public override BlockItemOrdering SortOrder => BlockItemOrdering.Class;
}
}

View File

@@ -1,5 +1,6 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -17,7 +18,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string DisplayHeading => "Corrupted";
public override Color SummaryBackgroundColor => Colors.DarkRed;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 5;
public override BlockItemOrdering SortOrder => BlockItemOrdering.Corrupted;
}
}

View File

@@ -1,4 +1,5 @@
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -16,6 +17,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 => 31;
public override BlockItemOrdering SortOrder => BlockItemOrdering.CustomAlertSound;
}
}

View File

@@ -1,5 +1,6 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -17,7 +18,6 @@ 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 => 28;
public override BlockItemOrdering SortOrder => BlockItemOrdering.DisableDropSound;
}
}

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 => 15;
public override BlockItemOrdering SortOrder => BlockItemOrdering.DropLevel;
public override int Minimum => 0;
public override int Maximum => 100;
}

View File

@@ -1,5 +1,6 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -17,7 +18,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string DisplayHeading => "Elder Item";
public override Color SummaryBackgroundColor => Colors.DarkGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 6;
public override BlockItemOrdering SortOrder => BlockItemOrdering.ElderItem;
}
}

View File

@@ -1,5 +1,6 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -17,7 +18,6 @@ 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 => 10;
public override BlockItemOrdering SortOrder => BlockItemOrdering.ElderMap;
}
}

View File

@@ -1,4 +1,5 @@
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -16,7 +17,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 => 25;
public override BlockItemOrdering SortOrder => BlockItemOrdering.SetFontSize;
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 => 16;
public override BlockItemOrdering SortOrder => BlockItemOrdering.GemLevel;
public override int Minimum => 0;
public override int Maximum => 21;
}

View File

@@ -1,6 +1,7 @@
using System.Linq;
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -16,23 +17,23 @@ namespace Filtration.ObjectModel.BlockItemTypes
{
if (Items.Count > 0 && Items.Count < 4)
{
return "Item Explicit Mods: " +
return "Explicit Mods: " +
Items.Aggregate(string.Empty, (current, i) => current + i + ", ").TrimEnd(' ').TrimEnd(',');
}
if (Items.Count >= 4)
{
var remaining = Items.Count - 3;
return "Item Explicit Mods: " + Items.Take(3)
return "Explicit Mods: " + Items.Take(3)
.Aggregate(string.Empty, (current, i) => current + i + ", ")
.TrimEnd(' ')
.TrimEnd(',') + " (+" + remaining + " more)";
}
return "Item Explicit Mods: (none)";
return "Explicit Mods: (none)";
}
}
public override Color SummaryBackgroundColor => Colors.MidnightBlue;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 21;
public override BlockItemOrdering SortOrder => BlockItemOrdering.HasExplicitMod;
}
}

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 => 12;
public override BlockItemOrdering SortOrder => BlockItemOrdering.Height;
public override int Minimum => 0;
public override int Maximum => 6;
}

View File

@@ -1,5 +1,6 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -17,7 +18,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string DisplayHeading => "Identified";
public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 4;
public override BlockItemOrdering SortOrder => BlockItemOrdering.Identified;
}
}

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 => 14;
public override BlockItemOrdering SortOrder => BlockItemOrdering.ItemLevel;
public override int Minimum => 0;
public override int Maximum => 100;
}

View File

@@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Linked Sockets " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.Gold;
public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 1;
public override BlockItemOrdering SortOrder => BlockItemOrdering.LinkedSockets;
public override int Minimum => 0;
public override int Maximum => 6;
}

View File

@@ -19,6 +19,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "MinimapIcon";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Minimap Icon";
public override int SortOrder => 29;
public override BlockItemOrdering SortOrder => BlockItemOrdering.MinimapIcon;
}
}

View File

@@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
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 BlockItemOrdering SortOrder => BlockItemOrdering.MapTier;
public override int Minimum => 1;
public override int Maximum => 16;
}

View File

@@ -18,6 +18,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "PlayEffect";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Play Effect";
public override int SortOrder => 30;
public override BlockItemOrdering SortOrder => BlockItemOrdering.PlayEffect;
}
}

View File

@@ -1,4 +1,5 @@
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -17,6 +18,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 => 27;
public override BlockItemOrdering SortOrder => BlockItemOrdering.PlayAlertSoundPositional;
}
}

View File

@@ -0,0 +1,39 @@
using System.Linq;
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class ProphecyBlockItem : StringListBlockItem
{
public override string PrefixText => "Prophecy";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Prophecy";
public override string SummaryText
{
get
{
if (Items.Count > 0 && Items.Count < 4)
{
return "Prophecies: " +
Items.Aggregate(string.Empty, (current, i) => current + i + ", ").TrimEnd(' ').TrimEnd(',');
}
if (Items.Count >= 4)
{
var remaining = Items.Count - 3;
return "Prophecies: " + Items.Take(3)
.Aggregate(string.Empty, (current, i) => current + i + ", ")
.TrimEnd(' ')
.TrimEnd(',') + " (+" + remaining + " more)";
}
return "Prophecies: (none)";
}
}
public override Color SummaryBackgroundColor => Colors.DarkMagenta;
public override Color SummaryTextColor => Colors.White;
public override BlockItemOrdering SortOrder => BlockItemOrdering.Prophecy;
}
}

View File

@@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Quality " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkOrange;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 3;
public override BlockItemOrdering SortOrder => BlockItemOrdering.Quality;
public override int Minimum => 0;
public override int Maximum => 30;
}

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 => 18;
public override BlockItemOrdering SortOrder => BlockItemOrdering.Rarity;
public override int Minimum => 0;
public override int Maximum => (int)ItemRarity.Unique;
}

View File

@@ -1,5 +1,6 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -17,7 +18,6 @@ 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 => 9;
public override BlockItemOrdering SortOrder => BlockItemOrdering.ShapedMap;
}
}

View File

@@ -1,5 +1,6 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -17,7 +18,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string DisplayHeading => "Shaper Item";
public override Color SummaryBackgroundColor => Colors.DimGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 7;
public override BlockItemOrdering SortOrder => BlockItemOrdering.ShaperItem;
}
}

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 => 11;
public override BlockItemOrdering SortOrder => BlockItemOrdering.SocketGroup;
private SocketColor StringToSocketColor(char socketColorString)
{

View File

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

View File

@@ -1,4 +1,5 @@
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -17,6 +18,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 => 26;
public override BlockItemOrdering SortOrder => BlockItemOrdering.PlayAlertSound;
}
}

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 => 17;
public override BlockItemOrdering SortOrder => BlockItemOrdering.StackSize;
public override int Minimum => 0;
public override int Maximum => 1000;
}

View File

@@ -18,6 +18,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 => 22;
public override BlockItemOrdering SortOrder => BlockItemOrdering.SetTextColor;
}
}

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 => 13;
public override BlockItemOrdering SortOrder => BlockItemOrdering.Width;
public override int Minimum => 0;
public override int Maximum => 2;
}

View File

@@ -0,0 +1,41 @@
using System.ComponentModel;
namespace Filtration.ObjectModel.Enums
{
public enum BlockItemOrdering
{
Action,
LinkedSockets,
Sockets,
Quality,
Identified,
Corrupted,
ElderItem,
ShaperItem,
MapTier,
ShapedMap,
ElderMap,
SocketGroup,
Height,
Width,
ItemLevel,
DropLevel,
GemLevel,
StackSize,
Rarity,
Class,
BaseType,
Prophecy,
HasExplicitMod,
SetTextColor,
SetBackgroundColor,
SetBorderColor,
SetFontSize,
PlayAlertSound,
PlayAlertSoundPositional,
DisableDropSound,
MinimapIcon,
PlayEffect,
CustomAlertSound
}
}

View File

@@ -8,6 +8,7 @@
Rarity,
Class,
BaseType,
Prophecy,
Sockets,
LinkedSockets,
SocketGroup,

View File

@@ -92,6 +92,7 @@
<Compile Include="BlockItemTypes\GemLevelBlockItem.cs" />
<Compile Include="BlockItemTypes\HasExplicitModBlockItem.cs" />
<Compile Include="BlockItemTypes\MapIconBlockItem.cs" />
<Compile Include="BlockItemTypes\ProphecyBlockItem.cs" />
<Compile Include="BlockItemTypes\ShapedMapBlockItem.cs" />
<Compile Include="BlockItemTypes\ShaperItemBlockItem.cs" />
<Compile Include="BlockItemTypes\ElderItemBlockItem.cs" />
@@ -123,6 +124,7 @@
<Compile Include="Commands\ItemFilterScript\AddBlockCommand.cs" />
<Compile Include="Commands\IUndoableCommand.cs" />
<Compile Include="Enums\BlockAction.cs" />
<Compile Include="Enums\BlockItemOrdering.cs" />
<Compile Include="Enums\BlockItemType.cs" />
<Compile Include="Enums\EffectColor.cs" />
<Compile Include="Enums\FilterPredicateOperator.cs" />

View File

@@ -1,5 +1,6 @@
using System.ComponentModel;
using System.Windows.Media;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel
{
@@ -12,7 +13,7 @@ namespace Filtration.ObjectModel
Color SummaryBackgroundColor { get; }
Color SummaryTextColor { get; }
int MaximumAllowed { get; }
int SortOrder { get; }
BlockItemOrdering SortOrder { get; }
bool IsDirty { get; }
string Comment { get; set; }
}

View File

@@ -567,6 +567,25 @@ namespace Filtration.Parser.Tests.Services
Assert.Contains("Test BaseType 2", blockItem.Items);
}
[Test]
public void TranslateStringToItemFilterBlock_Prophecy_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
@" Prophecy ""Test Prophecy 1"" ""TestOneWordProphecyInQuotes"" TestOneWordProphecyNotInQuotes ""Test Prophecy 2""";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ProphecyBlockItem));
var blockItem = result.BlockItems.OfType<ProphecyBlockItem>().First();
Assert.Contains("Test Prophecy 1", blockItem.Items);
Assert.Contains("TestOneWordProphecyInQuotes", blockItem.Items);
Assert.Contains("TestOneWordProphecyNotInQuotes", blockItem.Items);
Assert.Contains("Test Prophecy 2", blockItem.Items);
}
[Test]
public void TranslateStringToItemFilterBlock_HasExplicitMod_ReturnsCorrectObject()
{
@@ -934,6 +953,7 @@ namespace Filtration.Parser.Tests.Services
" ElderMap False" + Environment.NewLine +
@" Class ""My Item Class"" AnotherClass ""AndAnotherClass""" + Environment.NewLine +
@" BaseType MyBaseType ""Another BaseType""" + Environment.NewLine +
@" Prophecy MyProphecy ""Another Prophecy""" + Environment.NewLine +
@" HasExplicitMod MyMod ""Another Mod""" + Environment.NewLine +
" JunkLine Let's ignore this one!" + Environment.NewLine +
" #Quality Commented out quality line" + Environment.NewLine +
@@ -1008,6 +1028,11 @@ namespace Filtration.Parser.Tests.Services
Assert.Contains("MyBaseType", baseTypeblockItem.Items);
Assert.Contains("Another BaseType", baseTypeblockItem.Items);
var prophecyblockItem = result.BlockItems.OfType<ProphecyBlockItem>().First();
Assert.AreEqual(2, prophecyblockItem.Items.Count);
Assert.Contains("MyProphecy", prophecyblockItem.Items);
Assert.Contains("Another Prophecy", prophecyblockItem.Items);
var hasExplicitModBlockItem = result.BlockItems.OfType<HasExplicitModBlockItem>().First();
Assert.AreEqual(2, hasExplicitModBlockItem.Items.Count);
Assert.Contains("MyMod", hasExplicitModBlockItem.Items);
@@ -1707,6 +1732,26 @@ namespace Filtration.Parser.Tests.Services
Assert.AreEqual(expectedResult, result);
}
[Test]
public void TranslateItemFilterBlockToString_Prophecies_ReturnsCorrectString()
{
// Arrange
var expectedResult = "Show" + Environment.NewLine +
" Prophecy \"Test Prophecy\" \"Another Prophecy\" \"Yet Another Prophecy\"";
var prophecyBlockItem = new ProphecyBlockItem();
prophecyBlockItem.Items.Add("Test Prophecy");
prophecyBlockItem.Items.Add("Another Prophecy");
prophecyBlockItem.Items.Add("Yet Another Prophecy");
_testUtility.TestBlock.BlockItems.Add(prophecyBlockItem);
// Act
var result = _testUtility.Translator.TranslateItemFilterBlockToString(_testUtility.TestBlock);
// Assert
Assert.AreEqual(expectedResult, result);
}
[Test]
public void TranslateItemFilterBlockToString_HasExplicitMod_ReturnsCorrectString()
{
@@ -2013,6 +2058,7 @@ namespace Filtration.Parser.Tests.Services
" Rarity = Unique" + Environment.NewLine +
" Class \"Body Armour\" \"Gloves\" \"Belt\" \"Two Hand Axes\"" + Environment.NewLine +
" BaseType \"Greater Life Flask\" \"Simple Robe\" \"Full Wyrmscale\"" + Environment.NewLine +
" Prophecy \"The Cursed Choir\" \"A Valuable Combination\" \"The Beautiful Guide\"" + Environment.NewLine +
" HasExplicitMod \"Guatelitzi's\" \"of Tacati\" \"Tyrannical\"" + Environment.NewLine +
" SetTextColor 255 89 0 56" + Environment.NewLine +
" SetBackgroundColor 0 0 0" + Environment.NewLine +
@@ -2046,6 +2092,11 @@ namespace Filtration.Parser.Tests.Services
baseTypeItemblockItem.Items.Add("Simple Robe");
baseTypeItemblockItem.Items.Add("Full Wyrmscale");
_testUtility.TestBlock.BlockItems.Add(baseTypeItemblockItem);
var prophecyItemblockItem = new ProphecyBlockItem();
prophecyItemblockItem.Items.Add("The Cursed Choir");
prophecyItemblockItem.Items.Add("A Valuable Combination");
prophecyItemblockItem.Items.Add("The Beautiful Guide");
_testUtility.TestBlock.BlockItems.Add(prophecyItemblockItem);
var hasExplicitModBlockItem = new HasExplicitModBlockItem();
hasExplicitModBlockItem.Items.Add("Guatelitzi's");
hasExplicitModBlockItem.Items.Add("of Tacati");

View File

@@ -159,6 +159,11 @@ namespace Filtration.Parser.Services
AddStringListItemToBlockItems<BaseTypeBlockItem>(block, trimmedLine);
break;
}
case "Prophecy":
{
AddStringListItemToBlockItems<ProphecyBlockItem>(block, trimmedLine);
break;
}
case "Corrupted":
{
AddBooleanItemToBlockItems<CorruptedBlockItem>(block, trimmedLine);

View File

@@ -76,6 +76,9 @@
<Reference Include="DeltaCompressionDotNet.PatchApi, Version=1.1.0.0, Culture=neutral, PublicKeyToken=3e8888ee913ed789, processorArchitecture=MSIL">
<HintPath>..\packages\DeltaCompressionDotNet.1.1.0\lib\net20\DeltaCompressionDotNet.PatchApi.dll</HintPath>
</Reference>
<Reference Include="DynamicData, Version=6.7.0.2529, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\DynamicData.6.7.0.2529\lib\net46\DynamicData.dll</HintPath>
</Reference>
<Reference Include="Fluent, Version=6.1.0.326, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Fluent.Ribbon.6.1.0.326\lib\net45\Fluent.dll</HintPath>
</Reference>
@@ -130,6 +133,9 @@
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.Reactive, Version=4.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
<HintPath>..\packages\System.Reactive.4.0.0\lib\net46\System.Reactive.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Remoting" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
@@ -138,6 +144,7 @@
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Windows" />
<Reference Include="System.Windows.Controls.Input.Toolkit, Version=3.5.40128.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\WPFToolkit.3.5.50211.1\lib\System.Windows.Controls.Input.Toolkit.dll</HintPath>
@@ -231,12 +238,17 @@
<Compile Include="UserControls\EditableListBoxControl.xaml.cs">
<DependentUpon>EditableListBoxControl.xaml</DependentUpon>
</Compile>
<Compile Include="UserControls\EnableDisableToggleButton.xaml.cs">
<DependentUpon>EnableDisableToggleButton.xaml</DependentUpon>
</Compile>
<Compile Include="UserControls\ItemPreviewControl.xaml.cs">
<DependentUpon>ItemPreviewControl.xaml</DependentUpon>
</Compile>
<Compile Include="UserControls\ThemeComponentSelectionControl.xaml.cs">
<DependentUpon>ThemeComponentSelectionControl.xaml</DependentUpon>
</Compile>
<Compile Include="Utility\VisualTreeUtility.cs" />
<Compile Include="ViewModels\DesignTime\DesignTimeItemFilterBlockViewModel.cs" />
<Compile Include="ViewModels\DesignTime\DesignTimeSettingsPageViewModel.cs" />
<Compile Include="Views\AttachedProperties\SelectedItemsAttachedProperty.cs" />
<Compile Include="Utility\RoutedCommandHandler.cs" />
@@ -275,6 +287,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="UserControls\EnableDisableToggleButton.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="UserControls\ThemeComponentSelectionControl.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@@ -446,6 +462,7 @@
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Resources\Prophecies.txt" />
<EmbeddedResource Include="Resources\ItemMods.txt" />
<Resource Include="Resources\loading_spinner.gif" />
<EmbeddedResource Include="Properties\Resources.resx">

View File

@@ -9,9 +9,14 @@
<description>A Path of Exile loot filter script editor</description>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<copyright>Copyright 2018</copyright>
<releaseNotes>* All open filter scripts are now remembered on exit and reopened when the application is started rather than just the last opened one (#95)
<releaseNotes>* Added support for new Prophecies block item type
* All open filter scripts are now remembered on exit and reopened when the application is started rather than just the last opened one (#95)
* Filter sections are once again now expanded by default when scripts are opened, unless the new "Auto-expand all sections when opening scripts" setting is disabled
* A new Clear Styles button has been added which removes all styles from the selected block (#96)
* The Enable/Disable Block toggle button is now visible on both the Regular Block Items and Appearance Block Items views
* When there are too many block items to fit horizontally in a block a horizontal scrollbar will now appear
* Fixed the application freezing for a long period of time when Ctrl+A (Select All) is performed
* Fixed the Switch to Appearance/Regular Block Items text overlapping block items
* Fixed theme saving (blank theme files were being saved) (#83)
* Fixed checkboxes in Block Group Browser (#97)
* Fixed the Select Path of Exile data directory dialog appearing after every upgrade (#94)

View File

@@ -11,7 +11,7 @@ using System.Runtime.CompilerServices;
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.1.0")]
[assembly: AssemblyInformationalVersion("1.1.0-beta1")]
[assembly: AssemblyInformationalVersion("1.1.0-beta4")]
[assembly: InternalsVisibleTo("Filtration.Tests")]
[assembly: InternalsVisibleTo("Filtration.ItemFilterPreview.Tests")]

View File

@@ -225,19 +225,21 @@ namespace Filtration.Properties {
}
/// <summary>
/// Looks up a localized string similar to A Mother&apos;s Parting Gift
/// Looks up a localized string similar to A Dab of Ink
///A Mother&apos;s Parting Gift
///Abandoned Wealth
///Aberrant Fossil
///Abyssal Axe
///Abyssal Cry
///Abyssal Sceptre
///Academy Map
///Acid Lakes Map
///Acid Caverns Map
///Added Chaos Damage Support
///Added Cold Damage Support
///Added Fire Damage Support
///Added Lightning Damage Support
///Additional Accuracy Support
///Advanced Traps Support
///Aetheric Fossil
///Agate Amulet
///Albino Rhoa Feather
@@ -251,10 +253,7 @@ namespace Filtration.Properties {
///Amber Amulet
///Ambush Boots
///Ambush Leaguestone
///Ambush Mitts
///Ambusher
///Amethyst Flask
///Amethyst [rest of string was truncated]&quot;;.
///Ambush [rest of string was truncated]&quot;;.
/// </summary>
internal static string ItemBaseTypes {
get {
@@ -266,7 +265,7 @@ namespace Filtration.Properties {
/// Looks up a localized string similar to Abyss Jewel
///Active Skill Gems
///Amulets
///Axe
///Axes
///Belts
///Body Armours
///Boots
@@ -288,12 +287,13 @@ namespace Filtration.Properties {
///Labyrinth Map Item
///Labyrinth Trinket
///Large Relics
///Leaguestone
///Leaguestones
///Life Flasks
///Mace
///Maces
///Mana Flasks
///Map Fragments
///Maps
///Medium Relics
///Misc Map Items
///One Hand Axes
///One Hand Maces
@@ -302,14 +302,12 @@ namespace Filtration.Properties {
///Piece
///Quest Items
///Quivers
///Relics
///Rings
///Sceptres
///Shields
///Stackable Currency
///Staves
///Support Skill Gems
///Sword
///T [rest of string was truncated]&quot;;.
///Small Relics
///Stackable Curre [rest of string was truncated]&quot;;.
/// </summary>
internal static string ItemClasses {
get {
@@ -382,6 +380,15 @@ namespace Filtration.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to A Gracious Master.
/// </summary>
internal static string Prophecies {
get {
return ResourceManager.GetString("Prophecies", resourceCulture);
}
}
/// <summary>
/// Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream.
/// </summary>

View File

@@ -211,4 +211,7 @@
<data name="ItemMods" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ItemMods.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="Prophecies" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Prophecies.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
</root>

View File

@@ -1,11 +1,12 @@
A Mother's Parting Gift
A Dab of Ink
A Mother's Parting Gift
Abandoned Wealth
Aberrant Fossil
Abyssal Axe
Abyssal Cry
Abyssal Sceptre
Academy Map
Acid Lakes Map
Acid Caverns Map
Added Chaos Damage Support
Added Cold Damage Support
Added Fire Damage Support
@@ -71,6 +72,7 @@ Arctic Breath
Arena Map
Arena Plate
Arid Lake Map
Armageddon Brand
Arming Axe
Armourer's Scrap
Armoury Map
@@ -168,6 +170,7 @@ Bone Crypt Map
Bone Helmet
Bone Offering
Bone Spirit Shield
Bonechill Support
Bonespire Talisman
Boon of the First Ones
Boot Blade
@@ -176,6 +179,7 @@ Bottled Storm
Bound Fossil
Boundless Realms
Bowyer's Dream
Brand Recall
Branded Kite Shield
Brass Maul
Brass Spirit Shield
@@ -352,6 +356,7 @@ Courthouse Map
Courtyard Map
Coves Map
Coveted Possession
Crater Map
Cremation
Crescent Staff
Crested Tower Shield
@@ -461,6 +466,7 @@ Dragonscale Boots
Dragonscale Doublet
Dragonscale Gauntlets
Dragoon Sword
Dread Banner
Dread Maul
Dream Mace
Driftwood Club
@@ -636,6 +642,7 @@ Full Plate
Full Ringmail
Full Scale Armour
Full Wyrmscale
Fungal Hollow Map
Gardens Map
Gavel
Gemcutter's Prism
@@ -650,13 +657,26 @@ Ghetto Map
Giant Life Flask
Giant Mana Flask
Gift of the Gemling Queen
Gilded Ambush Scarab
Gilded Axe
Gilded Bestiary Scarab
Gilded Breach Scarab
Gilded Buckler
Gilded Cartography Scarab
Gilded Divination Scarab
Gilded Elder Scarab
Gilded Fossil
Gilded Harbinger Scarab
Gilded Perandus Scarab
Gilded Reliquary Scarab
Gilded Sallet
Gilded Shaper Scarab
Gilded Sulphite Scarab
Gilded Torment Scarab
Girded Tower Shield
Glacial Cascade
Glacial Hammer
Glacier Map
Gladiator Helmet
Gladiator Plate
Gladius
@@ -689,7 +709,6 @@ Golden Plate
Golden Wreath
Goliath Gauntlets
Goliath Greaves
Gorge Map
Gouger
Grace
Graceful Sword
@@ -859,6 +878,7 @@ Lacquered Helmet
Lair Map
Lair of the Hydra Map
Laminated Kite Shield
Lancing Steel
Lantador's Lost Love
Lapis Amulet
Large Hybrid Flask
@@ -867,7 +887,7 @@ Large Mana Flask
Last Hope
Lathi
Latticed Ringmail
Lava Chamber Map
Lava Chambers Map
Lava Lake Map
Layered Kite Shield
Lead Sceptre
@@ -888,9 +908,9 @@ Lesser Poison Support
Leyline Map
Life Gain on Hit Support
Life Leech Support
Light and Truth
Light Brigandine
Light Quiver
Light and Truth
Lighthouse Map
Lightning Arrow
Lightning Penetration Support
@@ -975,14 +995,14 @@ Military Staff
Mind Cage
Minefield Support
Mineral Pools Map
Minion and Totem Elemental Resistance Support
Minion Damage Support
Minion Life Support
Minion Speed Support
Minion and Totem Elemental Resistance Support
Mirage Archer Support
Mirror Arrow
Mirror Shard
Mirror of Kalandra
Mirror Shard
Mirrored Spiked Shield
Mitts
Molten Shell
@@ -1000,6 +1020,7 @@ Mortal Ignorance
Mortal Rage
Mosaic Kite Shield
Mud Geyser Map
Multiple Totems Support
Multiple Traps Support
Multistrike Support
Murder Boots
@@ -1110,7 +1131,19 @@ Poignard
Point Blank Support
Poison Support
Poleaxe
Polished Ambush Scarab
Polished Bestiary Scarab
Polished Breach Scarab
Polished Cartography Scarab
Polished Divination Scarab
Polished Elder Scarab
Polished Harbinger Scarab
Polished Perandus Scarab
Polished Reliquary Scarab
Polished Shaper Scarab
Polished Spiked Shield
Polished Sulphite Scarab
Polished Torment Scarab
Port Map
Portal
Portal Scroll
@@ -1132,6 +1165,7 @@ Primeval Rapier
Primitive Alchemical Resonator
Primitive Chaotic Resonator
Primitive Staff
Primordial Blocks Map
Primordial Pool Map
Primordial Staff
Prismatic Fossil
@@ -1160,9 +1194,9 @@ Quartz Wand
Quicksilver Flask
Quilted Jacket
Racecourse Map
Rain Tempter
Rain of Arrows
Rain of Chaos
Rain Tempter
Raise Spectre
Raise Zombie
Rallying Cry
@@ -1226,10 +1260,22 @@ Ruby Flask
Ruby Ring
Rugged Quiver
Runic Hatchet
Rusted Ambush Scarab
Rusted Bestiary Scarab
Rusted Breach Scarab
Rusted Cartography Scarab
Rusted Coif
Rusted Divination Scarab
Rusted Elder Scarab
Rusted Harbinger Scarab
Rusted Hatchet
Rusted Perandus Scarab
Rusted Reliquary Scarab
Rusted Shaper Scarab
Rusted Spike
Rusted Sulphite Scarab
Rusted Sword
Rusted Torment Scarab
Rustic Sash
Ruthless Support
Sabre
@@ -1335,6 +1381,7 @@ Sharkskin Gloves
Sharkskin Tunic
Sharktooth Arrow Quiver
Sharktooth Claw
Shattering Steel
Shield Charge
Shipyard Map
Shock Nova
@@ -1445,7 +1492,6 @@ Splinter of Xoph
Splintered Tower Shield
Split Arrow
Splitnewt Talisman
Springs Map
Stacked Deck
Stag Sceptre
Static Strike
@@ -1467,6 +1513,7 @@ Stone Hammer
Stone of Passage
Storm Barrier Support
Storm Blade
Storm Brand
Storm Burst
Storm Call
Strand Map
@@ -1599,14 +1646,17 @@ The King's Blade
The King's Heart
The Last One Standing
The Lich
The Life Thief
The Lion
The Lord in Black
The Lover
The Lunaris Priestess
The Master
The Master Artisan
The Mayor
The Mercenary
The Metalsmith's Gift
The Nurse
The Oath
The Obscured
The Offering
@@ -1628,6 +1678,7 @@ The Risk
The Rite of Elements
The Road to Power
The Ruthless Ceinture
The Sacrifice
The Saint's Treasure
The Samurai's Eye
The Scarred Meadow
@@ -1711,7 +1762,6 @@ Torment Leaguestone
Tornado Shot
Tornado Wand
Torture Cage
Torture Chamber Map
Totemic Maul
Tower Key
Tower Map
@@ -1719,8 +1769,8 @@ Toxic Rain
Toxic Sewer Map
Tranquillity
Transmutation Shard
Trap Support
Trap and Mine Damage Support
Trap Support
Trapper Boots
Trapper Mitts
Trarthan Powder
@@ -1729,7 +1779,6 @@ Treasure Key
Tribal Circlet
Tribal Club
Tribal Maul
Tribunal Map
Tricorne
Trisula
Triumphant Lamellar
@@ -1815,16 +1864,16 @@ Vault Map
Velvet Gloves
Velvet Slippers
Vengeance
Vial Of Power
Vial of Awakening
Vial of Consequence
Vial of Dominance
Vial of Fate
Vial Of Power
Vial of Sacrifice
Vial of Summoning
Vial of Transcendence
Vial of the Ghost
Vial of the Ritual
Vial of Transcendence
Vicious Projectiles Support
Vigilant Strike
Vile Staff
@@ -1865,6 +1914,7 @@ Wailing Essence of Wrath
Wailing Essence of Zeal
Walnut Spirit Shield
War Axe
War Banner
War Buckler
War Hammer
War Plate
@@ -1902,6 +1952,7 @@ Widowsilk Robe
Wild Leather
Wild Strike
Wings of Vastiri
Winter Orb
Wither
Withering Touch Support
Wolf Pelt

View File

@@ -23,12 +23,13 @@ Labyrinth Item
Labyrinth Map Item
Labyrinth Trinket
Large Relics
Leaguestone
Leaguestones
Life Flasks
Maces
Mana Flasks
Map Fragments
Maps
Medium Relics
Misc Map Items
One Hand Axes
One Hand Maces
@@ -37,9 +38,11 @@ Pantheon Soul
Piece
Quest Items
Quivers
Relics
Rings
Sceptres
Shields
Small Relics
Stackable Currency
Staves
Support Skill Gems

View File

@@ -61,6 +61,7 @@ Carved
Caster's
Catalysed
Catalyzing
Catarina's Veiled
Caustic
Cauterising
Cautious
@@ -115,6 +116,7 @@ Duelist's
Eldritch
Electrocuting
Electromantic
Elreon's Veiled
Elephant's
Emanant
Emperor's
@@ -172,9 +174,12 @@ Glinting
Glittering
Glowing
Glyphic
Gravicius' Veiled
Gremlin's
Grounded
Guatelitzi's
Guff's Veiled
Haku's Veiled
Hailing
Hale
Halting
@@ -218,16 +223,19 @@ Instilled
Interpermeated
Interpolated
Ionising
It That Fled's Veiled
Jagged
Jinxing
Journeyman's
Judging
Korell's Veiled
Lacquered
Lamprey's
Lava Caller's
Layered
Leadership
Legend's
Leo's Veiled
Lethal
Lich's
Lively
@@ -306,6 +314,7 @@ Resonating
Resplendent
Rhino's
Ribbed
Rin's Veiled
Ripping
Robust
Rotund
@@ -384,6 +393,7 @@ Thundering
Thwarting
Titan's
Topotante's
Tora's Veiled
Trapping
Tul's
Turncoat's
@@ -399,8 +409,10 @@ Unwavering
Unworldly
Urchin's
Vaal
Vagan's Veiled
Vampire's
Vaporous
Veiled
Vicious
Victor's
Vigorous
@@ -410,6 +422,7 @@ Vivacious
Vivid
Volcanic
Volleying
Vorici's Veiled
Wailing
Warding
Warlock's
@@ -436,6 +449,7 @@ of Accuracy
of Adamantite Skin
of Adaption
of Adrenaline
of Aisling's Veil
of Amassment
of Anger
of Animation
@@ -459,6 +473,7 @@ of Bloodlines
of Burning
of Calamity
of Calm
of Cameria's Veil
of Celebration
of Champions
of Chilling
@@ -547,6 +562,7 @@ of Havoc
of Haze
of Heat
of Hemomancy
of Hillock's Veil
of Hindering
of Hoarding
of Hordes
@@ -563,6 +579,8 @@ of Intelligence
of Intercepting
of Ire
of Iron Skin
of Janus' Veil
of Jorgin's Veil
of Joy
of Legerdemain
of Light
@@ -621,6 +639,7 @@ of Resistance
of Restoration
of Retaliation
of Righteousness
of Riker's Veil
of Rime
of Ruin
of Runes
@@ -774,6 +793,7 @@ of the Titan
of the Troll
of the Underground
of the Universe
of the Veil
of the Virtuoso
of the Volcano
of the Wall

View File

@@ -0,0 +1,241 @@
A Call into the Void
A Dishonourable Death
A Firm Foothold
A Forest of False Idols
A Gracious Master
A Master Seeks Help
A Prodigious Hand
A Regal Death
A Rift in Time
A Valuable Combination
A Vision of Ice and Fire
A Whispered Prayer
Abnormal Effulgence
Against the Tide
Agony at Dusk
An Unseen Peril
Anarchy's End
Anarchy's End I
Anarchy's End II
Anarchy's End III
Anarchy's End IV
Ancient Doom
Baptism by Death
Battle Hardened
Beyond Sight
Beyond Sight I
Beyond Sight II
Beyond Sight III
Beyond Sight IV
Black Devotion
Blind Faith
Blinding Light
Blood in the Eyes
Blood of the Betrayed
Bountiful Traps
Burning Dread
Cleanser of Sins
Cold Blooded Fury
Cold Greed
Crimson Hues
Crushing Squall
Custodians of Silence
Dance of Steel
Dark Instincts
Darktongue's Shriek
Day of Sacrifice
Day of Sacrifice I
Day of Sacrifice II
Day of Sacrifice III
Day of Sacrifice IV
Deadly Rivalry
Deadly Rivalry I
Deadly Rivalry II
Deadly Rivalry III
Deadly Rivalry IV
Deadly Rivalry V
Deadly Twins
Defiled in the Sceptre
Dying Cry
Echoes of Witchcraft
End of the Light
Ending the Torment
Erased from Memory
Erasmus' Gift
Faith Exhumed
Fallow At Last
Fated Connections
Fear's Wide Reach
Fire and Brimstone
Fire and Ice
Fire from the Sky
Fire, Wood and Stone
Flesh of the Beast
Forceful Exorcism
From Death Springs Life
From The Void
Gilded Within
Golden Touch
Graceful Flames
Greed's Folly
Heart of the Fire
Heavy Blows
Hidden Reinforcements
Hidden Vaal Pathways
Holding the Bridge
Hunter's Lesson
Ice from Above
In the Grasp of Corruption
Kalandra's Craft
Last of the Wildmen
Lasting Impressions
Lightning Falls
Living Fires
Lost in the Pages
Monstrous Treasure
Mouth of Horrors
Mysterious Invaders
Nature's Resilience
Nemesis of Greed
Notched Flesh
Overflowing Riches
Path of Betrayal
Plague of Frogs
Plague of Rats
Pleasure and Pain
Pools of Wealth
Possessed Foe
Power Magnified
Rebirth
Reforged Bonds
Resistant to Change
Risen Blood
Roth's Legacy
Severed Limbs
Smothering Tendrils
Soil, Worms and Blood
Song of the Sekhema
Storm on the Horizon
Storm on the Reef
Strong as a Bull
Sun's Punishment
Thaumaturgical History
Thaumaturgical History I
Thaumaturgical History II
Thaumaturgical History III
Thaumaturgical History IV
The Alchemist
The Ambitious Bandit
The Ambitious Bandit I
The Ambitious Bandit II
The Ambitious Bandit III
The Apex Predator
The Beautiful Guide
The Beginning and the End
The Bishop's Legacy
The Bloody Flowers Redux
The Bowstring's Music
The Brothers of Necromancy
The Brutal Enforcer
The Child of Lunaris
The Corrupt
The Cursed Choir
The Dreaded Rhoa
The Dream Trial
The Dreamer's Dream
The Eagle's Cry
The Fall of an Empire
The Feral Lord
The Feral Lord I
The Feral Lord II
The Feral Lord III
The Feral Lord IV
The Feral Lord V
The Flayed Man
The Flow of Energy
The Forgotten Garrison
The Forgotten Soldiers
The Fortune Teller's Collection
The Four Feral Exiles
The God of Misfortune
The Great Leader of the North
The Great Mind of the North
The Hardened Armour
The Hollow Pledge
The Hungering Swarm
The Invader
The Jeweller's Touch
The Karui Rebellion
The King and the Brambles
The King's Path
The Lady in Black
The Last Watch
The Lost Maps
The Lost Undying
The Malevolent Witch
The Misunderstood Queen
The Mysterious Gift
The Nest
The Nightmare Awakens
The Petrified
The Plaguemaw
The Plaguemaw I
The Plaguemaw II
The Plaguemaw III
The Plaguemaw IV
The Plaguemaw V
The Prison Guard
The Prison Key
The Queen's Sacrifice
The Queen's Vaults
The Scout
The Servant's Heart
The Sharpened Blade
The Silverwood
The Singular Spirit
The Sinner's Stone
The Snuffed Flame
The Soulless Beast
The Stockkeeper
The Storm Spire
The Sword King's Passion
The Trembling Earth
The Twins
The Unbreathing Queen
The Unbreathing Queen I
The Unbreathing Queen II
The Unbreathing Queen III
The Unbreathing Queen IV
The Unbreathing Queen V
The Undead Brutes
The Undead Storm
The Vanguard
The Walking Mountain
The Ward's Ward
The Warmongers
The Warmongers I
The Warmongers II
The Warmongers III
The Warmongers IV
The Watcher's Watcher
The Wealthy Exile
Touched by the Wind
Trapped in the Tower
Trash to Treasure
Twice Enchanted
Unbearable Whispers
Unbearable Whispers I
Unbearable Whispers II
Unbearable Whispers III
Unbearable Whispers IV
Unbearable Whispers V
Undead Uprising
Unnatural Energy
Vaal Invasion
Vaal Winds
Visions of the Drowned
Vital Transformation
Waiting in Ambush
Weeping Death
Wind and Thunder
Winter's Mournful Melodies

View File

@@ -11,6 +11,7 @@ namespace Filtration.Services
IEnumerable<string> ItemBaseTypes { get; }
IEnumerable<string> ItemClasses { get; }
IEnumerable<string> ItemMods { get; }
IEnumerable<string> Prophecies { get; }
}
internal class StaticDataService : IStaticDataService
@@ -26,11 +27,14 @@ namespace Filtration.Services
public IEnumerable<string> ItemMods { get; private set; }
public IEnumerable<string> Prophecies { get; private set; }
private void PopulateStaticData()
{
ItemBaseTypes = new LineReader(() => new StringReader(Resources.ItemBaseTypes)).ToList();
ItemClasses = new LineReader(() => new StringReader(Resources.ItemClasses)).ToList();
ItemMods = new LineReader(() => new StringReader(Resources.ItemMods)).ToList();
Prophecies = new LineReader(() => new StringReader(Resources.Prophecies)).ToList();
}
}
}

View File

@@ -76,6 +76,11 @@
<userControls:EditableListBoxControl Margin="5,5,5,5" ItemsSource="{Binding Items}" AutoCompleteItemsSource="{Binding ElementName=TopLevelGrid, Path=DataContext.AutoCompleteItemBaseTypes}" />
</DataTemplate>
<!-- Prophecy Template -->
<DataTemplate DataType="{x:Type blockItemTypes:ProphecyBlockItem}">
<userControls:EditableListBoxControl Margin="5,5,5,5" ItemsSource="{Binding Items}" AutoCompleteItemsSource="{Binding ElementName=TopLevelGrid, Path=DataContext.AutoCompleteProphecies}" />
</DataTemplate>
<!-- Explicit Mods Template -->
<DataTemplate DataType="{x:Type blockItemTypes:HasExplicitModBlockItem}">
<userControls:EditableListBoxControl Margin="5,5,5,5" ItemsSource="{Binding Items}" AutoCompleteItemsSource="{Binding ElementName=TopLevelGrid, Path=DataContext.AutocompleteItemMods}" />

View File

@@ -0,0 +1,30 @@
<UserControl x:Class="Filtration.UserControls.EnableDisableToggleButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<ToggleButton Style="{StaticResource ChromelessToggleButton}"
IsChecked="{Binding BlockEnabled}"
Margin="0,0,5,0"
ToolTip="Enable/Disable Block"
Cursor="Hand"
Width="25"
Height="25">
<Image RenderOptions.BitmapScalingMode="HighQuality">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding BlockEnabled}" Value="true">
<Setter Property="Source" Value="/Filtration;component/Resources/Icons/standby_enabled_icon.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding BlockEnabled}" Value="false">
<Setter Property="Source" Value="/Filtration;component/Resources/Icons/standby_disabled_icon.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</ToggleButton>
</UserControl>

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Filtration.UserControls
{
/// <summary>
/// Interaction logic for EnableDisableToggleButton.xaml
/// </summary>
public partial class EnableDisableToggleButton : UserControl
{
public EnableDisableToggleButton()
{
InitializeComponent();
}
}
}

View File

@@ -0,0 +1,26 @@
using System.Windows;
using System.Windows.Media;
namespace Filtration.Utility
{
public class VisualTreeUtility
{
public static T FindParent<T>(DependencyObject child)
where T : DependencyObject
{
//get parent item
var parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
if (parentObject is T parent)
{
return parent;
}
return FindParent<T>(parentObject);
}
}
}

View File

@@ -0,0 +1,160 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows.Media;
using Filtration.ObjectModel;
using Filtration.ObjectModel.BlockItemTypes;
using Filtration.ObjectModel.Commands;
using Filtration.ObjectModel.Enums;
using GalaSoft.MvvmLight.CommandWpf;
using Xceed.Wpf.Toolkit;
namespace Filtration.ViewModels.DesignTime
{
internal class FakeCommandManager : ICommandManagerInternal {
public void ExecuteCommand(ICommand command)
{
throw new NotImplementedException();
}
public void Undo(int undoLevels = 1)
{
throw new NotImplementedException();
}
public void Redo(int redoLevels = 1)
{
throw new NotImplementedException();
}
public void SetScript(IItemFilterScriptInternal layout)
{
}
}
internal class DesignTimeItemFilterBlockViewModel : IItemFilterBlockViewModel
{
private ItemFilterBlock itemFilterBlock;
public DesignTimeItemFilterBlockViewModel()
{
itemFilterBlock = new ItemFilterBlock(new ItemFilterScript(new FakeCommandManager()))
{
Action = BlockAction.Show,
Enabled = true
};
itemFilterBlock.BlockItems.Add(new RarityBlockItem(FilterPredicateOperator.Equal, ItemRarity.Rare));
itemFilterBlock.BlockItems.Add(new DropLevelBlockItem(FilterPredicateOperator.GreaterThan, 23));
itemFilterBlock.BlockItems.Add(new BaseTypeBlockItem());
itemFilterBlock.BlockItems.Add(new BaseTypeBlockItem());
itemFilterBlock.BlockItems.Add(new BaseTypeBlockItem());
}
public void Initialise(IItemFilterBlockBase itemFilterBlock, IItemFilterScriptViewModel itemFilterScriptViewModel)
{
//throw new NotImplementedException();
}
public IItemFilterBlockBase BaseBlock { get; }
public bool IsDirty { get; set; }
public bool IsVisible { get; set; }
public event EventHandler BlockBecameDirty;
public bool IsExpanded
{
get => true;
set { }
}
public IItemFilterBlock Block => itemFilterBlock;
public bool BlockEnabled
{
get => true;
set { }
}
public string BlockDescription { get; set; }
public RelayCommand CopyBlockStyleCommand { get; }
public RelayCommand PasteBlockStyleCommand { get; }
public RelayCommand ToggleBlockActionCommand { get; }
public RelayCommand ReplaceColorsCommand { get; }
public RelayCommand<Type> AddFilterBlockItemCommand { get; }
public RelayCommand<IItemFilterBlockItem> RemoveFilterBlockItemCommand { get; }
public RelayCommand PlaySoundCommand { get; }
public RelayCommand PlayPositionalSoundCommand { get; }
public RelayCommand SwitchBlockItemsViewCommand { get; }
public RelayCommand CustomSoundFileDialogCommand { get; }
public RelayCommand PlayCustomSoundCommand { get; }
public RelayCommand AddBlockGroupCommand { get; }
public RelayCommand DeleteBlockGroupCommand { get; }
public ObservableCollection<ItemFilterBlockGroup> BlockGroups { get; }
public ObservableCollection<string> BlockGroupSuggestions { get; }
public string BlockGroupSearch { get; set; }
public ObservableCollection<IItemFilterBlockItem> BlockItems => Block.BlockItems;
public IEnumerable<IItemFilterBlockItem> SummaryBlockItems
{
get { return Block.BlockItems.Where(b => !(b is IAudioVisualBlockItem)); }
}
public IEnumerable<IItemFilterBlockItem> RegularBlockItems
{
get { return Block.BlockItems.Where(b => !(b is IAudioVisualBlockItem)); }
}
public IEnumerable<IItemFilterBlockItem> AudioVisualBlockItems { get; }
public bool AdvancedBlockGroup { get; }
public bool AudioVisualBlockItemsGridVisible { get; set; }
public bool DisplaySettingsPopupOpen { get; set; }
public IEnumerable<string> AutoCompleteItemClasses { get; }
public IEnumerable<string> AutoCompleteItemBaseTypes { get; }
public IEnumerable<string> AutoCompleteProphecies { get; }
public IEnumerable<string> AutocompleteItemMods { get; }
public List<Type> BlockItemTypesAvailable => new List<Type>
{
typeof (ItemLevelBlockItem),
typeof (DropLevelBlockItem),
typeof (QualityBlockItem),
typeof (RarityBlockItem),
typeof (SocketsBlockItem),
typeof (LinkedSocketsBlockItem),
typeof (WidthBlockItem),
typeof (HeightBlockItem),
typeof (SocketGroupBlockItem),
typeof (ClassBlockItem),
typeof (BaseTypeBlockItem),
typeof (ProphecyBlockItem),
typeof (IdentifiedBlockItem),
typeof (CorruptedBlockItem),
typeof (ElderItemBlockItem),
typeof (ShaperItemBlockItem),
typeof (MapTierBlockItem),
typeof (ShapedMapBlockItem),
typeof (ElderMapBlockItem),
typeof (GemLevelBlockItem),
typeof (StackSizeBlockItem),
typeof (HasExplicitModBlockItem)
};
public List<Type> AudioVisualBlockItemTypesAvailable { get; }
public ObservableCollection<ColorItem> AvailableColors { get; }
public Color DisplayTextColor => Colors.Red;
public Color DisplayBackgroundColor => Colors.White;
public Color DisplayBorderColor => Colors.GreenYellow;
public double DisplayFontSize => 20;
public int DisplayIconSize { get; }
public int DisplayIconColor { get; }
public int DisplayIconShape { get; }
public Color DisplayEffectColor { get; }
public bool HasSound { get; }
public bool HasPositionalSound { get; }
public bool HasCustomSound { get; }
public bool HasAudioVisualBlockItems { get; }
public void RefreshBlockPreview()
{
throw new NotImplementedException();
}
}
}

View File

@@ -25,6 +25,48 @@ namespace Filtration.ViewModels
IItemFilterBlock Block { get; }
bool BlockEnabled { get; set; }
string BlockDescription { get; set; }
RelayCommand CopyBlockStyleCommand { get; }
RelayCommand PasteBlockStyleCommand { get; }
RelayCommand ToggleBlockActionCommand { get; }
RelayCommand ReplaceColorsCommand { get; }
RelayCommand<Type> AddFilterBlockItemCommand { get; }
RelayCommand<IItemFilterBlockItem> RemoveFilterBlockItemCommand { get; }
RelayCommand PlaySoundCommand { get; }
RelayCommand PlayPositionalSoundCommand { get; }
RelayCommand SwitchBlockItemsViewCommand { get; }
RelayCommand CustomSoundFileDialogCommand { get; }
RelayCommand PlayCustomSoundCommand { get; }
RelayCommand AddBlockGroupCommand { get; }
RelayCommand DeleteBlockGroupCommand { get; }
ObservableCollection<ItemFilterBlockGroup> BlockGroups { get; }
ObservableCollection<string> BlockGroupSuggestions { get; }
string BlockGroupSearch { get; set; }
ObservableCollection<IItemFilterBlockItem> BlockItems { get; }
IEnumerable<IItemFilterBlockItem> SummaryBlockItems { get; }
IEnumerable<IItemFilterBlockItem> RegularBlockItems { get; }
IEnumerable<IItemFilterBlockItem> AudioVisualBlockItems { get; }
bool AdvancedBlockGroup { get; }
bool AudioVisualBlockItemsGridVisible { get; set; }
bool DisplaySettingsPopupOpen { get; set; }
IEnumerable<string> AutoCompleteItemClasses { get; }
IEnumerable<string> AutoCompleteItemBaseTypes { get; }
IEnumerable<string> AutoCompleteProphecies { get; }
IEnumerable<string> AutocompleteItemMods { get; }
List<Type> BlockItemTypesAvailable { get; }
List<Type> AudioVisualBlockItemTypesAvailable { get; }
ObservableCollection<ColorItem> AvailableColors { get; }
Color DisplayTextColor { get; }
Color DisplayBackgroundColor { get; }
Color DisplayBorderColor { get; }
double DisplayFontSize { get; }
int DisplayIconSize { get; }
int DisplayIconColor { get; }
int DisplayIconShape { get; }
Color DisplayEffectColor { get; }
bool HasSound { get; }
bool HasPositionalSound { get; }
bool HasCustomSound { get; }
bool HasAudioVisualBlockItems { get; }
void RefreshBlockPreview();
}
@@ -162,6 +204,8 @@ namespace Filtration.ViewModels
public IEnumerable<string> AutoCompleteItemBaseTypes => _staticDataService.ItemBaseTypes;
public IEnumerable<string> AutoCompleteProphecies => _staticDataService.Prophecies;
public IEnumerable<string> AutocompleteItemMods => _staticDataService.ItemMods;
public List<Type> BlockItemTypesAvailable => new List<Type>
@@ -177,6 +221,7 @@ namespace Filtration.ViewModels
typeof (SocketGroupBlockItem),
typeof (ClassBlockItem),
typeof (BaseTypeBlockItem),
typeof (ProphecyBlockItem),
typeof (IdentifiedBlockItem),
typeof (CorruptedBlockItem),
typeof (ElderItemBlockItem),

View File

@@ -6,11 +6,13 @@ using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reactive.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
using System.Windows.Forms;
using System.Windows.Media.Imaging;
using DynamicData.Binding;
using Filtration.Common.Services;
using Filtration.Common.ViewModels;
using Filtration.Interface;
@@ -111,6 +113,7 @@ namespace Filtration.ViewModels
private Predicate<IItemFilterBlockViewModel> _blockFilterPredicate;
private ICommandManager _scriptCommandManager;
private List<IDisposable> _subscriptions;
private ObservableCollection<string> _customSoundsAvailable;
private readonly List<IItemFilterBlockViewModelBase> _lastAddedBlocks;
@@ -130,14 +133,20 @@ namespace Filtration.ViewModels
_persistenceService = persistenceService;
_messageBoxService = messageBoxService;
_clipboardService = clipboardService;
_subscriptions = new List<IDisposable>();
ItemFilterBlockViewModels = new ObservableCollection<IItemFilterBlockViewModelBase>();
SelectedBlockViewModels = new ObservableCollection<IItemFilterBlockViewModelBase>();
SelectedBlockViewModels.CollectionChanged += (s, e) =>
{
_subscriptions.Add(
SelectedBlockViewModels.ToObservableChangeSet()
.Throttle(TimeSpan.FromMilliseconds(30))
.Subscribe(x => {
RaisePropertyChanged(nameof(SelectedBlockViewModels));
RaisePropertyChanged(nameof(LastSelectedBlockViewModel));
Messenger.Default.Send(new NotificationMessage("LastSelectedBlockChanged"));
};
})
);
_lastAddedBlocks = new List<IItemFilterBlockViewModelBase>();
_showAdvanced = Settings.Default.ShowAdvanced;
@@ -815,6 +824,13 @@ namespace Filtration.ViewModels
private void CloseScript()
{
foreach (var disposable in Enumerable.Reverse(_subscriptions))
{
disposable.Dispose();
}
_subscriptions.Clear();
var openMasterThemForScript =
_avalonDockWorkspaceViewModel.OpenMasterThemeForScript(this);
if (openMasterThemForScript != null)

View File

@@ -3,19 +3,17 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:viewModels="clr-namespace:Filtration.ViewModels"
xmlns:userControls="clr-namespace:Filtration.UserControls"
xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"
xmlns:views="clr-namespace:Filtration.Views"
xmlns:converters="clr-namespace:Filtration.Converters"
xmlns:blockItemBaseTypes="clr-namespace:Filtration.ObjectModel.BlockItemBaseTypes;assembly=Filtration.ObjectModel"
xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:designTime="clr-namespace:Filtration.ViewModels.DesignTime"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=viewModels:ItemFilterBlockViewModel}"
d:DesignHeight="200" d:DesignWidth="800">
d:DataContext="{d:DesignInstance Type=designTime:DesignTimeItemFilterBlockViewModel, IsDesignTimeCreatable=True}"
d:DesignHeight="400" d:DesignWidth="817">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<views:BindingProxy x:Key="Proxy" Data="{Binding}" />
<converters:BlockGroupAdvancedFillColorConverter x:Key="BlockGroupAdvancedFillColorConverter" />
@@ -39,8 +37,6 @@
</Style.Triggers>
</Style>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid x:Name="TopLevelGrid">
<Grid x:Name="DisabledBlockOverlay" IsHitTestVisible="False" Panel.ZIndex="1000" Visibility="{Binding BlockEnabled, Converter={StaticResource InverseBooleanVisibilityConverter}}">
@@ -99,7 +95,7 @@
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- BlockItems Summary Panel -->
<StackPanel Grid.Row="0" Grid.Column="0" VerticalAlignment="Center">
<StackPanel Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Margin="0,5">
<StackPanel.Resources>
<CollectionViewSource Source="{Binding SummaryBlockItems}" x:Key="SummaryBlockItemsCollectionViewSource">
<CollectionViewSource.SortDescriptions>
@@ -199,9 +195,9 @@
</Expander.Header>
<Grid Margin="10,5,10,5" x:Name="BlockItemsGrid">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<WrapPanel Grid.Row="0">
@@ -241,23 +237,77 @@
ToolTip="Add" Background="Transparent" BorderThickness="0" Margin="3,0,0,0" />
</WrapPanel>
<!-- Regular Block Items-->
<Grid Grid.Row="1" Visibility="{Binding AudioVisualBlockItemsGridVisible, Converter={StaticResource InverseBooleanVisibilityConverter}}">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="1" VerticalAlignment="Bottom" HorizontalAlignment="Right">
<Hyperlink Command="{Binding SwitchBlockItemsViewCommand}">
Switch to Appearance Block Items
</Hyperlink>
</TextBlock>
<!-- Add Block Item Links -->
<ItemsControl Grid.Column="0" ItemsSource="{Binding BlockItemTypesAvailable}" Grid.Row="0" Margin="0,0,0,10">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Margin="0,0,3,0">
<Hyperlink Command="{Binding ElementName=TopLevelGrid, Path=DataContext.AddFilterBlockItemCommand}" CommandParameter="{Binding}">
<TextBlock>+</TextBlock><TextBlock Text="{Binding Path=., Converter={StaticResource BlockItemTypeToStringConverter}}" />
</Hyperlink>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<!-- Enable/Disable Block Button -->
<userControls:EnableDisableToggleButton Grid.Row="0" Grid.Column="1" VerticalAlignment="Top" />
<!-- Block Items -->
<Grid Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" MaxHeight="200">
<Grid.Resources>
<CollectionViewSource Source="{Binding RegularBlockItems}" x:Key="BlockItemsCollectionViewSource">
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="SortOrder"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Grid.Resources>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" PreviewMouseWheel="UIElement_OnPreviewMouseWheel">
<ItemsControl ItemsSource="{Binding Source={StaticResource BlockItemsCollectionViewSource}}"
ItemContainerStyle="{StaticResource BlockItemFadeInStyle}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<userControls:BlockItemControl BlockItem="{Binding}" RemoveItemCommand="{Binding ElementName=TopLevelGrid, Path=DataContext.RemoveFilterBlockItemCommand}" RemoveEnabled="{Binding Path=., Converter={StaticResource BlockItemToRemoveEnabledVisibilityConverter}}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</Grid>
<!-- Audio/Visual Block Items-->
<Grid Grid.Row="1" Visibility="{Binding AudioVisualBlockItemsGridVisible, Converter={StaticResource BooleanVisibilityConverter}}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- Add AudioVisual Block Item Links -->
<ItemsControl Grid.Column="0" ItemsSource="{Binding AudioVisualBlockItemTypesAvailable}" Grid.Row="0" Margin="0,0,0,10">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel></WrapPanel>
@@ -275,94 +325,20 @@
</ItemsControl>
<!-- Enable/Disable Block Button -->
<ToggleButton Grid.Row="0"
Grid.Column="1"
Style="{StaticResource ChromelessToggleButton}"
IsChecked="{Binding BlockEnabled}"
Margin="0,0,5,0"
ToolTip="Enable/Disable Block"
Cursor="Hand"
Width="25"
Height="25">
<Image RenderOptions.BitmapScalingMode="HighQuality">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding BlockEnabled}" Value="true">
<Setter Property="Source" Value="/Filtration;component/Resources/Icons/standby_enabled_icon.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding BlockEnabled}" Value="false">
<Setter Property="Source" Value="/Filtration;component/Resources/Icons/standby_disabled_icon.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</ToggleButton>
<userControls:EnableDisableToggleButton Grid.Row="0" Grid.Column="1" VerticalAlignment="Top" />
<TextBlock Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" FontStyle="Italic" HorizontalAlignment="Left" Visibility="{Binding HasAudioVisualBlockItems, Converter={StaticResource InverseBooleanVisibilityConverter}}">To change the appearance of this block, add a Text, Background or Border Block Item above.</TextBlock>
<!-- Block Items -->
<WrapPanel Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" MaxHeight="200">
<WrapPanel.Resources>
<CollectionViewSource Source="{Binding RegularBlockItems}" x:Key="BlockItemsCollectionViewSource">
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="SortOrder"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</WrapPanel.Resources>
<ItemsControl ItemsSource="{Binding Source={StaticResource BlockItemsCollectionViewSource}}"
ItemContainerStyle="{StaticResource BlockItemFadeInStyle}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<userControls:BlockItemControl BlockItem="{Binding}" RemoveItemCommand="{Binding ElementName=TopLevelGrid, Path=DataContext.RemoveFilterBlockItemCommand}" RemoveEnabled="{Binding Path=., Converter={StaticResource BlockItemToRemoveEnabledVisibilityConverter}}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</WrapPanel>
</Grid>
<Grid Grid.Row="1" Visibility="{Binding AudioVisualBlockItemsGridVisible, Converter={StaticResource BooleanVisibilityConverter}}">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Grid.Row="1" VerticalAlignment="Bottom" HorizontalAlignment="Right">
<Hyperlink Command="{Binding SwitchBlockItemsViewCommand}">
Switch to Regular Block Items
</Hyperlink>
</TextBlock>
<!-- Add AudioVisual Block Item Links -->
<ItemsControl ItemsSource="{Binding AudioVisualBlockItemTypesAvailable}" Grid.Row="0" Margin="0,0,0,10">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel></WrapPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Margin="0,0,3,0">
<Hyperlink Command="{Binding ElementName=TopLevelGrid, Path=DataContext.AddFilterBlockItemCommand}" CommandParameter="{Binding}">
<TextBlock>+</TextBlock><TextBlock Text="{Binding Path=., Converter={StaticResource BlockItemTypeToStringConverter}}" />
</Hyperlink>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock Grid.Row="1" FontStyle="Italic" HorizontalAlignment="Left" Visibility="{Binding HasAudioVisualBlockItems, Converter={StaticResource InverseBooleanVisibilityConverter}}">To change the appearance of this block, add a Text, Background or Border Block Item above.</TextBlock>
<!-- Block Items -->
<WrapPanel Grid.Row="1" MaxHeight="200">
<WrapPanel.Resources>
<Grid Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" MaxHeight="200">
<Grid.Resources>
<CollectionViewSource Source="{Binding AudioVisualBlockItems}" x:Key="BlockItemsCollectionViewSource">
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="SortOrder"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</WrapPanel.Resources>
</Grid.Resources>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" PreviewMouseWheel="UIElement_OnPreviewMouseWheel">
<ItemsControl ItemsSource="{Binding Source={StaticResource BlockItemsCollectionViewSource}}"
ItemContainerStyle="{StaticResource BlockItemFadeInStyle}">
<ItemsControl.ItemsPanel>
@@ -376,15 +352,29 @@
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</WrapPanel>
</ScrollViewer>
</Grid>
</Grid>
<Grid Grid.Row="2" Margin="0,5,0,5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Margin="0,0,5,0" Text="Description:" VerticalAlignment="Center" />
<TextBox Grid.Column="1" Text="{Binding BlockDescription}" />
<TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0,0,0,8">
<Hyperlink Command="{Binding SwitchBlockItemsViewCommand}">
<Grid>
<TextBlock Text="Switch to Regular Block Items" Visibility="{Binding AudioVisualBlockItemsGridVisible, Converter={StaticResource BooleanVisibilityConverter}}" />
<TextBlock Text="Switch to Appearance Block Items" Visibility="{Binding AudioVisualBlockItemsGridVisible, Converter={StaticResource InverseBooleanVisibilityConverter}}" />
</Grid>
</Hyperlink>
</TextBlock>
<TextBlock Grid.Row="1" Grid.Column="0" Margin="0,0,5,0" Text="Description:" VerticalAlignment="Center" />
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding BlockDescription}" />
</Grid>
</Grid>
</Expander>

View File

@@ -1,5 +1,9 @@
using System.Windows.Input;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using Filtration.UserControls;
using Filtration.Utility;
namespace Filtration.Views
{
@@ -25,10 +29,36 @@ namespace Filtration.Views
{
if (e.Key == Key.Enter)
{
System.Windows.Controls.AutoCompleteBox box = sender as System.Windows.Controls.AutoCompleteBox;
AutoCompleteBox box = sender as AutoCompleteBox;
dynamic viewModel = box.DataContext;
viewModel.AddBlockGroupCommand.Execute(null);
}
}
private void UIElement_OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
// Prevents the ScrollViewer from handling mouse wheel events, and passes the events
// to the parent control instead. This is necessary because the ItemsControl that displays
// ItemFilterBlocks is in a ScrollViewer but we want to use the mouse wheel for scrolling
// up and down in ItemFilterScriptView rather than within the block.
if (sender is ScrollViewer viewer && !e.Handled)
{
// Don't handle events if they originated from a control within an EditableListBoxControl
// since we still want to allow scrolling within those with the mouse wheel
if (e.OriginalSource is DependencyObject dependencyObject && VisualTreeUtility.FindParent<EditableListBoxControl>(dependencyObject) != null)
{
e.Handled = false;
return;
}
e.Handled = true;
var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta) {RoutedEvent = MouseWheelEvent, Source = viewer};
if (viewer.Parent is UIElement parent)
{
parent.RaiseEvent(eventArg);
}
}
}
}
}

View File

@@ -6,6 +6,7 @@
<package id="CommonServiceLocator" version="2.0.4" targetFramework="net461" />
<package id="ControlzEx" version="3.0.2.4" targetFramework="net461" />
<package id="DeltaCompressionDotNet" version="1.1.0" targetFramework="net461" />
<package id="DynamicData" version="6.7.0.2529" targetFramework="net461" />
<package id="Extended.Wpf.Toolkit" version="3.4.0" targetFramework="net461" />
<package id="Fluent.Ribbon" version="6.1.0.326" targetFramework="net461" />
<package id="MahApps.Metro" version="1.2.4.0" targetFramework="net461" />
@@ -17,6 +18,7 @@
<package id="SharpCompress" version="0.17.1" targetFramework="net461" />
<package id="Splat" version="1.6.2" targetFramework="net461" />
<package id="squirrel.windows" version="1.9.0" targetFramework="net461" />
<package id="System.Reactive" version="4.0.0" targetFramework="net461" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net461" />
<package id="WindowsAPICodePack-Core" version="1.1.2" targetFramework="net461" />
<package id="WindowsAPICodePack-Shell" version="1.1.1" targetFramework="net461" />