Implemented ThemeComponent reading/saving in translation layer

This commit is contained in:
Ben
2015-06-25 23:05:24 +01:00
parent e53e24100f
commit cc05945108
20 changed files with 450 additions and 34 deletions

View File

@@ -140,6 +140,7 @@
<Compile Include="Translators\BlockGroupHierarchyBuilder.cs" />
<Compile Include="Translators\ItemFilterBlockTranslator.cs" />
<Compile Include="Translators\ItemFilterScriptTranslator.cs" />
<Compile Include="Translators\ThemeComponentListBuilder.cs" />
<Compile Include="UserControls\AutoScrollingListBox.cs" />
<Compile Include="UserControls\CrossButton.cs" />
<Compile Include="UserControls\EditableListBoxControl.xaml.cs">
@@ -425,9 +426,7 @@
<Name>Filtration.ObjectModel</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="Models\" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(XamlSpyInstallPath)MSBuild\FirstFloor.XamlSpy.WPF.targets" Condition="'$(XamlSpyInstallPath)' != '' and '$(Configuration)' == 'DEBUG'" />
<Import Project="..\packages\AutoMapper.3.3.1\tools\AutoMapper.targets" Condition="Exists('..\packages\AutoMapper.3.3.1\tools\AutoMapper.targets')" />

View File

@@ -22,12 +22,14 @@ namespace Filtration.Translators
internal class ItemFilterBlockTranslator : IItemFilterBlockTranslator
{
private readonly IBlockGroupHierarchyBuilder _blockGroupHierarchyBuilder;
private readonly IThemeComponentListBuilder _themeComponentListBuilder;
private const string Indent = " ";
private readonly string _newLine = Environment.NewLine + Indent;
public ItemFilterBlockTranslator(IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder)
public ItemFilterBlockTranslator(IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder, IThemeComponentListBuilder themeComponentListBuilder)
{
_blockGroupHierarchyBuilder = blockGroupHierarchyBuilder;
_themeComponentListBuilder = themeComponentListBuilder;
}
// This method converts a string into a ItemFilterBlock. This is used for pasting ItemFilterBlocks
@@ -257,13 +259,20 @@ namespace Filtration.Translators
}
}
private static void AddColorItemToBlockItems<T>(ItemFilterBlock block, string inputString) where T : ColorBlockItem
private void AddColorItemToBlockItems<T>(ItemFilterBlock block, string inputString) where T : ColorBlockItem
{
var blockItem = Activator.CreateInstance<T>();
var result = Regex.Matches(inputString, @"([\w\s]*)[#]?(.*)");
// When Theme support is added result[0].Groups[2].Value will contain the ColorGroup in the comment if it exists.
blockItem.Color = GetColorFromString(result[0].Groups[1].Value);
var componentName = result[0].Groups[2].Value.Trim();
if (!string.IsNullOrEmpty(componentName))
{
blockItem.ThemeComponent = _themeComponentListBuilder.AddComponent(typeof(T), componentName, blockItem.Color);
}
block.BlockItems.Add(blockItem);
}

View File

@@ -20,11 +20,15 @@ namespace Filtration.Translators
{
private readonly IItemFilterBlockTranslator _blockTranslator;
private readonly IBlockGroupHierarchyBuilder _blockGroupHierarchyBuilder;
private readonly IThemeComponentListBuilder _themeComponentListBuilder;
public ItemFilterScriptTranslator(IItemFilterBlockTranslator blockTranslator, IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder)
public ItemFilterScriptTranslator(IItemFilterBlockTranslator blockTranslator,
IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder,
IThemeComponentListBuilder themeComponentListBuilder)
{
_blockTranslator = blockTranslator;
_blockGroupHierarchyBuilder = blockGroupHierarchyBuilder;
_themeComponentListBuilder = themeComponentListBuilder;
}
public ItemFilterScript TranslateStringToItemFilterScript(string inputString)
@@ -51,6 +55,8 @@ namespace Filtration.Translators
script.Description = script.Description.TrimEnd('\n').TrimEnd('\r');
}
_themeComponentListBuilder.Initialise();
// Extract each block from between boundaries and translate it into a ItemFilterBlock object
// and add that object to the ItemFilterBlocks list
for (var boundary = conditionBoundaries.First; boundary != null; boundary = boundary.Next)
@@ -63,6 +69,8 @@ namespace Filtration.Translators
script.ItemFilterBlocks.Add(_blockTranslator.TranslateStringToItemFilterBlock(blockString));
}
script.ThemeComponents = _themeComponentListBuilder.GetComponents();
return script;
}

View File

@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Media;
using Filtration.ThemeEditor.Models;
namespace Filtration.Translators
{
internal interface IThemeComponentListBuilder
{
void Initialise();
ThemeComponent AddComponent(Type targetType, string componentName, Color componentColor);
List<ThemeComponent> GetComponents();
}
internal class ThemeComponentListBuilder : IThemeComponentListBuilder
{
private List<ThemeComponent> _themeComponents;
public ThemeComponentListBuilder()
{
_themeComponents = new List<ThemeComponent>();
}
public void Initialise()
{
_themeComponents = new List<ThemeComponent>();
}
public ThemeComponent AddComponent(Type targetType, string componentName, Color componentColor)
{
if (ComponentExists(targetType, componentName))
{
return _themeComponents.FirstOrDefault(t => t.ComponentName == componentName && t.TargetType == targetType);
}
var component = new ThemeComponent(targetType, componentName, componentColor);
_themeComponents.Add(component);
return component;
}
public List<ThemeComponent> GetComponents()
{
return _themeComponents;
}
private bool ComponentExists(Type targetType, string componentName)
{
return _themeComponents.Exists(c => c.ComponentName == componentName && c.TargetType == targetType);
}
}
}

View File

@@ -101,14 +101,8 @@ namespace Filtration.ViewModels
{
_itemFilterBlockViewModelsCollectionView =
CollectionViewSource.GetDefaultView(_itemFilterBlockViewModels);
if (BlockFilterPredicate != null)
{
_itemFilterBlockViewModelsCollectionView.Filter = BlockFilter;
}
else
{
_itemFilterBlockViewModelsCollectionView.Filter = null;
}
_itemFilterBlockViewModelsCollectionView.Filter = BlockFilter;
return _itemFilterBlockViewModels;
}
}
@@ -116,7 +110,29 @@ namespace Filtration.ViewModels
private bool BlockFilter(object item)
{
var blockViewModel = item as IItemFilterBlockViewModel;
return BlockFilterPredicate(blockViewModel);
if (BlockFilterPredicate != null)
{
return BlockFilterPredicate(blockViewModel) && ShowBlockBasedOnAdvanced(blockViewModel);
}
return ShowBlockBasedOnAdvanced(blockViewModel);
}
private bool ShowBlockBasedOnAdvanced(IItemFilterBlockViewModel blockViewModel)
{
if (ShowAdvanced)
{
return true;
}
if (blockViewModel.Block.BlockGroup == null)
{
return true;
}
return !blockViewModel.Block.BlockGroup.Advanced;
}
public Predicate<IItemFilterBlockViewModel> BlockFilterPredicate
@@ -157,6 +173,7 @@ namespace Filtration.ViewModels
{
_showAdvanced = value;
RaisePropertyChanged();
RaisePropertyChanged("ItemFilterBlockViewModels");
}
}

View File

@@ -54,7 +54,7 @@ namespace Filtration.ViewModels
OnRequestClose(this, new EventArgs());
}
}
catch (DirectoryNotFoundException e)
catch (DirectoryNotFoundException)
{
MessageBox.Show("The entered Default Filter Directory is invalid or does not exist.", "Error",
MessageBoxButton.OK, MessageBoxImage.Exclamation);

View File

@@ -23,6 +23,11 @@ namespace Filtration.WindsorInstallers
Component.For<IBlockGroupHierarchyBuilder>()
.ImplementedBy<BlockGroupHierarchyBuilder>()
.LifeStyle.Singleton);
container.Register(
Component.For<IThemeComponentListBuilder>()
.ImplementedBy<ThemeComponentListBuilder>()
.LifeStyle.Singleton);
}
}
}