Various refactorings to support ItemFilterPreview

This commit is contained in:
Ben Wallis
2016-01-31 10:51:53 +00:00
parent d159f0b262
commit 86dc03f4ff
49 changed files with 623 additions and 212 deletions

View File

@@ -1,8 +1,7 @@
<Application x:Class="Filtration.ItemFilterPreview.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Filtration.ItemFilterPreview"
StartupUri="MainWindow.xaml">
Startup="Application_Startup">
<Application.Resources>
</Application.Resources>

View File

@@ -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<TypedFactoryFacility>();
_container.Install(FromAssembly.InThisApplication());
var mainWindow = _container.Resolve<IMainWindow>();
mainWindow.Show();
}
}
}

View File

@@ -37,15 +37,35 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.3.3.0\lib\net45\Castle.Core.dll</HintPath>
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Windsor.3.3.0\lib\net45\Castle.Windsor.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="GalaSoft.MvvmLight, Version=5.2.0.37222, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.2.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="GalaSoft.MvvmLight.Extras, Version=5.2.0.37222, Culture=neutral, PublicKeyToken=669f0b5e8f868abf, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.2.0.0\lib\net45\GalaSoft.MvvmLight.Extras.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="GalaSoft.MvvmLight.Platform, Version=5.2.0.37226, Culture=neutral, PublicKeyToken=5f873c45e98af8a1, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.2.0.0\lib\net45\GalaSoft.MvvmLight.Platform.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.2.0.0\lib\net45\System.Windows.Interactivity.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
@@ -64,15 +84,34 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="Model\FilteredItem.cs" />
<Compile Include="Model\Item.cs" />
<Compile Include="Model\ItemCollection.cs" />
<Compile Include="Services\BlockItemMatcher.cs" />
<Compile Include="Services\ItemFilterProcessor.cs" />
<Compile Include="UserControls\DesignTime\DesignTimeItemControl.cs" />
<Compile Include="UserControls\ItemControl.xaml.cs">
<DependentUpon>ItemControl.xaml</DependentUpon>
</Compile>
<Compile Include="UserControls\ItemSocketsControl.xaml.cs">
<DependentUpon>ItemSocketsControl.xaml</DependentUpon>
</Compile>
<Compile Include="ViewModels\LootExplosionViewModel.cs" />
<Compile Include="ViewModels\MainWindowViewModel.cs" />
<Compile Include="Views\LootExplosionView.xaml.cs">
<DependentUpon>LootExplosionView.xaml</DependentUpon>
</Compile>
<Compile Include="WindsorInstallers\ViewModelsInstaller.cs" />
<Compile Include="WindsorInstallers\ViewsInstaller.cs" />
<Compile Include="WindsorInstallers\ServicesInstaller.cs" />
<Page Include="MainWindow.xaml">
<Page Include="UserControls\ItemControl.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\LootExplosionView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
@@ -80,7 +119,7 @@
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<Compile Include="Views\MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
@@ -113,11 +152,16 @@
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<AppDesigner Include="Properties\" />
<Resource Include="Resources\Fontin-SmallCaps.ttf" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Filtration.Common\Filtration.Common.csproj">
<Project>{8cb44f28-2956-4c2a-9314-72727262edd4}</Project>
<Name>Filtration.Common</Name>
</ProjectReference>
<ProjectReference Include="..\Filtration.ObjectModel\Filtration.ObjectModel.csproj">
<Project>{4aac3beb-1dc1-483e-9d11-0e9334e80227}</Project>
<Name>Filtration.ObjectModel</Name>

View File

@@ -1,28 +0,0 @@
<Window x:Class="Filtration.ItemFilterPreview.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Filtration.ItemFilterPreview"
xmlns:userControls="clr-namespace:Filtration.ItemFilterPreview.UserControls"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid Background="Black">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<userControls:ItemSocketsControl />
</Grid>
</Grid>
</Window>

View File

@@ -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<BackgroundColorBlockItem>() ? ItemFilterBlock.DisplayBackgroundColor : new Color { A = 255, R = 0, G = 0, B = 0 };
public Color BorderColor => ItemFilterBlock.HasBlockItemOfType<BorderColorBlockItem>() ? ItemFilterBlock.DisplayBorderColor : new Color { A = 255, R = 0, G = 0, B = 0 };
public Color TextColor
{
get
{
if (ItemFilterBlock.HasBlockItemOfType<TextColorBlockItem>())
{
return ItemFilterBlock.DisplayTextColor;
}
return Item.DefaultTextColor;
}
}
}
}

View File

@@ -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<SocketGroup> LinkedSocketGroups { get; }
List<SocketGroup> SocketGroups { get; set; }
Color DefaultTextColor { get; }
}
[Serializable]
public class Item : IItem
{
private List<SocketGroup> _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<SocketGroup> LinkedSocketGroups
{
get { return SocketGroups.Where(s => s.Linked); }
@@ -76,5 +85,7 @@ namespace Filtration.ItemFilterPreview.Model
}
}
public Color DefaultTextColor => ItemRarity.DefaultRarityTextColor();
}
}

View File

@@ -1,9 +0,0 @@
using System.Collections.Generic;
namespace Filtration.ItemFilterPreview.Model
{
class FilteredItemDictionary : Dictionary<Item, bool>
{
}
}

View File

@@ -8,7 +8,7 @@ namespace Filtration.ItemFilterPreview.Services
{
internal interface IItemFilterProcessor
{
IReadOnlyDictionary<IItem, IItemFilterBlock> ProcessItemsAgainstItemFilterScript(IItemFilterScript itemFilterScript, IEnumerable<IItem> items);
List<IFilteredItem> ProcessItemsAgainstItemFilterScript(IItemFilterScript itemFilterScript, IEnumerable<IItem> items);
}
internal class ItemFilterProcessor : IItemFilterProcessor
@@ -20,11 +20,11 @@ namespace Filtration.ItemFilterPreview.Services
_blockItemMatcher = blockItemMatcher;
}
public IReadOnlyDictionary<IItem, IItemFilterBlock> ProcessItemsAgainstItemFilterScript(IItemFilterScript itemFilterScript, IEnumerable<IItem> items)
public List<IFilteredItem> ProcessItemsAgainstItemFilterScript(IItemFilterScript itemFilterScript, IEnumerable<IItem> items)
{
var overallsw = Stopwatch.StartNew();
var matchedItemBlockPairs = new Dictionary<IItem, IItemFilterBlock>();
var filteredItems = new List<IFilteredItem>();
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;
}
}
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,42 @@
<UserControl x:Class="Filtration.ItemFilterPreview.UserControls.ItemControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:designTime="clr-namespace:Filtration.ItemFilterPreview.UserControls.DesignTime"
xmlns:converters="clr-namespace:Filtration.Common.Converters;assembly=Filtration.Common"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=designTime:DesignTimeItemControl, IsDesignTimeCreatable=True}"
d:DesignHeight="35" d:DesignWidth="170">
<UserControl.Resources>
<converters:ColorToSolidColorBrushConverter x:Key="ColorToSolidColorBrushConverter" />
<Style x:Key="PathOfExileFont">
<Setter Property="TextElement.FontFamily" Value="pack://application:,,,/resources/#Fontin SmallCaps" />
</Style>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Grid.Row="1" Grid.Column="1" Margin="3" Padding="4,0,4,0" BorderThickness="1">
<Border.Background>
<SolidColorBrush Color="{Binding BackgroundColor}" />
</Border.Background>
<Border.BorderBrush>
<SolidColorBrush Color="{Binding BorderColor}" />
</Border.BorderBrush>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Item Preview" Style="{StaticResource PathOfExileFont}" FontSize="{Binding FontSize}">
<TextBlock.Foreground>
<SolidColorBrush Color="{Binding TextColor}" />
</TextBlock.Foreground>
</TextBlock>
</Border>
</Grid>
</UserControl>

View File

@@ -0,0 +1,10 @@
namespace Filtration.ItemFilterPreview.ViewModels
{
internal class LootExplosionViewModel
{
public LootExplosionViewModel()
{
}
}
}

View File

@@ -0,0 +1,13 @@
<UserControl x:Class="Filtration.ItemFilterPreview.Views.LootExplosionView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Filtration.ItemFilterPreview.Views"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
</Grid>
</UserControl>

View File

@@ -13,14 +13,14 @@ using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Filtration.ItemFilterPreview
namespace Filtration.ItemFilterPreview.Views
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// Interaction logic for LootExplosionView.xaml
/// </summary>
public partial class MainWindow : Window
public partial class LootExplosionView : UserControl
{
public MainWindow()
public LootExplosionView()
{
InitializeComponent();
}

View File

@@ -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<IMainWindowViewModel>()
.ImplementedBy<MainWindowViewModel>()
.LifeStyle.Singleton);
}
}
}

View File

@@ -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<IMainWindow>()
.ImplementedBy<MainWindow>()
.LifeStyle.Singleton);
}
}
}

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Castle.Core" version="3.3.0" targetFramework="net461" />
<package id="Castle.Core" version="3.3.3" targetFramework="net461" />
<package id="Castle.Windsor" version="3.3.0" targetFramework="net461" />
<package id="CommonServiceLocator" version="1.3" targetFramework="net461" />
<package id="MvvmLightLibs" version="5.2.0.0" targetFramework="net461" />
</packages>