From 86dc03f4ff198ec749f6f62a3dd5d55f824ce7fb Mon Sep 17 00:00:00 2001 From: Ben Wallis Date: Sun, 31 Jan 2016 10:51:53 +0000 Subject: [PATCH] Various refactorings to support ItemFilterPreview --- Filtration.Common/Filtration.Common.csproj | 1 + .../Utilities/LineReader.cs | 2 +- .../Filtration.ItemFilterPreview.Tests.csproj | 13 ++- .../Services/TestItemBlockItemMatcher.cs | 8 +- .../Services/TestItemFilterProcessor.cs | 13 +-- .../Services/serializationtest.cs | 47 +++++++++ Filtration.ItemFilterPreview.Tests/app.config | 2 +- .../packages.config | 3 +- Filtration.ItemFilterPreview/App.xaml | 3 +- Filtration.ItemFilterPreview/App.xaml.cs | 16 +++ .../Filtration.ItemFilterPreview.csproj | 52 +++++++++- Filtration.ItemFilterPreview/MainWindow.xaml | 28 ----- .../Model/FilteredItem.cs | 45 ++++++++ Filtration.ItemFilterPreview/Model/Item.cs | 11 ++ .../Model/ItemCollection.cs | 9 -- .../Resources/Fontin-SmallCaps.ttf | Bin 0 -> 29816 bytes .../Services/ItemFilterProcessor.cs | 16 +-- .../DesignTime/DesignTimeItemControl.cs | 12 +++ .../UserControls/ItemControl.xaml | 42 ++++++++ .../ViewModels/LootExplosionViewModel.cs | 10 ++ .../Views/LootExplosionView.xaml | 13 +++ .../LootExplosionView.xaml.cs} | 8 +- .../WindsorInstallers/ViewModelsInstaller.cs | 18 ++++ .../WindsorInstallers/ViewsInstaller.cs | 18 ++++ Filtration.ItemFilterPreview/packages.config | 4 +- Filtration.ObjectModel/Enums/ItemRarity.cs | 2 + .../Enums/PathOfExileNamedColor.cs | 36 +++++++ Filtration.ObjectModel/Enums/SocketColor.cs | 5 +- .../Extensions/ItemRarityExtensions.cs | 39 +++++++ .../Filtration.ObjectModel.csproj | 3 + Filtration.ObjectModel/ItemFilterBlock.cs | 51 ++++++++++ .../PathOfExileNamedColors.cs | 44 ++++++++ Filtration.ObjectModel/Socket.cs | 8 +- Filtration.ObjectModel/SocketGroup.cs | 6 ++ Filtration.Tests/Filtration.Tests.csproj | 8 +- Filtration.Tests/app.config | 2 +- Filtration.Tests/packages.config | 2 +- .../Filtration.ThemeEditor.csproj | 28 ++--- Filtration.ThemeEditor/packages.config | 4 +- Filtration.sln.DotSettings | 4 +- Filtration/App.config | 2 +- Filtration/App.xaml.cs | 1 + Filtration/Filtration.csproj | 41 ++++---- Filtration/NLog.xsd | 96 ++++++++++-------- Filtration/Services/StaticDataService.cs | 1 + .../Translators/ItemFilterBlockTranslator.cs | 2 +- .../Translators/ItemFilterScriptTranslator.cs | 5 +- .../ViewModels/ItemFilterBlockViewModel.cs | 39 ++----- Filtration/packages.config | 12 +-- 49 files changed, 623 insertions(+), 212 deletions(-) rename {Filtration => Filtration.Common}/Utilities/LineReader.cs (98%) create mode 100644 Filtration.ItemFilterPreview.Tests/Services/serializationtest.cs delete mode 100644 Filtration.ItemFilterPreview/MainWindow.xaml create mode 100644 Filtration.ItemFilterPreview/Model/FilteredItem.cs delete mode 100644 Filtration.ItemFilterPreview/Model/ItemCollection.cs create mode 100644 Filtration.ItemFilterPreview/Resources/Fontin-SmallCaps.ttf create mode 100644 Filtration.ItemFilterPreview/UserControls/DesignTime/DesignTimeItemControl.cs create mode 100644 Filtration.ItemFilterPreview/UserControls/ItemControl.xaml create mode 100644 Filtration.ItemFilterPreview/ViewModels/LootExplosionViewModel.cs create mode 100644 Filtration.ItemFilterPreview/Views/LootExplosionView.xaml rename Filtration.ItemFilterPreview/{MainWindow.xaml.cs => Views/LootExplosionView.xaml.cs} (72%) create mode 100644 Filtration.ItemFilterPreview/WindsorInstallers/ViewModelsInstaller.cs create mode 100644 Filtration.ItemFilterPreview/WindsorInstallers/ViewsInstaller.cs create mode 100644 Filtration.ObjectModel/Enums/PathOfExileNamedColor.cs create mode 100644 Filtration.ObjectModel/Extensions/ItemRarityExtensions.cs create mode 100644 Filtration.ObjectModel/PathOfExileNamedColors.cs diff --git a/Filtration.Common/Filtration.Common.csproj b/Filtration.Common/Filtration.Common.csproj index 115f66b..dd810f2 100644 --- a/Filtration.Common/Filtration.Common.csproj +++ b/Filtration.Common/Filtration.Common.csproj @@ -79,6 +79,7 @@ + diff --git a/Filtration/Utilities/LineReader.cs b/Filtration.Common/Utilities/LineReader.cs similarity index 98% rename from Filtration/Utilities/LineReader.cs rename to Filtration.Common/Utilities/LineReader.cs index cb68df3..94dea54 100644 --- a/Filtration/Utilities/LineReader.cs +++ b/Filtration.Common/Utilities/LineReader.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Text; -namespace Filtration.Utilities +namespace Filtration.Common.Utilities { public sealed class LineReader : IEnumerable diff --git a/Filtration.ItemFilterPreview.Tests/Filtration.ItemFilterPreview.Tests.csproj b/Filtration.ItemFilterPreview.Tests/Filtration.ItemFilterPreview.Tests.csproj index 1887d0e..280602d 100644 --- a/Filtration.ItemFilterPreview.Tests/Filtration.ItemFilterPreview.Tests.csproj +++ b/Filtration.ItemFilterPreview.Tests/Filtration.ItemFilterPreview.Tests.csproj @@ -42,12 +42,12 @@ 4 - - ..\packages\FluentAssertions.4.1.1\lib\net45\FluentAssertions.dll + + ..\packages\FluentAssertions.4.2.1\lib\net45\FluentAssertions.dll True - - ..\packages\FluentAssertions.4.1.1\lib\net45\FluentAssertions.Core.dll + + ..\packages\FluentAssertions.4.2.1\lib\net45\FluentAssertions.Core.dll True @@ -61,6 +61,10 @@ + + ..\packages\YamlDotNet.3.7.0\lib\net35\YamlDotNet.dll + True + @@ -74,6 +78,7 @@ True Resources.resx + diff --git a/Filtration.ItemFilterPreview.Tests/Services/TestItemBlockItemMatcher.cs b/Filtration.ItemFilterPreview.Tests/Services/TestItemBlockItemMatcher.cs index 98c90fd..15c6929 100644 --- a/Filtration.ItemFilterPreview.Tests/Services/TestItemBlockItemMatcher.cs +++ b/Filtration.ItemFilterPreview.Tests/Services/TestItemBlockItemMatcher.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; using Filtration.ItemFilterPreview.Model; using Filtration.ItemFilterPreview.Services; using Filtration.ObjectModel; diff --git a/Filtration.ItemFilterPreview.Tests/Services/TestItemFilterProcessor.cs b/Filtration.ItemFilterPreview.Tests/Services/TestItemFilterProcessor.cs index 95d5f71..b6be80c 100644 --- a/Filtration.ItemFilterPreview.Tests/Services/TestItemFilterProcessor.cs +++ b/Filtration.ItemFilterPreview.Tests/Services/TestItemFilterProcessor.cs @@ -1,13 +1,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; -using System.Resources; -using System.Runtime.Versioning; using Filtration.ItemFilterPreview.Model; using Filtration.ItemFilterPreview.Services; using Filtration.ItemFilterPreview.Tests.Properties; using Filtration.ObjectModel; -using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.Enums; using Filtration.Translators; @@ -45,11 +42,11 @@ namespace Filtration.ItemFilterPreview.Tests.Services //Assert _testUtility.MockBlockItemMatcher.Verify(); - Assert.AreEqual(testInputBlock, result[testInputItem]); + Assert.AreEqual(testInputBlock, result.First(r => r.ItemFilterBlock == testInputBlock).ItemFilterBlock); } [Test] - public void ProcessItemsAgainstItemFilterScript_DoesNotMatch_ReturnsFalse() + public void ProcessItemsAgainstItemFilterScript_DoesNotMatch_ResultHasNullItemFilterBlock() { //Arrange var testInputItem = Mock.Of(); @@ -66,7 +63,7 @@ namespace Filtration.ItemFilterPreview.Tests.Services //Assert _testUtility.MockBlockItemMatcher.Verify(); - Assert.AreEqual(null, result[testInputItem]); + Assert.AreEqual(null, result.First(r => r.Item == testInputItem).ItemFilterBlock); } [Test] @@ -96,7 +93,7 @@ namespace Filtration.ItemFilterPreview.Tests.Services var result = itemFilterProcessor.ProcessItemsAgainstItemFilterScript(script, new List { testInputItem }); //Assert - Assert.AreEqual("Wands", result.Values.First().BlockItems.OfType().First().Items.First()); + Assert.AreEqual("Wands", result.First().ItemFilterBlock.BlockItems.OfType().First().Items.First()); } [Test] @@ -228,7 +225,7 @@ namespace Filtration.ItemFilterPreview.Tests.Services var result = itemFilterProcessor.ProcessItemsAgainstItemFilterScript(script, testInputItems); //Assert - Assert.AreEqual("Wands", result.Values.First().BlockItems.OfType().First().Items.First()); + Assert.AreEqual("Wands", result.First().ItemFilterBlock.BlockItems.OfType().First().Items.First()); } private class ItemFilterProcessorTestUtility diff --git a/Filtration.ItemFilterPreview.Tests/Services/serializationtest.cs b/Filtration.ItemFilterPreview.Tests/Services/serializationtest.cs new file mode 100644 index 0000000..35e87a7 --- /dev/null +++ b/Filtration.ItemFilterPreview.Tests/Services/serializationtest.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml; +using System.Xml.Serialization; +using Filtration.ItemFilterPreview.Model; +using Filtration.ObjectModel; +using Filtration.ObjectModel.Enums; +using NUnit.Framework; +using YamlDotNet.Serialization; + +namespace Filtration.ItemFilterPreview.Tests.Services +{ + class serializationtest + { + [Test] + public void test_serialization() + { + //Arrange + var item = new Item + { + ItemClass = "Test Class", + BaseType = "Test Base Type", + DropLevel = 54, + Height = 2, + Width = 2, + ItemLevel = 50, + ItemRarity = ItemRarity.Rare, + SocketGroups = new List {new SocketGroup(new List {new Socket(SocketColor.Red), new Socket(SocketColor.Blue), new Socket(SocketColor.White)}, true)}, + Quality = 12 + }; + + //Act + + var serializer = new XmlSerializer(item.GetType()); + var output = string.Empty; + using (var textWriter = new StringWriter()) + { + serializer.Serialize(textWriter, item); + output = textWriter.ToString(); + } + + var x = 2; + //Assert + } + } +} diff --git a/Filtration.ItemFilterPreview.Tests/app.config b/Filtration.ItemFilterPreview.Tests/app.config index 354702a..8362b90 100644 --- a/Filtration.ItemFilterPreview.Tests/app.config +++ b/Filtration.ItemFilterPreview.Tests/app.config @@ -4,7 +4,7 @@ - + diff --git a/Filtration.ItemFilterPreview.Tests/packages.config b/Filtration.ItemFilterPreview.Tests/packages.config index b43dde7..9adfa15 100644 --- a/Filtration.ItemFilterPreview.Tests/packages.config +++ b/Filtration.ItemFilterPreview.Tests/packages.config @@ -1,6 +1,7 @@  - + + \ No newline at end of file diff --git a/Filtration.ItemFilterPreview/App.xaml b/Filtration.ItemFilterPreview/App.xaml index cb2d0cd..aeb8145 100644 --- a/Filtration.ItemFilterPreview/App.xaml +++ b/Filtration.ItemFilterPreview/App.xaml @@ -1,8 +1,7 @@  + Startup="Application_Startup"> diff --git a/Filtration.ItemFilterPreview/App.xaml.cs b/Filtration.ItemFilterPreview/App.xaml.cs index 496477f..c1e7f86 100644 --- a/Filtration.ItemFilterPreview/App.xaml.cs +++ b/Filtration.ItemFilterPreview/App.xaml.cs @@ -1,8 +1,24 @@ using System.Windows; +using Castle.Facilities.TypedFactory; +using Castle.Windsor; +using Castle.Windsor.Installer; +using Filtration.ItemFilterPreview.Views; namespace Filtration.ItemFilterPreview { public partial class App : Application { + private IWindsorContainer _container; + + private void Application_Startup(object sender, StartupEventArgs e) + { + _container = new WindsorContainer(); + + _container.AddFacility(); + _container.Install(FromAssembly.InThisApplication()); + + var mainWindow = _container.Resolve(); + mainWindow.Show(); + } } } diff --git a/Filtration.ItemFilterPreview/Filtration.ItemFilterPreview.csproj b/Filtration.ItemFilterPreview/Filtration.ItemFilterPreview.csproj index 88a29c1..a7e83eb 100644 --- a/Filtration.ItemFilterPreview/Filtration.ItemFilterPreview.csproj +++ b/Filtration.ItemFilterPreview/Filtration.ItemFilterPreview.csproj @@ -37,15 +37,35 @@ - ..\packages\Castle.Core.3.3.0\lib\net45\Castle.Core.dll + ..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll True ..\packages\Castle.Windsor.3.3.0\lib\net45\Castle.Windsor.dll True + + ..\packages\MvvmLightLibs.5.2.0.0\lib\net45\GalaSoft.MvvmLight.dll + True + + + ..\packages\MvvmLightLibs.5.2.0.0\lib\net45\GalaSoft.MvvmLight.Extras.dll + True + + + ..\packages\MvvmLightLibs.5.2.0.0\lib\net45\GalaSoft.MvvmLight.Platform.dll + True + + + ..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll + True + + + ..\packages\MvvmLightLibs.5.2.0.0\lib\net45\System.Windows.Interactivity.dll + True + @@ -64,15 +84,34 @@ MSBuild:Compile Designer + - + + + ItemControl.xaml + ItemSocketsControl.xaml + + + + LootExplosionView.xaml + + + - + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + MSBuild:Compile Designer @@ -80,7 +119,7 @@ App.xaml Code - + MainWindow.xaml Code @@ -113,11 +152,16 @@ Settings.Designer.cs + + + {8cb44f28-2956-4c2a-9314-72727262edd4} + Filtration.Common + {4aac3beb-1dc1-483e-9d11-0e9334e80227} Filtration.ObjectModel diff --git a/Filtration.ItemFilterPreview/MainWindow.xaml b/Filtration.ItemFilterPreview/MainWindow.xaml deleted file mode 100644 index febba74..0000000 --- a/Filtration.ItemFilterPreview/MainWindow.xaml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Filtration.ItemFilterPreview/Model/FilteredItem.cs b/Filtration.ItemFilterPreview/Model/FilteredItem.cs new file mode 100644 index 0000000..bb970fd --- /dev/null +++ b/Filtration.ItemFilterPreview/Model/FilteredItem.cs @@ -0,0 +1,45 @@ +using System.Windows.Media; +using Filtration.ObjectModel; +using Filtration.ObjectModel.BlockItemTypes; +using Filtration.ObjectModel.Enums; + +namespace Filtration.ItemFilterPreview.Model +{ + public interface IFilteredItem + { + IItem Item { get; } + IItemFilterBlock ItemFilterBlock { get; } + BlockAction BlockAction { get; } + Color BackgroundColor { get; } + Color BorderColor { get; } + Color TextColor { get; } + } + + public class FilteredItem : IFilteredItem + { + public FilteredItem(IItem item, IItemFilterBlock itemFilterBlock) + { + Item = item; + ItemFilterBlock = itemFilterBlock; + } + + public IItem Item { get; private set; } + public IItemFilterBlock ItemFilterBlock { get; private set; } + + public BlockAction BlockAction => ItemFilterBlock?.Action ?? BlockAction.Show; + public Color BackgroundColor => ItemFilterBlock.HasBlockItemOfType() ? ItemFilterBlock.DisplayBackgroundColor : new Color { A = 255, R = 0, G = 0, B = 0 }; + public Color BorderColor => ItemFilterBlock.HasBlockItemOfType() ? ItemFilterBlock.DisplayBorderColor : new Color { A = 255, R = 0, G = 0, B = 0 }; + public Color TextColor + { + get + { + if (ItemFilterBlock.HasBlockItemOfType()) + { + return ItemFilterBlock.DisplayTextColor; + } + + return Item.DefaultTextColor; + } + } + } +} diff --git a/Filtration.ItemFilterPreview/Model/Item.cs b/Filtration.ItemFilterPreview/Model/Item.cs index 8759a2e..1b5ee6b 100644 --- a/Filtration.ItemFilterPreview/Model/Item.cs +++ b/Filtration.ItemFilterPreview/Model/Item.cs @@ -2,8 +2,11 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; +using System.Windows.Media; +using System.Xml.Serialization; using Filtration.ObjectModel; using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.Extensions; namespace Filtration.ItemFilterPreview.Model { @@ -21,8 +24,10 @@ namespace Filtration.ItemFilterPreview.Model int LinkedSockets { get; } IEnumerable LinkedSocketGroups { get; } List SocketGroups { get; set; } + Color DefaultTextColor { get; } } + [Serializable] public class Item : IItem { private List _socketGroups; @@ -35,9 +40,13 @@ namespace Filtration.ItemFilterPreview.Model public int Width { get; set; } public int Quality { get; set; } public ItemRarity ItemRarity { get; set; } + + [XmlIgnore] public int Sockets { get; private set; } + [XmlIgnore] public int LinkedSockets { get; private set; } + [XmlIgnore] public IEnumerable LinkedSocketGroups { get { return SocketGroups.Where(s => s.Linked); } @@ -76,5 +85,7 @@ namespace Filtration.ItemFilterPreview.Model } } + + public Color DefaultTextColor => ItemRarity.DefaultRarityTextColor(); } } diff --git a/Filtration.ItemFilterPreview/Model/ItemCollection.cs b/Filtration.ItemFilterPreview/Model/ItemCollection.cs deleted file mode 100644 index fae5a61..0000000 --- a/Filtration.ItemFilterPreview/Model/ItemCollection.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace Filtration.ItemFilterPreview.Model -{ - class FilteredItemDictionary : Dictionary - { - - } -} diff --git a/Filtration.ItemFilterPreview/Resources/Fontin-SmallCaps.ttf b/Filtration.ItemFilterPreview/Resources/Fontin-SmallCaps.ttf new file mode 100644 index 0000000000000000000000000000000000000000..25efca5b0c597341a6488899d5484a9b1f0aa04e GIT binary patch literal 29816 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 literal 0 HcmV?d00001 diff --git a/Filtration.ItemFilterPreview/Services/ItemFilterProcessor.cs b/Filtration.ItemFilterPreview/Services/ItemFilterProcessor.cs index 5c77249..e8a59a9 100644 --- a/Filtration.ItemFilterPreview/Services/ItemFilterProcessor.cs +++ b/Filtration.ItemFilterPreview/Services/ItemFilterProcessor.cs @@ -8,7 +8,7 @@ namespace Filtration.ItemFilterPreview.Services { internal interface IItemFilterProcessor { - IReadOnlyDictionary ProcessItemsAgainstItemFilterScript(IItemFilterScript itemFilterScript, IEnumerable items); + List ProcessItemsAgainstItemFilterScript(IItemFilterScript itemFilterScript, IEnumerable items); } internal class ItemFilterProcessor : IItemFilterProcessor @@ -20,11 +20,11 @@ namespace Filtration.ItemFilterPreview.Services _blockItemMatcher = blockItemMatcher; } - public IReadOnlyDictionary ProcessItemsAgainstItemFilterScript(IItemFilterScript itemFilterScript, IEnumerable items) + public List ProcessItemsAgainstItemFilterScript(IItemFilterScript itemFilterScript, IEnumerable items) { var overallsw = Stopwatch.StartNew(); - - var matchedItemBlockPairs = new Dictionary(); + + var filteredItems = new List(); var sw = Stopwatch.StartNew(); foreach (var item in items) @@ -32,10 +32,10 @@ namespace Filtration.ItemFilterPreview.Services sw.Restart(); var matchedBlock = itemFilterScript.ItemFilterBlocks - .Where(b => !(b is ItemFilterSection)) - .FirstOrDefault(block => _blockItemMatcher.ItemBlockMatch(block, item)); + .Where(b => !(b is ItemFilterSection)) + .FirstOrDefault(block => _blockItemMatcher.ItemBlockMatch(block, item)); - matchedItemBlockPairs.Add(item, matchedBlock); + filteredItems.Add(new FilteredItem(item, matchedBlock)); Debug.WriteLine("Processed Item in {0}ms", sw.ElapsedMilliseconds); } @@ -43,7 +43,7 @@ namespace Filtration.ItemFilterPreview.Services overallsw.Stop(); Debug.WriteLine("Total processing time: {0}ms", overallsw.ElapsedMilliseconds); - return matchedItemBlockPairs; + return filteredItems; } } } diff --git a/Filtration.ItemFilterPreview/UserControls/DesignTime/DesignTimeItemControl.cs b/Filtration.ItemFilterPreview/UserControls/DesignTime/DesignTimeItemControl.cs new file mode 100644 index 0000000..a9808d3 --- /dev/null +++ b/Filtration.ItemFilterPreview/UserControls/DesignTime/DesignTimeItemControl.cs @@ -0,0 +1,12 @@ +using System.Windows.Media; + +namespace Filtration.ItemFilterPreview.UserControls.DesignTime +{ + public class DesignTimeItemControl + { + public Color BackgroundColor => Colors.Bisque; + public Color TextColor => Colors.Maroon; + public Color BorderColor => Colors.CornflowerBlue; + public int FontSize => 15; + } +} diff --git a/Filtration.ItemFilterPreview/UserControls/ItemControl.xaml b/Filtration.ItemFilterPreview/UserControls/ItemControl.xaml new file mode 100644 index 0000000..9725c36 --- /dev/null +++ b/Filtration.ItemFilterPreview/UserControls/ItemControl.xaml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Filtration.ItemFilterPreview/ViewModels/LootExplosionViewModel.cs b/Filtration.ItemFilterPreview/ViewModels/LootExplosionViewModel.cs new file mode 100644 index 0000000..0045e56 --- /dev/null +++ b/Filtration.ItemFilterPreview/ViewModels/LootExplosionViewModel.cs @@ -0,0 +1,10 @@ +namespace Filtration.ItemFilterPreview.ViewModels +{ + internal class LootExplosionViewModel + { + public LootExplosionViewModel() + { + + } + } +} diff --git a/Filtration.ItemFilterPreview/Views/LootExplosionView.xaml b/Filtration.ItemFilterPreview/Views/LootExplosionView.xaml new file mode 100644 index 0000000..63982ba --- /dev/null +++ b/Filtration.ItemFilterPreview/Views/LootExplosionView.xaml @@ -0,0 +1,13 @@ + + + + + + diff --git a/Filtration.ItemFilterPreview/MainWindow.xaml.cs b/Filtration.ItemFilterPreview/Views/LootExplosionView.xaml.cs similarity index 72% rename from Filtration.ItemFilterPreview/MainWindow.xaml.cs rename to Filtration.ItemFilterPreview/Views/LootExplosionView.xaml.cs index 5281ccc..ca4ea60 100644 --- a/Filtration.ItemFilterPreview/MainWindow.xaml.cs +++ b/Filtration.ItemFilterPreview/Views/LootExplosionView.xaml.cs @@ -13,14 +13,14 @@ using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; -namespace Filtration.ItemFilterPreview +namespace Filtration.ItemFilterPreview.Views { /// - /// Interaction logic for MainWindow.xaml + /// Interaction logic for LootExplosionView.xaml /// - public partial class MainWindow : Window + public partial class LootExplosionView : UserControl { - public MainWindow() + public LootExplosionView() { InitializeComponent(); } diff --git a/Filtration.ItemFilterPreview/WindsorInstallers/ViewModelsInstaller.cs b/Filtration.ItemFilterPreview/WindsorInstallers/ViewModelsInstaller.cs new file mode 100644 index 0000000..2fdd4f9 --- /dev/null +++ b/Filtration.ItemFilterPreview/WindsorInstallers/ViewModelsInstaller.cs @@ -0,0 +1,18 @@ +using Castle.MicroKernel.Registration; +using Castle.MicroKernel.SubSystems.Configuration; +using Castle.Windsor; +using Filtration.ItemFilterPreview.ViewModels; + +namespace Filtration.ItemFilterPreview.WindsorInstallers +{ + public class ViewModelsInstaller : IWindsorInstaller + { + public void Install(IWindsorContainer container, IConfigurationStore store) + { + container.Register( + Component.For() + .ImplementedBy() + .LifeStyle.Singleton); + } + } +} diff --git a/Filtration.ItemFilterPreview/WindsorInstallers/ViewsInstaller.cs b/Filtration.ItemFilterPreview/WindsorInstallers/ViewsInstaller.cs new file mode 100644 index 0000000..f4cefbf --- /dev/null +++ b/Filtration.ItemFilterPreview/WindsorInstallers/ViewsInstaller.cs @@ -0,0 +1,18 @@ +using Castle.MicroKernel.Registration; +using Castle.MicroKernel.SubSystems.Configuration; +using Castle.Windsor; +using Filtration.ItemFilterPreview.Views; + +namespace Filtration.ItemFilterPreview.WindsorInstallers +{ + public class ViewsInstaller : IWindsorInstaller + { + public void Install(IWindsorContainer container, IConfigurationStore store) + { + container.Register( + Component.For() + .ImplementedBy() + .LifeStyle.Singleton); + } + } +} diff --git a/Filtration.ItemFilterPreview/packages.config b/Filtration.ItemFilterPreview/packages.config index 866ff2c..cb63c9f 100644 --- a/Filtration.ItemFilterPreview/packages.config +++ b/Filtration.ItemFilterPreview/packages.config @@ -1,5 +1,7 @@  - + + + \ No newline at end of file diff --git a/Filtration.ObjectModel/Enums/ItemRarity.cs b/Filtration.ObjectModel/Enums/ItemRarity.cs index 2e33b12..affa59e 100644 --- a/Filtration.ObjectModel/Enums/ItemRarity.cs +++ b/Filtration.ObjectModel/Enums/ItemRarity.cs @@ -4,6 +4,8 @@ namespace Filtration.ObjectModel.Enums { public enum ItemRarity { + [Description("Not Set")] + NotSet, [Description("Normal")] Normal, [Description("Magic")] diff --git a/Filtration.ObjectModel/Enums/PathOfExileNamedColor.cs b/Filtration.ObjectModel/Enums/PathOfExileNamedColor.cs new file mode 100644 index 0000000..882e53c --- /dev/null +++ b/Filtration.ObjectModel/Enums/PathOfExileNamedColor.cs @@ -0,0 +1,36 @@ +namespace Filtration.ObjectModel.Enums +{ + public enum PathOfExileNamedColor + { + Default, + ValueDefault, + Pink, + DodgerBlue, + Fire, + Cold, + Lightning, + Chaos, + Augmented, + Crafted, + Unmet, + UniqueItem, + RareItem, + MagicItem, + WhiteItem, + GemItem, + CurrencyItem, + QuestItem, + NemesisMod, + NemesisModOutline, + Title, + Corrupted, + Favour, + SupporterPackNewItem, + SupporterPackItem, + BloodlineMod, + BloodlineModOutline, + TormentMod, + TormentModOutline, + CantTradeorModify + } +} \ No newline at end of file diff --git a/Filtration.ObjectModel/Enums/SocketColor.cs b/Filtration.ObjectModel/Enums/SocketColor.cs index cb6cfa4..f0a1658 100644 --- a/Filtration.ObjectModel/Enums/SocketColor.cs +++ b/Filtration.ObjectModel/Enums/SocketColor.cs @@ -1,9 +1,12 @@ -using System.ComponentModel; +using System; +using System.ComponentModel; namespace Filtration.ObjectModel.Enums { + [Serializable] public enum SocketColor { + Yellow, [Description("R")] Red, [Description("G")] diff --git a/Filtration.ObjectModel/Extensions/ItemRarityExtensions.cs b/Filtration.ObjectModel/Extensions/ItemRarityExtensions.cs new file mode 100644 index 0000000..943a1e3 --- /dev/null +++ b/Filtration.ObjectModel/Extensions/ItemRarityExtensions.cs @@ -0,0 +1,39 @@ +using System; +using System.Windows.Media; +using Filtration.ObjectModel.Enums; + +namespace Filtration.ObjectModel.Extensions +{ + public static class ItemRarityExtensions + { + public static Color DefaultRarityTextColor(this ItemRarity itemRarity) + { + switch (itemRarity) + { + case ItemRarity.Magic: + { + return PathOfExileNamedColors.Colors[PathOfExileNamedColor.MagicItem]; + } + case ItemRarity.Normal: + { + return PathOfExileNamedColors.Colors[PathOfExileNamedColor.WhiteItem]; + } + case ItemRarity.Rare: + { + return PathOfExileNamedColors.Colors[PathOfExileNamedColor.RareItem]; + } + case ItemRarity.Unique: + { + return PathOfExileNamedColors.Colors[PathOfExileNamedColor.UniqueItem]; + } + case ItemRarity.NotSet: + { + return PathOfExileNamedColors.Colors[PathOfExileNamedColor.QuestItem]; + } + + default: + throw new ArgumentOutOfRangeException(nameof(itemRarity), itemRarity, null); + } + } + } +} diff --git a/Filtration.ObjectModel/Filtration.ObjectModel.csproj b/Filtration.ObjectModel/Filtration.ObjectModel.csproj index 453d2fe..de6e67d 100644 --- a/Filtration.ObjectModel/Filtration.ObjectModel.csproj +++ b/Filtration.ObjectModel/Filtration.ObjectModel.csproj @@ -72,6 +72,7 @@ + @@ -79,6 +80,8 @@ + + diff --git a/Filtration.ObjectModel/ItemFilterBlock.cs b/Filtration.ObjectModel/ItemFilterBlock.cs index c34f6f1..82a7c77 100644 --- a/Filtration.ObjectModel/ItemFilterBlock.cs +++ b/Filtration.ObjectModel/ItemFilterBlock.cs @@ -1,8 +1,11 @@ using System; using System.Collections.ObjectModel; using System.Linq; +using System.Windows.Media; using Filtration.ObjectModel.BlockItemBaseTypes; +using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.Enums; +using Filtration.ObjectModel.Extensions; namespace Filtration.ObjectModel { @@ -13,6 +16,10 @@ namespace Filtration.ObjectModel ItemFilterBlockGroup BlockGroup { get; set; } BlockAction Action { get; set; } ObservableCollection BlockItems { get; } + Color DisplayBackgroundColor { get; } + Color DisplayTextColor { get; } + Color DisplayBorderColor { get; } + double DisplayFontSize { get; } int BlockCount(Type type); bool AddBlockItemAllowed(Type type); bool HasBlockItemOfType(); @@ -115,5 +122,49 @@ namespace Filtration.ObjectModel Action = BlockAction.Show; } } + + public Color DisplayTextColor + { + get + { + var textColorBlockItem = BlockItems.OfType().FirstOrDefault(); + if (textColorBlockItem != null) + { + return textColorBlockItem.Color; + } + + var rarityBlockItem = BlockItems.OfType().FirstOrDefault(); + return rarityBlockItem != null + ? ((ItemRarity) rarityBlockItem.FilterPredicate.PredicateOperand).DefaultRarityTextColor() + : PathOfExileNamedColors.Colors[PathOfExileNamedColor.WhiteItem]; + } + } + + public Color DisplayBackgroundColor + { + get + { + var backgroundColorBlockItem = BlockItems.OfType().FirstOrDefault(); + return backgroundColorBlockItem?.Color ?? new Color { A = 255, R = 0, G = 0, B = 0 }; + } + } + + public Color DisplayBorderColor + { + get + { + var borderColorBlockItem = BlockItems.OfType().FirstOrDefault(); + return borderColorBlockItem?.Color ?? new Color { A = 255, R = 0, G = 0, B = 0 }; + } + } + + public double DisplayFontSize + { + get + { + var fontSizeBlockItem = BlockItems.OfType().FirstOrDefault(); + return fontSizeBlockItem?.Value ?? 34; + } + } } } diff --git a/Filtration.ObjectModel/PathOfExileNamedColors.cs b/Filtration.ObjectModel/PathOfExileNamedColors.cs new file mode 100644 index 0000000..aa19e16 --- /dev/null +++ b/Filtration.ObjectModel/PathOfExileNamedColors.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using System.Windows.Media; +using Filtration.ObjectModel.Enums; + +namespace Filtration.ObjectModel +{ + public static class PathOfExileNamedColors + { + public static Dictionary Colors => new Dictionary + { + {PathOfExileNamedColor.Default, new Color {A = 255, R = 127, G = 127, B = 127}}, + {PathOfExileNamedColor.ValueDefault, new Color {A = 255, R = 255, G = 255, B = 255}}, + {PathOfExileNamedColor.Pink, new Color {A = 255, R = 255, G = 192, B = 203}}, + {PathOfExileNamedColor.DodgerBlue, new Color {A = 255, R = 30, G = 144, B = 255}}, + {PathOfExileNamedColor.Fire, new Color {A = 255, R = 150, G = 0, B = 0}}, + {PathOfExileNamedColor.Cold, new Color {A = 255, R = 54, G = 100, B = 146}}, + {PathOfExileNamedColor.Lightning, new Color {A = 255, R = 255, G = 215, B = 0}}, + {PathOfExileNamedColor.Chaos, new Color {A = 255, R = 208, G = 32, B = 144}}, + {PathOfExileNamedColor.Augmented, new Color {A = 255, R = 136, G = 136, B = 255}}, + {PathOfExileNamedColor.Crafted, new Color {A = 255, R = 184, G = 218, B = 242}}, + {PathOfExileNamedColor.Unmet, new Color {A = 255, R = 210, G = 0, B = 0}}, + {PathOfExileNamedColor.UniqueItem, new Color {A = 255, R = 175, G = 96, B = 37}}, + {PathOfExileNamedColor.RareItem, new Color {A = 255, R = 255, G = 255, B = 119}}, + {PathOfExileNamedColor.MagicItem, new Color {A = 255, R = 136, G = 136, B = 255}}, + {PathOfExileNamedColor.WhiteItem, new Color {A = 255, R = 200, G = 200, B = 200}}, + {PathOfExileNamedColor.GemItem, new Color {A = 255, R = 27, G = 162, B = 155}}, + {PathOfExileNamedColor.CurrencyItem, new Color {A = 255, R = 170, G = 158, B = 130}}, + {PathOfExileNamedColor.QuestItem, new Color {A = 255, R = 74, G = 230, B = 58}}, + {PathOfExileNamedColor.NemesisMod, new Color {A = 255, R = 255, G = 200, B = 0}}, + {PathOfExileNamedColor.NemesisModOutline, new Color {A = 220, R = 255, G = 40, B = 0}}, + {PathOfExileNamedColor.Title, new Color {A = 255, R = 231, G = 180, B = 120}}, + {PathOfExileNamedColor.Corrupted, new Color {A = 255, R = 210, G = 0, B = 0}}, + {PathOfExileNamedColor.Favour, new Color {A = 255, R = 170, G = 158, B = 130}}, + {PathOfExileNamedColor.SupporterPackNewItem, new Color {A = 255, R = 180, G = 96, B = 0}}, + {PathOfExileNamedColor.SupporterPackItem, new Color {A = 255, R = 163, G = 141, B = 109}}, + {PathOfExileNamedColor.BloodlineMod, new Color {A = 255, R = 210, G = 0, B = 220}}, + {PathOfExileNamedColor.BloodlineModOutline, new Color {A = 200, R = 74, G = 0, B = 160}}, + {PathOfExileNamedColor.TormentMod, new Color {A = 255, R = 50, G = 230, B = 100}}, + {PathOfExileNamedColor.TormentModOutline, new Color {A = 200, R = 0, G = 100, B = 150}}, + {PathOfExileNamedColor.CantTradeorModify, new Color {A = 255, R = 210, G = 0, B = 0}}, + }; + + } +} diff --git a/Filtration.ObjectModel/Socket.cs b/Filtration.ObjectModel/Socket.cs index 7fa01c4..30679d7 100644 --- a/Filtration.ObjectModel/Socket.cs +++ b/Filtration.ObjectModel/Socket.cs @@ -1,9 +1,15 @@ -using Filtration.ObjectModel.Enums; +using System; +using Filtration.ObjectModel.Enums; namespace Filtration.ObjectModel { + [Serializable] public class Socket { + private Socket() + { + } + public Socket(SocketColor color) { Color = color; diff --git a/Filtration.ObjectModel/SocketGroup.cs b/Filtration.ObjectModel/SocketGroup.cs index 89e72ba..24af1ad 100644 --- a/Filtration.ObjectModel/SocketGroup.cs +++ b/Filtration.ObjectModel/SocketGroup.cs @@ -3,8 +3,14 @@ using System.Collections.Generic; namespace Filtration.ObjectModel { + [Serializable] public class SocketGroup : List { + private SocketGroup() + { + + } + public SocketGroup(List sockets, bool linked) { if (sockets.Count < 1 || sockets.Count > 6) diff --git a/Filtration.Tests/Filtration.Tests.csproj b/Filtration.Tests/Filtration.Tests.csproj index f71a49f..c8bea23 100644 --- a/Filtration.Tests/Filtration.Tests.csproj +++ b/Filtration.Tests/Filtration.Tests.csproj @@ -31,12 +31,12 @@ 4 - - ..\packages\FluentAssertions.4.1.1\lib\net45\FluentAssertions.dll + + ..\packages\FluentAssertions.4.2.1\lib\net45\FluentAssertions.dll True - - ..\packages\FluentAssertions.4.1.1\lib\net45\FluentAssertions.Core.dll + + ..\packages\FluentAssertions.4.2.1\lib\net45\FluentAssertions.Core.dll True diff --git a/Filtration.Tests/app.config b/Filtration.Tests/app.config index b0ca7b2..3dedc60 100644 --- a/Filtration.Tests/app.config +++ b/Filtration.Tests/app.config @@ -4,7 +4,7 @@ - + diff --git a/Filtration.Tests/packages.config b/Filtration.Tests/packages.config index af6f21a..c3f6e5b 100644 --- a/Filtration.Tests/packages.config +++ b/Filtration.Tests/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/Filtration.ThemeEditor/Filtration.ThemeEditor.csproj b/Filtration.ThemeEditor/Filtration.ThemeEditor.csproj index fdada7a..51136c2 100644 --- a/Filtration.ThemeEditor/Filtration.ThemeEditor.csproj +++ b/Filtration.ThemeEditor/Filtration.ThemeEditor.csproj @@ -31,8 +31,8 @@ 4 - - ..\packages\AutoMapper.4.1.1\lib\net45\AutoMapper.dll + + ..\packages\AutoMapper.4.2.0\lib\net45\AutoMapper.dll True @@ -78,28 +78,28 @@ - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.AvalonDock.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.AvalonDock.dll True - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.AvalonDock.Themes.Aero.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.AvalonDock.Themes.Aero.dll True - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.AvalonDock.Themes.Metro.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.AvalonDock.Themes.Metro.dll True - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.AvalonDock.Themes.VS2010.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.AvalonDock.Themes.VS2010.dll True - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.DataGrid.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.DataGrid.dll True - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.Toolkit.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.Toolkit.dll True diff --git a/Filtration.ThemeEditor/packages.config b/Filtration.ThemeEditor/packages.config index 627e334..1bdb57a 100644 --- a/Filtration.ThemeEditor/packages.config +++ b/Filtration.ThemeEditor/packages.config @@ -1,10 +1,10 @@  - + - + \ No newline at end of file diff --git a/Filtration.sln.DotSettings b/Filtration.sln.DotSettings index 2d2bbe3..c7dfe84 100644 --- a/Filtration.sln.DotSettings +++ b/Filtration.sln.DotSettings @@ -1,2 +1,4 @@  - True \ No newline at end of file + True + <data /> + <data><IncludeFilters /><ExcludeFilters><Filter ModuleMask="Filtration.ItemFilterPreview.Tests" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /><Filter ModuleMask="Filtration.ObjectModel.Tests" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /><Filter ModuleMask="Filtration.ThemeEditor.Tests" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /><Filter ModuleMask="Filtration.Tests" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /></ExcludeFilters></data> \ No newline at end of file diff --git a/Filtration/App.config b/Filtration/App.config index cf2a739..f490c15 100644 --- a/Filtration/App.config +++ b/Filtration/App.config @@ -31,7 +31,7 @@ - + diff --git a/Filtration/App.xaml.cs b/Filtration/App.xaml.cs index d152e1b..c471c85 100644 --- a/Filtration/App.xaml.cs +++ b/Filtration/App.xaml.cs @@ -28,6 +28,7 @@ namespace Filtration _container = new WindsorContainer(); + // Disable property injection var propInjector = _container.Kernel.ComponentModelBuilder .Contributors .OfType() diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj index b0065a1..54f05d7 100644 --- a/Filtration/Filtration.csproj +++ b/Filtration/Filtration.csproj @@ -42,8 +42,8 @@ Resources\filtration.ico - - ..\packages\AutoMapper.4.1.1\lib\net45\AutoMapper.dll + + ..\packages\AutoMapper.4.2.0\lib\net45\AutoMapper.dll True @@ -69,9 +69,11 @@ ..\packages\MvvmLightLibs.5.2.0.0\lib\net45\GalaSoft.MvvmLight.Platform.dll True - - ..\packages\MahApps.Metro.1.1.2.0\lib\net45\MahApps.Metro.dll + + ..\packages\MahApps.Metro.1.2.4.0\lib\net45\MahApps.Metro.dll + True + ..\packages\NLog.4.2.3\lib\net45\NLog.dll True @@ -88,7 +90,7 @@ - ..\packages\MvvmLightLibs.5.2.0.0\lib\net45\System.Windows.Interactivity.dll + ..\packages\MahApps.Metro.1.2.4.0\lib\net45\System.Windows.Interactivity.dll True @@ -99,40 +101,40 @@ - - ..\packages\WpfAnimatedGif.1.4.13\lib\net\WpfAnimatedGif.dll + + ..\packages\WpfAnimatedGif.1.4.14\lib\net\WpfAnimatedGif.dll True False ..\packages\WPFToolkit.3.5.50211.1\lib\WPFToolkit.dll - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.AvalonDock.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.AvalonDock.dll True - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.AvalonDock.Themes.Aero.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.AvalonDock.Themes.Aero.dll True - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.AvalonDock.Themes.Metro.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.AvalonDock.Themes.Metro.dll True - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.AvalonDock.Themes.VS2010.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.AvalonDock.Themes.VS2010.dll True False libs\Xceed.Wpf.AvalonDock.Themes.VS2013.dll - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.DataGrid.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.DataGrid.dll True - - ..\packages\Extended.Wpf.Toolkit.2.5\lib\net40\Xceed.Wpf.Toolkit.dll + + ..\packages\Extended.Wpf.Toolkit.2.6\lib\net40\Xceed.Wpf.Toolkit.dll True @@ -184,7 +186,6 @@ - diff --git a/Filtration/NLog.xsd b/Filtration/NLog.xsd index 0ed97b6..a719741 100644 --- a/Filtration/NLog.xsd +++ b/Filtration/NLog.xsd @@ -986,31 +986,32 @@ - + - - + - - - - - + + + - - + + + + + + @@ -1042,11 +1043,6 @@ Line ending mode. - - - Maximum number of archive files that should be kept. - - Way file archives are numbered. @@ -1067,6 +1063,11 @@ Size in bytes above which log files will be automatically archived. Warning: combining this with isn't supported. We cannot create multiple archive files, if they should have the same name. Choose: + + + Maximum number of archive files that should be kept. + + Indicates whether to compress archive files into the zip archive format. @@ -1077,14 +1078,9 @@ Gets or set a value indicating whether a managed file stream is forced, instead of used the native implementation. - + - File attributes (Windows only). - - - - - Indicates whether to replace file contents on each write instead of appending log message at the end. + Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. If set to false, nothing gets written when the filename is wrong. @@ -1107,34 +1103,24 @@ Indicates whether to create directories if they do not exist. - - - Indicates whether to delete old log file on startup. - - Indicates whether to enable log file(s) to be deleted. - + - Maximum number of seconds that files are kept open. If this number is negative the files are not automatically closed after a period of inactivity. + File attributes (Windows only). - + - Indicates whether concurrent writes to the log file by multiple processes on different network hosts. + Indicates whether to delete old log file on startup. - + - Maximum number of log filenames that should be stored as existing. - - - - - Indicates whether to keep log file open instead of opening and closing it on each logging event. + Indicates whether to replace file contents on each write instead of appending log message at the end. @@ -1142,19 +1128,19 @@ Indicates whether concurrent writes to the log file by multiple processes on the same host. - - - Number of times the write is appended on the file before NLog discards the log message. - - Delay in milliseconds to wait before attempting to write to the file again. - + - Indicates whether to automatically flush the file buffers after each log message. + Maximum number of log filenames that should be stored as existing. + + + + + Indicates whether concurrent writes to the log file by multiple processes on different network hosts. @@ -1162,11 +1148,31 @@ Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + Maximum number of seconds that files are kept open. If this number is negative the files are not automatically closed after a period of inactivity. + + Log file buffer size in bytes. + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + Number of times the write is appended on the file before NLog discards the log message. + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + diff --git a/Filtration/Services/StaticDataService.cs b/Filtration/Services/StaticDataService.cs index a602212..a962012 100644 --- a/Filtration/Services/StaticDataService.cs +++ b/Filtration/Services/StaticDataService.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Windows; using Filtration.Common.Services; +using Filtration.Common.Utilities; using Filtration.Utilities; namespace Filtration.Services diff --git a/Filtration/Translators/ItemFilterBlockTranslator.cs b/Filtration/Translators/ItemFilterBlockTranslator.cs index f0055ed..6428add 100644 --- a/Filtration/Translators/ItemFilterBlockTranslator.cs +++ b/Filtration/Translators/ItemFilterBlockTranslator.cs @@ -5,13 +5,13 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Windows.Media; +using Filtration.Common.Utilities; using Filtration.ObjectModel; using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.Enums; using Filtration.ObjectModel.Extensions; using Filtration.ObjectModel.ThemeEditor; -using Filtration.Utilities; namespace Filtration.Translators { diff --git a/Filtration/Translators/ItemFilterScriptTranslator.cs b/Filtration/Translators/ItemFilterScriptTranslator.cs index 5d6d09b..4298170 100644 --- a/Filtration/Translators/ItemFilterScriptTranslator.cs +++ b/Filtration/Translators/ItemFilterScriptTranslator.cs @@ -3,10 +3,9 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; -using Castle.Core.Internal; +using Filtration.Common.Utilities; using Filtration.ObjectModel; using Filtration.Properties; -using Filtration.Utilities; namespace Filtration.Translators { @@ -112,7 +111,7 @@ namespace Filtration.Translators } } - if (!script.Description.IsNullOrEmpty()) + if (!string.IsNullOrEmpty(script.Description)) { script.Description = script.Description.TrimEnd('\n').TrimEnd('\r'); } diff --git a/Filtration/ViewModels/ItemFilterBlockViewModel.cs b/Filtration/ViewModels/ItemFilterBlockViewModel.cs index 9d403dc..3bd4a62 100644 --- a/Filtration/ViewModels/ItemFilterBlockViewModel.cs +++ b/Filtration/ViewModels/ItemFilterBlockViewModel.cs @@ -216,40 +216,13 @@ namespace Filtration.ViewModels public ObservableCollection AvailableColors => PathOfExileColors.DefaultColors; - public bool HasTextColor => Block.HasBlockItemOfType(); - - public Color DisplayTextColor => HasTextColor - ? BlockItems.OfType().First().Color - : new Color {A = 255, R = 200, G = 200, B = 200}; - - public bool HasBackgroundColor => Block.HasBlockItemOfType(); - - public Color DisplayBackgroundColor => HasBackgroundColor - ? BlockItems.OfType().First().Color - : new Color { A = 255, R = 0, G = 0, B = 0 }; - - public bool HasBorderColor => Block.HasBlockItemOfType(); - - public Color DisplayBorderColor => HasBorderColor - ? BlockItems.OfType().First().Color - : new Color { A = 255, R = 0, G = 0, B = 0 }; - - public bool HasFontSize => Block.HasBlockItemOfType(); - - public double DisplayFontSize - { - // Dividing by 1.8 roughly scales in-game font sizes down to WPF sizes - get - { - var fontSize = HasFontSize ? BlockItems.OfType().First().Value / 1.8 : 19; - - return fontSize; - } - } - + public Color DisplayTextColor => Block.DisplayTextColor; + public Color DisplayBackgroundColor => Block.DisplayBackgroundColor; + public Color DisplayBorderColor => Block.DisplayBorderColor; + public double DisplayFontSize => Block.DisplayFontSize/1.8; + public bool HasSound => Block.HasBlockItemOfType(); - - + public bool HasAudioVisualBlockItems => AudioVisualBlockItems.Any(); private void OnSwitchBlockItemsViewCommand() diff --git a/Filtration/packages.config b/Filtration/packages.config index a271df8..dad6566 100644 --- a/Filtration/packages.config +++ b/Filtration/packages.config @@ -1,16 +1,16 @@  - + - + - + - - - + + + \ No newline at end of file