27 Commits

Author SHA1 Message Date
Ben Wallis
8073948cfe Added missing AlertSound mp3 files to installer 2018-10-01 12:26:27 +01:00
Ben Wallis
f331bffee7 Update README.md 2018-09-30 14:04:44 +01:00
Ben Wallis
f238bbf856 Fixed a crash on exit caused by a null SelectedBlockViewModel 2018-09-30 14:02:47 +01:00
Ben Wallis
a0191576f0 Update README.md 2018-09-30 13:57:35 +01:00
Ben Wallis
1d96b69800 Update README.md 2018-09-30 12:51:47 +01:00
Ben Wallis
99abb276af Merge branch 'bugfix/FixBlockOutputPreview' 2018-09-30 12:49:35 +01:00
Ben Wallis
073fe553ea Made block output preview pane text selectable 2018-09-30 12:48:24 +01:00
Ben Wallis
0d81d0ef54 Fixed block output preview 2018-09-30 12:38:26 +01:00
Ben Wallis
f04f9c20ed Update README.md 2018-09-30 11:57:40 +01:00
Ben Wallis
f71ba74425 Update README.md 2018-09-30 11:57:24 +01:00
Ben Wallis
04cbf218f3 Bumped version to 1.0.0 2018-09-30 11:43:22 +01:00
Ben Wallis
6007306346 Added 1.0.0 release notes 2018-09-28 20:44:25 +01:00
Ben Wallis
992bd21570 Fixed UpdateService which was erroneously using the local update manager instead of the GitHub update manager for several parts of the update process 2018-09-28 20:24:09 +01:00
Ben Wallis
7d8b32b2e7 Fixup after merging missed commit from master 2018-09-28 17:58:16 +01:00
Ben Wallis
ac904c31ff * Added default colours for TextColor, BorderColor and BackgroundColor block items (previously the default color was completely transparent)
* Bumped version to 1.0.0-beta3
2018-09-28 17:47:23 +01:00
Ben Wallis
f51fe315ad Updated Filtration.nuspec for 1.0.0-beta2 2018-09-28 17:27:07 +01:00
Ben Wallis
3ce2e12f56 Disabled setting themes for MinimapIcon, PlayEffect and SetFontSize blocks (temporary fix for issue #68) 2018-09-28 17:20:42 +01:00
Ben Wallis
43e5b30080 Merge pull request #88 from GlenCFL/validate-lists
Audit and Validate the Data Files
2018-09-27 12:38:58 +01:00
GlenCFL
bc99339390 Audit the static data files. 2018-09-27 07:21:32 -04:00
Ben Wallis
781faae85d Merge pull request #87 from GlenCFL/mod-completions
Provide autocompletions for item mods.
2018-09-27 07:08:47 +01:00
GlenCFL
c926808878 Remove the now irrelevant static data test. 2018-09-26 23:40:34 -04:00
GlenCFL
24d9f97717 Provide autocompletions for item mods. 2018-09-26 23:35:39 -04:00
Ben Wallis
7e4e6fe42e Refactored StaticDataService to use local resources for ItemBaseTypes.txt and ItemClasses.txt instead of the old files in APPDATA that aren't used anymore.
Bumped develop version to 1.0.0-beta2
2018-09-26 19:12:31 +01:00
Ben Wallis
0209de3817 Update README.md 2018-09-01 10:15:38 +01:00
Ben Wallis
1e26a2ae3e Merge pull request #62 from GlenCFL/fix-reopen
Fix the reading of CustomAlertSounds containing path separators.
2018-09-01 09:57:54 +01:00
GlenCFL
54b72e44b0 Reposition the new custom sound tests. 2018-08-31 21:06:51 -04:00
GlenCFL
24df1d7687 Fix the reading of CustomAlertSounds containing path separators. 2018-08-31 20:01:21 -04:00
26 changed files with 2085 additions and 1035 deletions

View File

@@ -7,6 +7,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
{
public BackgroundColorBlockItem()
{
Color = new Color { A = 240, R = 0, G = 0, B = 0 };
}
public BackgroundColorBlockItem(Color color) : base(color)

View File

@@ -7,6 +7,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
{
public BorderColorBlockItem()
{
Color = new Color {A = 240, R = 0, G = 0, B = 0};
}
public BorderColorBlockItem(Color color) : base(color)

View File

@@ -1,5 +1,6 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
@@ -7,6 +8,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
{
public TextColorBlockItem()
{
Color = PathOfExileNamedColors.Colors[PathOfExileNamedColor.WhiteItem];
}
public TextColorBlockItem(Color color) : base(color)

View File

@@ -94,7 +94,7 @@ namespace Filtration.Parser.Tests.Services
// Arrange
var inputString = "HideDisabled" + Environment.NewLine +
" ItemLevel >= 55";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
@@ -374,37 +374,37 @@ namespace Filtration.Parser.Tests.Services
}
[Test]
public void TranslateStringToItemFilterBlock_ElderItem_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" ElderItem False";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ElderItemBlockItem));
var blockItem = result.BlockItems.OfType<ElderItemBlockItem>().First();
Assert.IsFalse(blockItem.BooleanValue);
public void TranslateStringToItemFilterBlock_ElderItem_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" ElderItem False";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ElderItemBlockItem));
var blockItem = result.BlockItems.OfType<ElderItemBlockItem>().First();
Assert.IsFalse(blockItem.BooleanValue);
}
[Test]
public void TranslateStringToItemFilterBlock_ShaperItem_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" ShaperItem True";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ShaperItemBlockItem));
var blockItem = result.BlockItems.OfType<ShaperItemBlockItem>().First();
Assert.IsTrue(blockItem.BooleanValue);
public void TranslateStringToItemFilterBlock_ShaperItem_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" ShaperItem True";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ShaperItemBlockItem));
var blockItem = result.BlockItems.OfType<ShaperItemBlockItem>().First();
Assert.IsTrue(blockItem.BooleanValue);
}
[Test]
@@ -426,37 +426,37 @@ namespace Filtration.Parser.Tests.Services
}
[Test]
public void TranslateStringToItemFilterBlock_ShapedMap_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" ShapedMap false";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ShapedMapBlockItem));
var blockItem = result.BlockItems.OfType<ShapedMapBlockItem>().First();
Assert.IsFalse(blockItem.BooleanValue);
public void TranslateStringToItemFilterBlock_ShapedMap_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" ShapedMap false";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ShapedMapBlockItem));
var blockItem = result.BlockItems.OfType<ShapedMapBlockItem>().First();
Assert.IsFalse(blockItem.BooleanValue);
}
[Test]
public void TranslateStringToItemFilterBlock_ElderMap_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" ElderMap false";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ElderMapBlockItem));
var blockItem = result.BlockItems.OfType<ElderMapBlockItem>().First();
Assert.IsFalse(blockItem.BooleanValue);
public void TranslateStringToItemFilterBlock_ElderMap_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" ElderMap false";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ElderMapBlockItem));
var blockItem = result.BlockItems.OfType<ElderMapBlockItem>().First();
Assert.IsFalse(blockItem.BooleanValue);
}
[Test]
@@ -795,7 +795,7 @@ namespace Filtration.Parser.Tests.Services
" SetTextColor 255 20 100 # Rare Item Text";
var testComponent = new ColorThemeComponent(ThemeComponentType.TextColor, "Rare Item Text", new Color { A = 240, R = 255, G = 20, B = 100});
var testInputThemeComponentCollection = new ThemeComponentCollection { testComponent };
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.ThemeComponentCollection == testInputThemeComponentCollection));
@@ -896,22 +896,22 @@ namespace Filtration.Parser.Tests.Services
}
[Test]
public void TranslateStringToItemFilterBlock_DisableDropSound_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" DisableDropSound True";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is DisableDropSoundBlockItem));
var blockItem = result.BlockItems.OfType<DisableDropSoundBlockItem>().First();
Assert.IsTrue(blockItem.BooleanValue);
}
public void TranslateStringToItemFilterBlock_DisableDropSound_ReturnsCorrectObject()
{
// Arrange
var inputString = "Show" + Environment.NewLine +
" DisableDropSound True";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is DisableDropSoundBlockItem));
var blockItem = result.BlockItems.OfType<DisableDropSoundBlockItem>().First();
Assert.IsTrue(blockItem.BooleanValue);
}
[Test]
public void TranslateStringToItemFilterBlock_Everything_ReturnsCorrectObject()
{
@@ -1046,7 +1046,7 @@ namespace Filtration.Parser.Tests.Services
var fontSizeblockItem = result.BlockItems.OfType<FontSizeBlockItem>().First();
Assert.AreEqual(50, fontSizeblockItem.Value);
Assert.AreEqual(0, result.BlockItems.OfType<SoundBlockItem>().Count());
var disableDropSoundBlockItem = result.BlockItems.OfType<DisableDropSoundBlockItem>().First();
@@ -1089,9 +1089,9 @@ namespace Filtration.Parser.Tests.Services
// Arrange
var inputString = "Show" + Environment.NewLine +
" ItemLevel >= 70" + Environment.NewLine +
" ItemLevel <= 80" + Environment.NewLine +
" Quality = 15" + Environment.NewLine +
" ItemLevel >= 70" + Environment.NewLine +
" ItemLevel <= 80" + Environment.NewLine +
" Quality = 15" + Environment.NewLine +
" Quality < 17";
// Act
@@ -1152,7 +1152,7 @@ namespace Filtration.Parser.Tests.Services
var blockItem = result.BlockItems.OfType<FontSizeBlockItem>().First();
Assert.AreEqual(27, blockItem.Value);
}
[Test]
public void TranslateStringToItemFilterBlock_MultipleSoundItems_OnlyLastOneUsed()
{
@@ -1308,6 +1308,86 @@ namespace Filtration.Parser.Tests.Services
Assert.AreEqual(ItemRarity.Magic, (ItemRarity)rarityBlockItem.FilterPredicate.PredicateOperand);
}
[Test]
public void TranslateStringToItemFilterBlock_CustomSoundDocumentsFile()
{
// Arrange
var inputString = @"Show" + Environment.NewLine +
"CustomAlertSound \"test.mp3\"";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is CustomSoundBlockItem));
var customSoundBlockItem = result.BlockItems.OfType<CustomSoundBlockItem>().First();
Assert.AreEqual("test.mp3", customSoundBlockItem.Value);
}
[Test]
public void TranslateStringToItemFilterBlock_CustomSoundDocumentsRelativeFile()
{
// Arrange
var inputString = @"Show" + Environment.NewLine +
"CustomAlertSound \"Sounds\test.mp3\"";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is CustomSoundBlockItem));
var customSoundBlockItem = result.BlockItems.OfType<CustomSoundBlockItem>().First();
Assert.AreEqual("Sounds\test.mp3", customSoundBlockItem.Value);
}
[Test]
public void TranslateStringToItemFilterBlock_CustomSoundFullBackSlashPath()
{
// Arrange
var inputString = @"Show" + Environment.NewLine +
"CustomAlertSound \"C:\\Sounds\\test.mp3\"";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is CustomSoundBlockItem));
var customSoundBlockItem = result.BlockItems.OfType<CustomSoundBlockItem>().First();
Assert.AreEqual("C:\\Sounds\\test.mp3", customSoundBlockItem.Value);
}
[Test]
public void TranslateStringToItemFilterBlock_CustomSoundFullForwardSlashPath()
{
// Arrange
var inputString = @"Show" + Environment.NewLine +
"CustomAlertSound \"C:/Sounds/test.mp3\"";
//Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is CustomSoundBlockItem));
var customSoundBlockItem = result.BlockItems.OfType<CustomSoundBlockItem>().First();
Assert.AreEqual("C:/Sounds/test.mp3", customSoundBlockItem.Value);
}
[Test]
public void TranslateStringToItemFilterBlock_CustomSoundFullMixedPath()
{
// Arrange
var inputString = @"Show" + Environment.NewLine +
"CustomAlertSound \"C:\\Sounds/test.mp3\"";
// Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is CustomSoundBlockItem));
var customSoundBlockItem = result.BlockItems.OfType<CustomSoundBlockItem>().First();
Assert.AreEqual("C:\\Sounds/test.mp3", customSoundBlockItem.Value);
}
[Test]
public void TranslateItemFilterBlockToString_NothingPopulated_ReturnsCorrectString()
{
@@ -1328,13 +1408,13 @@ namespace Filtration.Parser.Tests.Services
{
// Arrange
var expectedResult = "Show # Child 1 Block Group - Child 2 Block Group";
var rootBlockGroup = new ItemFilterBlockGroup("Root Block Group", null);
var child1BlockGroup = new ItemFilterBlockGroup("Child 1 Block Group", rootBlockGroup);
var child2BlockGroup = new ItemFilterBlockGroup("Child 2 Block Group", child1BlockGroup);
_testUtility.TestBlock.BlockGroup = child2BlockGroup;
// TODO: Shouldn't be set to edited this way
_testUtility.TestBlock.BlockGroup = child2BlockGroup;
// TODO: Shouldn't be set to edited this way
_testUtility.TestBlock.IsEdited = true;
// Act
var result = _testUtility.Translator.TranslateItemFilterBlockToString(_testUtility.TestBlock);
@@ -1853,7 +1933,7 @@ namespace Filtration.Parser.Tests.Services
{
// Arrange
var expectedResult = "Show" + Environment.NewLine +
" ItemLevel > 56" + Environment.NewLine +
" ItemLevel > 56" + Environment.NewLine +
" ItemLevel >= 45" + Environment.NewLine +
" ItemLevel < 100";
@@ -1895,7 +1975,7 @@ namespace Filtration.Parser.Tests.Services
// Arrange
var expectedResult = "#Show" + Environment.NewLine +
"# Width = 4";
_testUtility.TestBlock.Enabled = false;
_testUtility.TestBlock.BlockItems.Add(new WidthBlockItem(FilterPredicateOperator.Equal, 4));
@@ -1942,7 +2022,7 @@ namespace Filtration.Parser.Tests.Services
" DisableDropSound True" + Environment.NewLine +
" MinimapIcon 1 Blue Circle" + Environment.NewLine +
" PlayEffect Red Temp" + Environment.NewLine +
" CustomAlertSound \"test.mp3\"";
" CustomAlertSound \"test.mp3\"";
_testUtility.TestBlock.BlockItems.Add(new ActionBlockItem(BlockAction.Show));
_testUtility.TestBlock.BlockItems.Add(new IdentifiedBlockItem(true));
@@ -2010,7 +2090,7 @@ namespace Filtration.Parser.Tests.Services
// Act
_testUtility.Translator.ReplaceAudioVisualBlockItemsFromString(testInputBlockItems, testInputString);
// Assert
var textColorBlockItem = testInputBlockItems.First(b => b is TextColorBlockItem) as TextColorBlockItem;
Assert.IsNotNull(textColorBlockItem);
@@ -2085,7 +2165,7 @@ namespace Filtration.Parser.Tests.Services
// Arrange
var testInputString = "SetTextColor 240 200 150 # Rarest Currency" + Environment.NewLine +
"SetBackgroundColor 0 0 0 # Rarest Currency Background" + Environment.NewLine +
"SetBorderColor 255 255 255 # Rarest Currency Border" + Environment.NewLine +
"SetBorderColor 255 255 255 # Rarest Currency Border" + Environment.NewLine +
"PlayAlertSound 7 280";
var testInputBlockItems = new ObservableCollection<IItemFilterBlockItem>();
@@ -2131,9 +2211,9 @@ namespace Filtration.Parser.Tests.Services
// Arrange
var testInputString = "SetTextColor 240 200 150 # Rarest Currency" + Environment.NewLine +
"SetBackgroundColor 0 0 0 # Rarest Currency Background" + Environment.NewLine +
"SetBorderColor 255 255 255 # Rarest Currency Border" + Environment.NewLine +
"SetBorderColor 255 255 255 # Rarest Currency Border" + Environment.NewLine +
"PlayAlertSound 7 280";
var testInputBlockItems = new ObservableCollection<IItemFilterBlockItem>();
// Act
@@ -2203,9 +2283,9 @@ namespace Filtration.Parser.Tests.Services
_testUtility.Translator.ReplaceAudioVisualBlockItemsFromString(testInputBlockItems, testInputString);
// Assert
}
private class ItemFilterBlockTranslatorTestUtility
{
public ItemFilterBlockTranslatorTestUtility()

File diff suppressed because it is too large Load Diff

View File

@@ -1,121 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{E0693972-72C5-4E05-A9C5-A5943E4015C6}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Filtration.Tests</RootNamespace>
<AssemblyName>Filtration.Tests</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FluentAssertions, Version=4.19.2.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.19.2\lib\net45\FluentAssertions.dll</HintPath>
</Reference>
<Reference Include="FluentAssertions.Core, Version=4.19.2.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.19.2\lib\net45\FluentAssertions.Core.dll</HintPath>
</Reference>
<Reference Include="Moq, Version=4.5.30.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.5.30\lib\net45\Moq.dll</HintPath>
</Reference>
<Reference Include="nunit.framework, Version=3.6.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Repositories\TestItemFilterScriptRepository.cs" />
<Compile Include="Services\TestHTTPService.cs" />
<Compile Include="Services\TestItemFilterPersistenceService.cs" />
<Compile Include="Services\TestStaticDataService.cs" />
<Compile Include="Services\TestUpdateService.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Folder Include="Models\" />
<Folder Include="Resources\" />
<Folder Include="Translators\" />
<Folder Include="ViewModels\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Filtration.Common\Filtration.Common.csproj">
<Project>{8cb44f28-2956-4c2a-9314-72727262edd4}</Project>
<Name>Filtration.Common</Name>
</ProjectReference>
<ProjectReference Include="..\Filtration.Interface\Filtration.Interface.csproj">
<Project>{0f333344-7695-47b2-b0e6-172e4de74819}</Project>
<Name>Filtration.Interface</Name>
</ProjectReference>
<ProjectReference Include="..\Filtration.ObjectModel\Filtration.ObjectModel.csproj">
<Project>{4aac3beb-1dc1-483e-9d11-0e9334e80227}</Project>
<Name>Filtration.ObjectModel</Name>
</ProjectReference>
<ProjectReference Include="..\Filtration.Parser.Interface\Filtration.Parser.Interface.csproj">
<Project>{46383F20-02DF-48B4-B092-9088FA4ACD5A}</Project>
<Name>Filtration.Parser.Interface</Name>
</ProjectReference>
<ProjectReference Include="..\Filtration\Filtration.csproj">
<Project>{55e0a34c-e039-43d7-a024-a4045401cdda}</Project>
<Name>Filtration</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{E0693972-72C5-4E05-A9C5-A5943E4015C6}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Filtration.Tests</RootNamespace>
<AssemblyName>Filtration.Tests</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FluentAssertions, Version=4.19.2.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.19.2\lib\net45\FluentAssertions.dll</HintPath>
</Reference>
<Reference Include="FluentAssertions.Core, Version=4.19.2.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.19.2\lib\net45\FluentAssertions.Core.dll</HintPath>
</Reference>
<Reference Include="Moq, Version=4.5.30.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.5.30\lib\net45\Moq.dll</HintPath>
</Reference>
<Reference Include="nunit.framework, Version=3.6.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Repositories\TestItemFilterScriptRepository.cs" />
<Compile Include="Services\TestHTTPService.cs" />
<Compile Include="Services\TestItemFilterPersistenceService.cs" />
<Compile Include="Services\TestUpdateService.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Folder Include="Models\" />
<Folder Include="Resources\" />
<Folder Include="Translators\" />
<Folder Include="ViewModels\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Filtration.Common\Filtration.Common.csproj">
<Project>{8cb44f28-2956-4c2a-9314-72727262edd4}</Project>
<Name>Filtration.Common</Name>
</ProjectReference>
<ProjectReference Include="..\Filtration.Interface\Filtration.Interface.csproj">
<Project>{0f333344-7695-47b2-b0e6-172e4de74819}</Project>
<Name>Filtration.Interface</Name>
</ProjectReference>
<ProjectReference Include="..\Filtration.ObjectModel\Filtration.ObjectModel.csproj">
<Project>{4aac3beb-1dc1-483e-9d11-0e9334e80227}</Project>
<Name>Filtration.ObjectModel</Name>
</ProjectReference>
<ProjectReference Include="..\Filtration.Parser.Interface\Filtration.Parser.Interface.csproj">
<Project>{46383F20-02DF-48B4-B092-9088FA4ACD5A}</Project>
<Name>Filtration.Parser.Interface</Name>
</ProjectReference>
<ProjectReference Include="..\Filtration\Filtration.csproj">
<Project>{55e0a34c-e039-43d7-a024-a4045401cdda}</Project>
<Name>Filtration</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
-->
</Project>

View File

@@ -1,44 +0,0 @@
using Filtration.Common.Services;
using Filtration.Services;
using Moq;
using NUnit.Framework;
namespace Filtration.Tests.Services
{
[TestFixture]
public class TestStaticDataService
{
[Test]
public void Constructor_CallsFileSystemService()
{
// Arrange
var mockFileSystemService = new Mock<IFileSystemService>();
mockFileSystemService.Setup(f => f.ReadFileAsString(It.IsAny<string>())).Returns("TestResult").Verifiable();
var service = new StaticDataService(mockFileSystemService.Object);
// Act
// Assert
mockFileSystemService.Verify();
}
[Ignore("Integration Test")]
[Test]
public void Constructor_ReadsFromFileCorrectly()
{
// Arrange
var fileSystemService = new FileSystemService();
var service = new StaticDataService(fileSystemService);
// Act
// Assert
}
}
}

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Filtration.Enums
{
internal enum UpdateSource
{
GitHub,
Local
}
}

View File

@@ -203,6 +203,7 @@
<Compile Include="Converters\HashSignRemovalConverter.cs" />
<Compile Include="Converters\ItemRarityConverter.cs" />
<Compile Include="Converters\TreeViewMarginConverter.cs" />
<Compile Include="Enums\UpdateSource.cs" />
<Compile Include="Models\UpdateData.cs" />
<Compile Include="Properties\Annotations.cs" />
<Compile Include="Repositories\ItemFilterScriptRepository.cs" />
@@ -438,6 +439,7 @@
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Resources\ItemMods.txt" />
<Resource Include="Resources\loading_spinner.gif" />
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
@@ -586,8 +588,8 @@
<Content Include="Resources\AlertSounds\SH22Vaal.mp3">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Resources\ItemBaseTypes.txt" />
<Content Include="Resources\ItemClasses.txt" />
<EmbeddedResource Include="Resources\ItemBaseTypes.txt" />
<EmbeddedResource Include="Resources\ItemClasses.txt" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Filtration.Common\Filtration.Common.csproj">

View File

@@ -9,10 +9,11 @@
<description>A Path of Exile loot filter script editor</description>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<copyright>Copyright 2018</copyright>
<releaseNotes>The release notes for 1.0.0 have not been written yet!</releaseNotes>
<releaseNotes>* Added missing AlertSound mp3 resources to installer</releaseNotes>
<dependencies />
</metadata>
<files>
<file src="*.*" target="lib\net45\" exclude="*.pdb;*.nupkg;*.vshost.*;*.xml"/>
<file src="Resources\AlertSounds\*.mp3" target="lib\net45\Resources\AlertSounds\" />
</files>
</package>

View File

@@ -10,8 +10,8 @@ using System.Runtime.CompilerServices;
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0-beta1")]
[assembly: AssemblyVersion("1.0.3")]
[assembly: AssemblyInformationalVersion("1.0.3-beta1")]
[assembly: InternalsVisibleTo("Filtration.Tests")]
[assembly: InternalsVisibleTo("Filtration.ItemFilterPreview.Tests")]

View File

@@ -224,6 +224,164 @@ namespace Filtration.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to A Mother&apos;s Parting Gift
///Abandoned Wealth
///Aberrant Fossil
///Abyssal Axe
///Abyssal Cry
///Abyssal Sceptre
///Academy Map
///Acid Lakes Map
///Added Chaos Damage Support
///Added Cold Damage Support
///Added Fire Damage Support
///Added Lightning Damage Support
///Additional Accuracy Support
///Aetheric Fossil
///Agate Amulet
///Albino Rhoa Feather
///Alchemy Shard
///Alder Spiked Shield
///Alira&apos;s Amulet
///Alleyways Map
///Allflame
///Alloyed Spiked Shield
///Alteration Shard
///Amber Amulet
///Ambush Boots
///Ambush Leaguestone
///Ambush Mitts
///Ambusher
///Amethyst Flask
///Amethyst [rest of string was truncated]&quot;;.
/// </summary>
internal static string ItemBaseTypes {
get {
return ResourceManager.GetString("ItemBaseTypes", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Abyss Jewel
///Active Skill Gems
///Amulets
///Axe
///Belts
///Body Armours
///Boots
///Bows
///Claws
///Currency
///Daggers
///Delve Socketable Currency
///Divination Card
///Fishing Rods
///Flasks
///Gems
///Gloves
///Helmets
///Hybrid Flasks
///Incursion Item
///Jewel
///Labyrinth Item
///Labyrinth Map Item
///Labyrinth Trinket
///Large Relics
///Leaguestone
///Life Flasks
///Mace
///Mana Flasks
///Map Fragments
///Maps
///Misc Map Items
///One Hand Axes
///One Hand Maces
///One Hand Swords
///Pantheon Soul
///Piece
///Quest Items
///Quivers
///Rings
///Sceptres
///Shields
///Stackable Currency
///Staves
///Support Skill Gems
///Sword
///T [rest of string was truncated]&quot;;.
/// </summary>
internal static string ItemClasses {
get {
return ResourceManager.GetString("ItemClasses", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Abbot&apos;s
///Abhorrent
///Acrobat&apos;s
///Adept&apos;s
///Agile
///Alchemist&apos;s
///Alluring
///Alpine
///Ample
///Anarchic
///Anarchist&apos;s
///Annealed
///Antagonist&apos;s
///Apprentice&apos;s
///Aqua
///Archmage&apos;s
///Arcing
///Arctic
///Armadillo&apos;s
///Arming
///Armoured
///Athlete&apos;s
///Avalanching
///Avenger&apos;s
///Azure
///Bandit&apos;s
///Barbed
///Battlemage&apos;s
///Beating
///Beautiful
///Beetle&apos;s
///Beryl
///Betrayer&apos;s
///Bipedal
///Biting
///Bitter
///Blasting
///Blazing
///Blistering
///Bloodthirsty
///Blue
///Blunt
///Blurred
///Boggart&apos;s
///Bolting
///Brawler&apos;s
///Breathtaking
///Brinerot
///Brutal
///Bubbling
///Burning
///Burnished
///Butterfly&apos;s
///Buttressed
///Buzzing
///Calming
///Capric [rest of string was truncated]&quot;;.
/// </summary>
internal static string ItemMods {
get {
return ResourceManager.GetString("ItemMods", resourceCulture);
}
}
/// <summary>
/// Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream.
/// </summary>

View File

@@ -202,4 +202,13 @@
<data name="SH22Vaal" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\AlertSounds\SH22Vaal.mp3;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ItemBaseTypes" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ItemBaseTypes.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="ItemClasses" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ItemClasses.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<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>
</root>

View File

@@ -11,6 +11,7 @@ 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
@@ -64,6 +65,7 @@ Arcane Surge Support
Arcanist Gloves
Arcanist Slippers
Archon Kite Shield
Archon Kite Shield Piece
Arctic Armour
Arctic Breath
Arena Map
@@ -87,6 +89,7 @@ Atziri's Arsenal
Audacity
Auric Mace
Aventail Helmet
Avian Slippers
Avian Twins Talisman
Awl
Baleful Gem
@@ -154,6 +157,7 @@ Bloodlust Support
Bloodstained Fossil
Blue Pearl Amulet
Blunt Arrow Quiver
Blunt Arrow Quiver Piece
Boarding Axe
Bodyswap
Bog Map
@@ -207,7 +211,28 @@ Caldera Map
Calendar of Fortune
Call to the First Ones
Callous Mask
Callous Mask Piece
Canyon Map
Captured Soul
Captured Soul of Arachnoxia
Captured Soul of Armala, the Widow
Captured Soul of Drek, Apex Hunter
Captured Soul of Erebix, Light's Bane
Captured Soul of Gorulis, Will-Thief
Captured Soul of Jorus, Sky's Edge
Captured Soul of Lycius, Midnight's Howl
Captured Soul of Mephod, the Earth Scorcher
Captured Soul of Nassar, Lion of the Seas
Captured Soul of Puruna, the Challenger
Captured Soul of Sebbert, Crescent's Point
Captured Soul of Shadow of the Vaal
Captured Soul of Shock and Horror
Captured Soul of Stalker of the Endless Dunes
Captured Soul of Suncaller Asha
Captured Soul of Terror of the Infinite Drifts
Captured Soul of The Forgotten Soldier
Captured Soul of Thraxia
Captured Soul of Varhesh, Shimmering Aberration
Carcass Map
Cardinal Round Shield
Carnal Armour
@@ -246,11 +271,11 @@ Chainmail Vest
Champion Kite Shield
Chance to Bleed Support
Chance to Flee Support
Chance to Ignite Support
Channel Map
Chaos Orb
Chaos Shard
Chaotic Disposition
Charan's Sword
Charged Dash
Charged Traps Support
Chateau Map
@@ -271,6 +296,7 @@ Cleave
Cleaver
Close Helmet
Cloth Belt
Cloth Belt Piece
Cluster Traps Support
Clutching Talisman
Cobalt Jewel
@@ -287,6 +313,7 @@ Colossal Tower Shield
Colosseum Map
Colosseum Plate
Colossus Mallet
Combustion Support
Commander's Brigandine
Composite Bow
Compound Bow
@@ -457,6 +484,7 @@ Eelskin Gloves
Eelskin Tunic
Efficacy Support
Elder Sword
Elder's Orb
Elegant Foil
Elegant Ringmail
Elegant Round Shield
@@ -487,10 +515,30 @@ Enlighten Support
Esh's Breachstone
Essence Drain
Essence Leaguestone
Essence of Anger
Essence of Anguish
Essence of Contempt
Essence of Delirium
Essence of Doubt
Essence of Dread
Essence of Envy
Essence of Fear
Essence of Greed
Essence of Hatred
Essence of Horror
Essence of Hysteria
Essence of Insanity
Essence of Loathing
Essence of Misery
Essence of Rage
Essence of Scorn
Essence of Sorrow
Essence of Spite
Essence of Suffering
Essence of Torment
Essence of Woe
Essence of Wrath
Essence of Zeal
Estoc
Estuary Map
Etched Greatsword
@@ -673,6 +721,7 @@ Hallowed Life Flask
Hallowed Mana Flask
Hammered Buckler
Harbinger Bow
Harbinger Map
Harbinger's Orb
Harbinger's Shard
Harlequin Mask
@@ -740,6 +789,7 @@ Imperial Claw
Imperial Maul
Imperial Skean
Imperial Staff
Imperial Staff Piece
Imprinted Bestiary Orb
Incinerate
Increased Area of Effect Support
@@ -831,15 +881,16 @@ Legion Boots
Legion Gloves
Legion Hammer
Legion Sword
Legion Sword Piece
Less Duration Support
Lesser Multiple Projectiles Support
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
@@ -901,6 +952,17 @@ Medium Life Flask
Medium Mana Flask
Melee Physical Damage Support
Melee Splash Support
Memory Fragment
Memory Fragment I
Memory Fragment II
Memory Fragment III
Memory Fragment IV
Memory Fragment V
Memory Fragment VI
Memory Fragment VII
Memory Fragment VIII
Memory Fragment IX
Memory Fragment X
Merciless Armament
Mesa Map
Mesh Boots
@@ -913,14 +975,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 of Kalandra
Mirror Shard
Mirror of Kalandra
Mirrored Spiked Shield
Mitts
Molten Shell
@@ -1098,9 +1160,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
@@ -1117,6 +1179,7 @@ Reave
Reaver Axe
Reaver Helmet
Reaver Sword
Rebirth
Reckoning
Recurve Bow
Reduced Mana Support
@@ -1572,6 +1635,7 @@ The Scavenger
The Scholar
The Sephirot
The Shaper's Key
The Shaper's Realm
The Sigil
The Siren
The Soul
@@ -1655,9 +1719,8 @@ Toxic Rain
Toxic Sewer Map
Tranquillity
Transmutation Shard
Trap and Mine Damage Support
Trap Cooldown Support
Trap Support
Trap and Mine Damage Support
Trapper Boots
Trapper Mitts
Trarthan Powder
@@ -1752,16 +1815,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

View File

@@ -1,7 +1,7 @@
Abyss Jewel
Active Skill Gems
Amulets
Axe
Axes
Belts
Body Armours
Boots
@@ -25,7 +25,7 @@ Labyrinth Trinket
Large Relics
Leaguestone
Life Flasks
Mace
Maces
Mana Flasks
Map Fragments
Maps
@@ -43,7 +43,7 @@ Shields
Stackable Currency
Staves
Support Skill Gems
Sword
Swords
Thrusting One Hand Swords
Two Hand Axes
Two Hand Maces

View File

@@ -0,0 +1,786 @@
Abbot's
Abhorrent
Acrobat's
Adept's
Agile
Alchemist's
Alluring
Alpine
Ample
Anarchic
Anarchist's
Annealed
Antagonist's
Apprentice's
Aqua
Archmage's
Arcing
Arctic
Armadillo's
Arming
Armoured
Athlete's
Avalanching
Avenger's
Azure
Bandit's
Barbed
Battlemage's
Beating
Beautiful
Beetle's
Beryl
Betrayer's
Bipedal
Biting
Bitter
Blasting
Blazing
Blistering
Bloodthirsty
Blue
Blunt
Blurred
Boggart's
Bolting
Brawler's
Breathtaking
Brinerot
Brutal
Bubbling
Burning
Burnished
Butterfly's
Buttressed
Buzzing
Calming
Capricious
Captivating
Carapaced
Carved
Caster's
Catalysed
Catalyzing
Caustic
Cauterising
Cautious
Ceremonial
Cerulean
Chaining
Chalybeous
Champion's
Chanter's
Chaotic
Charged
Charging
Cheetah's
Chemist's
Chilled
Chilling
Citaqualotl's
Cleaving
Clouded
Cobalt
Combatant's
Conflagrating
Conqueror's
Corrupted
Coursing
Crab's
Crackling
Cremating
Crocodile's
Cruel
Cryomancer's
Cryomantic
Crystalline
Dancer's
Darkened
Dauntless
Dazzling
Deadly
Deafening
Deceiver's
Deflecting
Degenerative
Demonic
Devastating
Dictator's
Discharging
Dissipating
Djinn's
Dragon's
Dragonfly's
Duelist's
Eldritch
Electrocuting
Electromantic
Elephant's
Emanant
Emperor's
Empowered
Empowering
Encased
Energetic
Energising
Enlightened
Entombing
Enveloped
Ephemeral
Esh's
Ethereal
Evanescent
Evasive
Exarch's
Exemplary
Experimenter's
Exuberant
Fawn's
Fearless
Feasting
Fecund
Fencer's
Fencing
Feral
Fevered
Fierce
Filigree
Flame Spinner's
Flaming
Flanking
Flaring
Flawless
Flea's
Fleet
Fletcher's
Fortified
Freezing
Frigid
Frost Weaver's
Frosted
Frozen
Fuelling
Gazelle's
Gentian
Ghost's
Girded
Glaciated
Gladiator's
Gleaming
Glimmering
Glinting
Glittering
Glowing
Glyphic
Gremlin's
Grounded
Guatelitzi's
Hailing
Hale
Halting
Harming
Harmonic
Haunting
Healthy
Heated
Heavy
Hellion's
Hero's
Hexproof
Hexwarded
Hissing
Honed
Humming
Hummingbird's
Ibex's
Icy
Illusion's
Illusory
Impenetrable
Impervious
Impregnable
Incandescent
Incanter's
Incinerating
Incombustible
Incorporeal
Inculcated
Indomitable
Infernal
Infixed
Infused
Infusing
Ingrained
Inspirational
Inspired
Inspiring
Instilled
Interpermeated
Interpolated
Ionising
Jagged
Jinxing
Journeyman's
Judging
Lacquered
Lamprey's
Lava Caller's
Layered
Leadership
Legend's
Lethal
Lich's
Lively
Lobstered
Lunar
Mage's
Magician's
Magmatic
Magpie's
Malicious
Malignant
Mammoth's
Master's
Matatl's
Mazarine
Mercenary's
Merciless
Mirage's
Mirrored
Molten
Monk's
Mosquito's
Moth's
Multifarious
Mutewind
Muttering
Naga's
Nautilus's
Necromancer's
Nightmare's
Nihilist's
Occultist's
Opalescent
Otherworldly
Overlord's
Overpowering
Oyster's
Panicked
Paragon's
Parched
Parrying
Perandus'
Perpetual
Phantasm's
Phased
Piercing
Pirate's
Pixie's
Plated
Polar
Polished
Prime
Prior's
Professor's
Protective
Pulsing
Puncturing
Punishing
Pyroclastic
Pyromantic
Quintessential
Radiating
Ram's
Rapturous
Razor-sharp
Reanimator's
Reaver's
Recovering
Redblade
Reinforced
Remora's
Resistant
Resolute
Resonant
Resonating
Resplendent
Rhino's
Ribbed
Ripping
Robust
Rotund
Runic
Runner's
Rupturing
Sabotage
Sanguine
Sapphire
Sapping
Saturated
Savage
Scholar's
Scintillating
Scorching
Scrapper's
Screaming
Searing
Seething
Seraphim's
Serene
Serrated
Shade's
Shadowy
Shaman's
Sharpened
Sharpshooter's
Shielding
Shimmering
Shining
Shocking
Shrieking
Sinister
Sizzling
Skeletal
Slicing
Slithering
Smiting
Smoking
Smouldering
Snapping
Snowy
Solar
Soldier's
Sorcerer's
Sparking
Spectre's
Spiny
Spirited
Splitting
Sprinter's
Squire's
Stallion's
Stalwart
Stout
Striking
Strong-Willed
Studded
Subterranean
Summoner's
Sundering
Surgeon's
Surging
Tacati's
Tainted
Technical
Tempered
Tempest King's
Thaumaturgist's
The Shaper's
Thickened
Thirsty
Thorny
Thunder Lord's
Thundering
Thwarting
Titan's
Topotante's
Trapping
Tul's
Turncoat's
Twinned
Tyrannical
Unassailable
Undead
Unfaltering
Unleashed
Unreal
Unstoppable
Unwavering
Unworldly
Urchin's
Vaal
Vampire's
Vaporous
Vicious
Victor's
Vigorous
Vile
Virile
Vivacious
Vivid
Volcanic
Volleying
Wailing
Warding
Warlock's
Warrior's
Wasp's
Weaponmaster's
Weeping
Whispering
Wicked
Winterbringer's
Wizard's
Wraith's
Wright's
Xopec's
Xoph's
Youthful
Zaffre
Zana's
of Absorption
of Abuse
of Acclaim
of Acclimatisation
of Accuracy
of Adamantite Skin
of Adaption
of Adrenaline
of Amassment
of Anger
of Animation
of Annihilation
of Archaeology
of Archery
of Arcing
of Ashes
of Athletics
of Authority
of Balance
of Bameth
of Banishing
of Banishment
of Berserking
of Blasting
of Bleeding
of Blinding
of Bliss
of Bloodlines
of Burning
of Calamity
of Calm
of Celebration
of Champions
of Chilling
of Cinders
of Citaqualotl
of Coals
of Collecting
of Collision
of Combat
of Combusting
of Commanders
of Confidence
of Conflagrating
of Congealment
of Consumption
of Corundum Skin
of Crafting
of Craiceann
of Craving
of Cunning
of Curing
of Dampening
of Darting
of Dazing
of Deadliness
of Delaying
of Demolishing
of Desecration
of Destruction
of Dexterity
of Disaster
of Discharge
of Dishonour
of Distraction
of Dousing
of Drought
of Ease
of Efficiency
of Elation
of Electricity
of Elemental Weakness
of Embers
of Enchanting
of Endurance
of Enfeeblement
of Entropy
of Ephij
of Euphoria
of Eviction
of Excavation
of Excitement
of Exile
of Expertise
of Exposure
of Expulsion
of Extinguishing
of Exuberance
of Fame
of Farrul
of Fending
of Fenumus
of Ferocity
of Finesse
of Flames
of Flight
of Floe
of Focus
of Fog
of Fortitude
of Fracturing
of Freezing
of Frenzy
of Fury
of Gathering
of Giants
of Glaciation
of Gluttony
of Grandmastery
of Grounding
of Guarding
of Guatelitzi
of Haast
of Haemophilia
of Harm
of Havoc
of Haze
of Heat
of Hemomancy
of Hindering
of Hoarding
of Hordes
of Ice
of Immolation
of Impact
of Impotence
of Incision
of Infamy
of Instinct
of Insulating
of Insulation
of Intelligence
of Intercepting
of Ire
of Iron Skin
of Joy
of Legerdemain
of Light
of Lightning
of Lioneye
of Longevity
of Malevolence
of Malice
of Maneuvering
of Marshalling
of Mastery
of Matatl
of Menace
of Mending
of Miring
of Momentum
of Mysticism
of Needling
of Nimbleness
of Nirvana
of Nourishment
of Numbing
of Onslaught
of Opportunity
of Orchestration
of Order
of Osmosis
of Overflowing
of Penetrating
of Phasing
of Piercing
of Plunder
of Poisoning
of Potency
of Power
of Praxis
of Precision
of Preparation
of Prestidigitation
of Propulsion
of Puhuarte
of Radiance
of Rage
of Raiding
of Rallying
of Readiness
of Recovery
of Refilling
of Reflexes
of Regrowth
of Rejuvenation
of Rending
of Renown
of Resilience
of Resistance
of Restoration
of Retaliation
of Righteousness
of Rime
of Ruin
of Runes
of Rupturing
of Rust
of Saqawal
of Savouring
of Shaping
of Shelter
of Shining
of Shocking
of Sin
of Sipping
of Skill
of Skirmishing
of Slamming
of Sleet
of Smothering
of Snow
of Soaring
of Sortilege
of Sparks
of Spellcraft
of Spirit
of Staggering
of Stasis
of Static
of Staunching
of Steadiness
of Steel Skin
of Stifling
of Stinging
of Stone Skin
of Strength
of Stunning
of Success
of Tacati
of Talent
of Taunting
of Temporal Chains
of Thick Skin
of Tolerance
of Toughness
of Training
of Triumph
of Tzteosh
of Unholy Might
of Unmaking
of Unwavering
of Vampirism
of Variegation
of Venom
of Vibrance
of Victory
of Vivaciousness
of Voltage
of Vulnerability
of Walling
of Warding
of Warming
of Weaponcraft
of Weight
of Wounding
of Zeal
of the Apocalypse
of the Apt
of the Assassin
of the Augur
of the Bear
of the Beast
of the Blur
of the Boxer
of the Brawler
of the Brute
of the Cloud
of the Clouds
of the Combatant
of the Comet
of the Crystal
of the Deadeye
of the Dragon
of the Drake
of the Elder
of the Elements
of the Falcon
of the Fox
of the Furnace
of the Galaxy
of the Gale
of the Genius
of the Gladiator
of the Gods
of the Godslayer
of the Goliath
of the Gorilla
of the Guardian
of the Hearth
of the Heavens
of the Hydra
of the Ice
of the Inferno
of the Infinite
of the Inquisitor
of the Inuit
of the Jaguar
of the Kaleidoscope
of the Kiln
of the Leopard
of the Leviathan
of the Lightning
of the Lion
of the Lizard
of the Lost
of the Lynx
of the Maelstrom
of the Magma
of the Marksman
of the Meteor
of the Mongoose
of the Multiverse
of the Newt
of the Panther
of the Penguin
of the Phantom
of the Philosopher
of the Phoenix
of the Polar Bear
of the Polymath
of the Prism
of the Prodigy
of the Pugilist
of the Pupil
of the Raider
of the Rainbow
of the Ranger
of the Sage
of the Salamander
of the Savant
of the Seal
of the Sky
of the Slayer
of the Sniper
of the Span
of the Squall
of the Starfish
of the Storm
of the Student
of the Tempest
of the Thunderhead
of the Titan
of the Troll
of the Underground
of the Universe
of the Virtuoso
of the Volcano
of the Wall
of the Walrus
of the Whelpling
of the Wind
of the Worthy
of the Wrestler
of the Yeti
of the Zephyr

View File

@@ -39,7 +39,7 @@ namespace Filtration.Services
_mainWindow.Show();
await _updateService.CheckForUpdates();
await _updateService.CheckForUpdatesAsync();
}
private void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs e)

View File

@@ -1,9 +1,8 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Filtration.Common.Services;
using Filtration.Common.Utilities;
using Filtration.Properties;
namespace Filtration.Services
{
@@ -11,15 +10,13 @@ namespace Filtration.Services
{
IEnumerable<string> ItemBaseTypes { get; }
IEnumerable<string> ItemClasses { get; }
IEnumerable<string> ItemMods { get; }
}
internal class StaticDataService : IStaticDataService
{
private readonly IFileSystemService _fileSystemService;
public StaticDataService(IFileSystemService fileSystemService)
public StaticDataService()
{
_fileSystemService = fileSystemService;
PopulateStaticData();
}
@@ -27,34 +24,13 @@ namespace Filtration.Services
public IEnumerable<string> ItemClasses { get; private set; }
public IEnumerable<string> ItemMods { get; private set; }
private void PopulateStaticData()
{
var itemBaseTypesPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\Filtration\ItemBaseTypes.txt";
var itemClassesPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\Filtration\ItemClasses.txt";
string itemBaseTypes;
try
{
itemBaseTypes = _fileSystemService.ReadFileAsString(itemBaseTypesPath);
}
catch (Exception)
{
itemBaseTypes = string.Empty;
}
ItemBaseTypes = new LineReader(() => new StringReader(itemBaseTypes)).ToList();
string itemClasses;
try
{
itemClasses = _fileSystemService.ReadFileAsString(itemClassesPath);
}
catch (Exception)
{
itemClasses = string.Empty;
}
ItemClasses = new LineReader(() => new StringReader(itemClasses)).ToList();
ItemBaseTypes = new LineReader(() => new StringReader(Resources.ItemBaseTypes)).ToList();
ItemClasses = new LineReader(() => new StringReader(Resources.ItemClasses)).ToList();
ItemMods = new LineReader(() => new StringReader(Resources.ItemMods)).ToList();
}
}
}

View File

@@ -2,6 +2,7 @@
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Filtration.Enums;
using Filtration.Properties;
using NLog;
using Squirrel;
@@ -52,7 +53,7 @@ namespace Filtration.Services
string LatestReleaseVersion { get; }
Task CheckForUpdates();
Task CheckForUpdatesAsync();
Task DownloadUpdatesAsync();
@@ -63,13 +64,16 @@ namespace Filtration.Services
internal class UpdateService : IUpdateService
{
private readonly ISettingsService _settingsService;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private const string _localUpdatePath = @"C:\Repos\Filtration\Releases";
private readonly ISettingsService _settingsService;
private readonly UpdateSource _updateSource = UpdateSource.GitHub;
private ReleaseEntry _latestRelease;
private UpdateInfo _updates;
private bool _downloadPrereleaseUpdates;
private UpdateStatus _updateStatus;
public UpdateService(ISettingsService settingsService)
@@ -96,35 +100,42 @@ namespace Filtration.Services
public string LatestReleaseVersion { get; private set; }
public async Task CheckForUpdates()
public async Task CheckForUpdatesAsync()
{
if (UpdateStatus != UpdateStatus.NoUpdateAvailable)
{
throw new InvalidOperationException();
}
Logger.Debug("Checking for update...");
UpdateStatus = UpdateStatus.CheckingForUpdate;
try
{
bool downloadPrereleaseUpdates;
downloadPrereleaseUpdates = Settings.Default.DownloadPrereleaseUpdates;
_downloadPrereleaseUpdates = Settings.Default.DownloadPrereleaseUpdates;
#if DEBUG
downloadPrereleaseUpdates = true;
_downloadPrereleaseUpdates = true;
#endif
using (var mgr = await UpdateManager.GitHubUpdateManager("https://github.com/ben-wallis/Filtration", prerelease: downloadPrereleaseUpdates))
async Task CheckForUpdatesAsync(IUpdateManager updateManager)
{
_updates = await mgr.CheckForUpdate(progress: progress => UpdateProgressChanged?.Invoke(this, new UpdateProgressChangedEventArgs(progress)));
_updates = await updateManager.CheckForUpdate(progress: progress => UpdateProgressChanged?.Invoke(this, new UpdateProgressChangedEventArgs(progress)));
}
// Local file update source for testing
//using (var mgr = new UpdateManager(_localUpdatePath))
//{
// _updates = await mgr.CheckForUpdate(progress: progress => UpdateProgressChanged?.Invoke(this, new UpdateProgressChangedEventArgs(progress)));
//}
if (_updateSource == UpdateSource.GitHub)
{
using (var updateManager = await UpdateManager.GitHubUpdateManager("https://github.com/ben-wallis/Filtration", prerelease: _downloadPrereleaseUpdates))
{
await CheckForUpdatesAsync(updateManager);
}
}
else
{
using (var updateManager = new UpdateManager(_localUpdatePath))
{
await CheckForUpdatesAsync(updateManager);
}
}
}
catch (Exception e)
{
@@ -133,26 +144,13 @@ namespace Filtration.Services
return;
}
if (_updates.ReleasesToApply.Any())
{
_latestRelease = _updates.ReleasesToApply.OrderBy(x => x.Version).Last();
LatestReleaseVersion = _latestRelease.Version.ToString();
Logger.Debug($"Update found ({LatestReleaseVersion}), fetching release notes...");
try
{
var releaseNotes = _latestRelease.GetReleaseNotes(_localUpdatePath);
LatestReleaseNotes = ProcessReleaseNotes(releaseNotes);
}
catch (Exception e)
{
Logger.Error(e);
UpdateStatus = UpdateStatus.Error;
return;
}
Logger.Debug($"Update found ({LatestReleaseVersion})");
UpdateStatus = UpdateStatus.UpdateAvailable;
}
else
@@ -162,7 +160,7 @@ namespace Filtration.Services
}
}
private string ProcessReleaseNotes(string rawReleaseNotes)
private static string ProcessReleaseNotes(string rawReleaseNotes)
{
var regex = new Regex(@"<!\[CDATA\[(.*)]]>", RegexOptions.Singleline);
var matches = regex.Match(rawReleaseNotes);
@@ -184,11 +182,31 @@ namespace Filtration.Services
UpdateStatus = UpdateStatus.Downloading;
async Task DownloadUpdatesAsync(IUpdateManager updateManager)
{
Logger.Debug("Downloading update...");
await updateManager.DownloadReleases(_updates.ReleasesToApply, OnProgressChanged);
Logger.Debug("Fetching release notes...");
var releaseNotes = _updates.FetchReleaseNotes();
LatestReleaseNotes = ProcessReleaseNotes(releaseNotes[_latestRelease]);
}
try
{
using (var updateManager = new UpdateManager(_localUpdatePath))
if (_updateSource == UpdateSource.GitHub)
{
await updateManager.DownloadReleases(_updates.ReleasesToApply, OnProgressChanged);
using (var updateManager = await UpdateManager.GitHubUpdateManager("https://github.com/ben-wallis/Filtration", prerelease: _downloadPrereleaseUpdates))
{
await DownloadUpdatesAsync(updateManager);
}
}
else
{
using (var updateManager = new UpdateManager(_localUpdatePath))
{
await DownloadUpdatesAsync(updateManager);
}
}
}
catch (Exception e)
@@ -215,11 +233,22 @@ namespace Filtration.Services
// wipes out user settings due to the application directory changing with each update
_settingsService.BackupSettings();
Logger.Debug("Applying update...");
try
{
using (var updateManager = new UpdateManager(_localUpdatePath))
if (_updateSource == UpdateSource.GitHub)
{
await updateManager.ApplyReleases(_updates, OnProgressChanged);
using (var mgr = await UpdateManager.GitHubUpdateManager("https://github.com/ben-wallis/Filtration", prerelease: _downloadPrereleaseUpdates))
{
await mgr.ApplyReleases(_updates, OnProgressChanged);
}
}
else
{
using (var updateManager = new UpdateManager(_localUpdatePath))
{
await updateManager.ApplyReleases(_updates, OnProgressChanged);
}
}
}
catch (Exception e)
@@ -229,6 +258,7 @@ namespace Filtration.Services
return;
}
Logger.Debug("Update complete");
UpdateStatus = UpdateStatus.UpdateComplete;
}

View File

@@ -78,7 +78,7 @@
<!-- Explicit Mods Template -->
<DataTemplate DataType="{x:Type blockItemTypes:HasExplicitModBlockItem}">
<userControls:EditableListBoxControl Margin="5,5,5,5" ItemsSource="{Binding Items}" />
<userControls:EditableListBoxControl Margin="5,5,5,5" ItemsSource="{Binding Items}" AutoCompleteItemsSource="{Binding ElementName=TopLevelGrid, Path=DataContext.AutocompleteItemMods}" />
</DataTemplate>
<!-- Socket Groups Template -->
@@ -97,14 +97,15 @@
DisplayMemberPath="Description"
SelectedValue="{Binding Color}"
SelectedValuePath="Value" />
<userControls:ThemeComponentSelectionControl ThemeComponent="{Binding ThemeComponent}" Margin="0,2,0,0">
<!-- Disabled until there is a solution to GitHub Issue #68 (certain block items do not support trailing comments) -->
<!--<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>
</userControls:ThemeComponentSelectionControl>-->
</StackPanel>
</DataTemplate>
@@ -133,14 +134,15 @@
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<xctk:ShortUpDown Grid.Column="0" Value="{Binding Value}" Minimum="{Binding Minimum}" Maximum="{Binding Maximum}" Margin="0,0,10,0" />
<userControls:ThemeComponentSelectionControl Grid.Column="1" ThemeComponent="{Binding ThemeComponent}">
<!-- Disabled until there is a solution to GitHub Issue #68 (certain block items do not support trailing comments) -->
<!--<userControls:ThemeComponentSelectionControl Grid.Column="1" ThemeComponent="{Binding ThemeComponent}">
<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>
</userControls:ThemeComponentSelectionControl>-->
</Grid>
</DataTemplate>
@@ -197,14 +199,15 @@
DisplayMemberPath="Description"
SelectedValue="{Binding Shape}"
SelectedValuePath="Value" />
<userControls:ThemeComponentSelectionControl ThemeComponent="{Binding ThemeComponent}" Margin="0,2,0,0">
<!-- Disabled until there is a solution to GitHub Issue #68 (certain block items do not support trailing comments) -->
<!--<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>
</userControls:ThemeComponentSelectionControl>-->
</StackPanel>
</DataTemplate>

View File

@@ -15,6 +15,7 @@ using GalaSoft.MvvmLight.CommandWpf;
using GalaSoft.MvvmLight.Messaging;
using Microsoft.Win32;
using Xceed.Wpf.Toolkit;
using static System.Int32;
namespace Filtration.ViewModels
{
@@ -59,8 +60,7 @@ namespace Filtration.ViewModels
public override void Initialise(IItemFilterBlockBase itemFilterBlockBase, IItemFilterScriptViewModel parentScriptViewModel)
{
var itemFilterBlock = itemFilterBlockBase as IItemFilterBlock;
if (itemFilterBlock == null || parentScriptViewModel == null)
if (!(itemFilterBlockBase is IItemFilterBlock itemFilterBlock) || parentScriptViewModel == null)
{
throw new ArgumentNullException(nameof(itemFilterBlock));
}
@@ -136,7 +136,7 @@ namespace Filtration.ViewModels
public bool AudioVisualBlockItemsGridVisible
{
get { return _audioVisualBlockItemsGridVisible; }
get => _audioVisualBlockItemsGridVisible;
set
{
_audioVisualBlockItemsGridVisible = value;
@@ -150,7 +150,7 @@ namespace Filtration.ViewModels
public bool DisplaySettingsPopupOpen
{
get { return _displaySettingsPopupOpen; }
get => _displaySettingsPopupOpen;
set
{
_displaySettingsPopupOpen = value;
@@ -162,6 +162,8 @@ namespace Filtration.ViewModels
public IEnumerable<string> AutoCompleteItemBaseTypes => _staticDataService.ItemBaseTypes;
public IEnumerable<string> AutocompleteItemMods => _staticDataService.ItemMods;
public List<Type> BlockItemTypesAvailable => new List<Type>
{
typeof (ItemLevelBlockItem),
@@ -203,7 +205,7 @@ namespace Filtration.ViewModels
public bool BlockEnabled
{
get { return Block.Enabled; }
get => Block.Enabled;
set
{
if (Block.Enabled != value)
@@ -217,10 +219,7 @@ namespace Filtration.ViewModels
public string BlockDescription
{
get
{
return Block.Description;
}
get => Block.Description;
set
{
if (Block.Description != value)
@@ -267,8 +266,7 @@ namespace Filtration.ViewModels
newBlockItem.PropertyChanged += OnBlockItemChanged;
var customSoundBlockItem = newBlockItem as CustomSoundBlockItem;
if(customSoundBlockItem != null && _parentScriptViewModel.CustomSoundsAvailable.Count > 0)
if(newBlockItem is CustomSoundBlockItem customSoundBlockItem && _parentScriptViewModel.CustomSoundsAvailable.Count > 0)
{
customSoundBlockItem.Value = _parentScriptViewModel.CustomSoundsAvailable[0];
}
@@ -352,7 +350,7 @@ namespace Filtration.ViewModels
var replaceColorsWindow = new ReplaceColorsWindow { DataContext = _replaceColorsViewModel };
replaceColorsWindow.ShowDialog();
}
private bool AddBlockItemAllowed(Type type)
{
var blockItem = (IItemFilterBlockItem)Activator.CreateInstance(type);
@@ -362,16 +360,14 @@ namespace Filtration.ViewModels
private string ComputeFilePartFromNumber(string identifier)
{
if (Int32.TryParse(identifier, out int x))
if (TryParse(identifier, out int x))
{
if (x <= 9)
{
return "AlertSound_0" + x + ".mp3";
}
else
{
return "AlertSound_" + x + ".mp3";
}
return "AlertSound_" + x + ".mp3";
}
return "";
@@ -429,11 +425,9 @@ namespace Filtration.ViewModels
{
return;
}
else
{
_mediaPlayer.Open(new Uri(prefix + filePart, UriKind.Relative));
_mediaPlayer.Play();
}
_mediaPlayer.Open(new Uri(prefix + filePart, UriKind.Relative));
_mediaPlayer.Play();
}
private void OnPlayPositionalSoundCommand()
@@ -446,11 +440,9 @@ namespace Filtration.ViewModels
{
return;
}
else
{
_mediaPlayer.Open(new Uri(prefix + filePart, UriKind.Relative));
_mediaPlayer.Play();
}
_mediaPlayer.Open(new Uri(prefix + filePart, UriKind.Relative));
_mediaPlayer.Play();
}
private void OnBlockEnabledStatusChanged(object sender, EventArgs e)
@@ -460,13 +452,12 @@ namespace Filtration.ViewModels
private void OnBlockItemChanged(object sender, EventArgs e)
{
var itemFilterBlockItem = sender as IItemFilterBlockItem;
if ( itemFilterBlockItem != null && itemFilterBlockItem.IsDirty)
if (sender is IItemFilterBlockItem itemFilterBlockItem && itemFilterBlockItem.IsDirty)
{
IsDirty = true;
}
var customSoundBlockItem = sender as CustomSoundBlockItem;
if (customSoundBlockItem != null)
if (sender is CustomSoundBlockItem customSoundBlockItem)
{
if (!string.IsNullOrWhiteSpace(customSoundBlockItem.Value) && _parentScriptViewModel.CustomSoundsAvailable.IndexOf(customSoundBlockItem.Value) < 0)
{
@@ -505,12 +496,11 @@ namespace Filtration.ViewModels
private void OnCustomSoundFileDialog()
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.DefaultExt = ".mp3";
var poePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).ToString() + @"\My Games\Path of Exile\";
OpenFileDialog fileDialog = new OpenFileDialog {DefaultExt = ".mp3"};
var poePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\My Games\Path of Exile\";
fileDialog.InitialDirectory = poePath;
Nullable<bool> result = fileDialog.ShowDialog();
bool? result = fileDialog.ShowDialog();
if (result == true)
{
var fileName = fileDialog.FileName;
@@ -531,7 +521,7 @@ namespace Filtration.ViewModels
private void OnPlayCustomSoundCommand()
{
var poePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).ToString() + @"\My Games\Path of Exile\";
var poePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\My Games\Path of Exile\";
var identifier = BlockItems.OfType<CustomSoundBlockItem>().First().Value;
if(!Path.IsPathRooted(identifier))
@@ -567,9 +557,11 @@ namespace Filtration.ViewModels
var newGroup = new ItemFilterBlockGroup(BlockGroupSearch, null, AdvancedBlockGroup, false);
if (baseBlock.BlockGroup == null)
{
baseBlock.BlockGroup = new ItemFilterBlockGroup("", null, false, true);
baseBlock.BlockGroup.IsShowChecked = baseBlock.Action == BlockAction.Show;
baseBlock.BlockGroup.IsEnableChecked = BlockEnabled;
baseBlock.BlockGroup = new ItemFilterBlockGroup("", null, false, true)
{
IsShowChecked = baseBlock.Action == BlockAction.Show,
IsEnableChecked = BlockEnabled
};
}
newGroup.AddOrJoinBlockGroup(baseBlock.BlockGroup);
blockToAdd.AddOrJoinBlockGroup(newGroup);
@@ -609,8 +601,7 @@ namespace Filtration.ViewModels
private void UpdateBlockGroups()
{
var baseBlock = Block as ItemFilterBlock;
if (baseBlock == null)
if (!(Block is ItemFilterBlock baseBlock))
return;
var currentGroup = baseBlock.BlockGroup;
@@ -636,7 +627,7 @@ namespace Filtration.ViewModels
BlockGroups = new ObservableCollection<ItemFilterBlockGroup>(groupList);
BlockGroupSuggestions = new ObservableCollection<string>();
foreach(var child in topGroup.ChildGroups)
{
if(!child.IsLeafNode)
@@ -644,7 +635,7 @@ namespace Filtration.ViewModels
BlockGroupSuggestions.Add(child.GroupName);
}
}
RaisePropertyChanged(nameof(BlockGroups));
RaisePropertyChanged(nameof(BlockGroupSuggestions));
}

View File

@@ -143,6 +143,7 @@ namespace Filtration.ViewModels
{
RaisePropertyChanged(nameof(SelectedBlockViewModels));
RaisePropertyChanged(nameof(LastSelectedBlockViewModel));
Messenger.Default.Send(new NotificationMessage("LastSelectedBlockChanged"));
};
_lastAddedBlocks = new List<IItemFilterBlockViewModelBase>();
_showAdvanced = Settings.Default.ShowAdvanced;

View File

@@ -1,4 +1,5 @@
using System;
using System.Linq;
using System.Windows.Media.Imaging;
using Filtration.Parser.Interface.Services;
using GalaSoft.MvvmLight.Messaging;
@@ -28,19 +29,10 @@ namespace Filtration.ViewModels.ToolPanes
Messenger.Default.Register<NotificationMessage>(this, message =>
{
switch (message.Notification)
{
case "LastSelectedBlockChanged":
{
OnLastSelectedBlockChanged(this, EventArgs.Empty);
break;
}
case "ActiveDocumentChanged":
{
OnLastSelectedBlockChanged(this, EventArgs.Empty);
break;
}
}
if (message.Notification == "LastSelectedBlockChanged")
OnLastSelectedBlockChanged(this, EventArgs.Empty);
else if (message.Notification == "ActiveDocumentChanged")
OnLastSelectedBlockChanged(this, EventArgs.Empty);
});
}
@@ -49,7 +41,7 @@ namespace Filtration.ViewModels.ToolPanes
public string PreviewText
{
get { return _previewText; }
get => _previewText;
private set
{
_previewText = value;
@@ -64,15 +56,17 @@ namespace Filtration.ViewModels.ToolPanes
private void OnLastSelectedBlockChanged(object sender, EventArgs e)
{
if (AvalonDockWorkspaceViewModel.ActiveScriptViewModel?.LastSelectedBlockViewModel == null)
if (AvalonDockWorkspaceViewModel.ActiveScriptViewModel?.SelectedBlockViewModels == null ||
AvalonDockWorkspaceViewModel.ActiveScriptViewModel.SelectedBlockViewModels.Count == 0 ||
AvalonDockWorkspaceViewModel.ActiveScriptViewModel.SelectedBlockViewModels.FirstOrDefault() == null)
{
PreviewText = string.Empty;
return;
}
PreviewText =
_itemFilterBlockTranslator.TranslateItemFilterBlockBaseToString(
AvalonDockWorkspaceViewModel.ActiveScriptViewModel.LastSelectedBlockViewModel.BaseBlock);
PreviewText = AvalonDockWorkspaceViewModel.ActiveScriptViewModel.SelectedBlockViewModels
.Select(s => _itemFilterBlockTranslator.TranslateItemFilterBlockBaseToString(s.BaseBlock))
.Aggregate((prev, curr) => prev + Environment.NewLine + Environment.NewLine + curr);
}
}
}

View File

@@ -50,7 +50,7 @@ namespace Filtration.ViewModels
updateService.UpdateProgressChanged += UpdateServiceOnUpdateProgressChanged;
updateService.UpdateStatusChanged += UpdateServiceOnUpdateStatusChanged;
HideUpdateWindowCommand = new RelayCommand(OnHideUpdateWindowCommand, () => UpdateStatus == UpdateStatus.UpdateAvailable || UpdateStatus == UpdateStatus.Error);
NextStepCommand = new RelayCommand(async () => await OnNextStepCommandAsync(), () => NextStepCommandEnabled);
@@ -100,39 +100,39 @@ namespace Filtration.ViewModels
}
private bool NextStepCommandEnabled => UpdateStatus == UpdateStatus.UpdateAvailable || UpdateStatus == UpdateStatus.ReadyToApplyUpdate || UpdateStatus == UpdateStatus.UpdateComplete;
private async Task OnNextStepCommandAsync()
{
switch (UpdateStatus)
{
case UpdateStatus.UpdateAvailable:
{
await _updateService.DownloadUpdatesAsync();
break;
}
{
await _updateService.DownloadUpdatesAsync();
break;
}
case UpdateStatus.ReadyToApplyUpdate:
{
if (!_updateTabShown)
{
// When the update has downloaded and is ready to apply, clicking the button
// closes the update popup and shows the update tab.
_avalonDockWorkspaceViewModel.AddDocument(this);
Visible = false;
_updateTabShown = true;
NextStepButtonText = "Update";
}
else
{
await _updateService.ApplyUpdatesAsync();
}
if (!_updateTabShown)
{
// When the update has downloaded and is ready to apply, clicking the button
// closes the update popup and shows the update tab.
_avalonDockWorkspaceViewModel.AddDocument(this);
Visible = false;
_updateTabShown = true;
NextStepButtonText = "Update";
}
else
{
await _updateService.ApplyUpdatesAsync();
}
break;
}
break;
}
case UpdateStatus.UpdateComplete:
{
_updateService.RestartAfterUpdate();
break;
}
{
_updateService.RestartAfterUpdate();
break;
}
}
}
@@ -144,7 +144,6 @@ namespace Filtration.ViewModels
{
Visible = true;
NextStepButtonText = "Download";
RaisePropertyChanged(nameof(ReleaseNotes));
RaisePropertyChanged(nameof(Version));
break;
}
@@ -156,6 +155,7 @@ namespace Filtration.ViewModels
}
case UpdateStatus.ReadyToApplyUpdate:
{
RaisePropertyChanged(nameof(ReleaseNotes));
NextStepButtonText = "Update Ready";
break;
}

View File

@@ -8,6 +8,6 @@
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBlock Text="{Binding PreviewText}" ToolTip="{Binding PreviewText}" Margin="10" />
<TextBox IsReadOnly="True" Text="{Binding PreviewText, Mode=OneWay}" ToolTip="{Binding PreviewText}" Padding="5" Background="Transparent" BorderThickness="0" />
</Grid>
</UserControl>

View File

@@ -2,10 +2,9 @@
Filtration is an editor for Path of Exile item filter scripts.
## Current Release (Released 2018-08-30)
<b>Installer</b> <a href="https://github.com/ben-wallis/Filtration/releases/download/0.19/filtration_0.19_setup.exe">filtration_0.19_setup.exe</a>
<b>Zip File</b> <a href="https://github.com/ben-wallis/Filtration/releases/download/0.19/filtration_0.19.zip">filtration_0.19.zip</a>
## Current Release (Released 2018-09-30)
<b>Installer</b><br>
<a href="https://github.com/ben-wallis/Filtration/releases/download/1.0.2/Setup.exe">Setup.exe</a>
## System Requirements
Filtration requires .NET Framework 4.6.1 installed.
@@ -25,10 +24,10 @@ If you'd like to make your script fully compatible with Filtration, please take
## Screenshots
##### Main Window
<img src="http://i.imgur.com/eAsMoSo.png" />
<img src="https://i.imgur.com/d3tKEab.png" />
##### Theme Editor
<img src="http://i.imgur.com/FJWJknO.png" />
<img src="https://i.imgur.com/Pi9wds1.png" />
## Contact
You can find me on irc.freenode.net in #filtration