Added AutoMapper for BlockGroup to BlockGroupViewModel translation
This commit is contained in:
parent
8119018f33
commit
c80d4825df
|
@ -1,8 +1,15 @@
|
||||||
using System.Linq;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices.ComTypes;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
using AutoMapper;
|
||||||
using Castle.MicroKernel.ModelBuilder.Inspectors;
|
using Castle.MicroKernel.ModelBuilder.Inspectors;
|
||||||
using Castle.Windsor;
|
using Castle.Windsor;
|
||||||
using Castle.Windsor.Installer;
|
using Castle.Windsor.Installer;
|
||||||
|
using Filtration.Models;
|
||||||
|
using Filtration.Utilities;
|
||||||
|
using Filtration.ViewModels;
|
||||||
using Filtration.Views;
|
using Filtration.Views;
|
||||||
|
|
||||||
namespace Filtration
|
namespace Filtration
|
||||||
|
@ -16,26 +23,73 @@ namespace Filtration
|
||||||
_container = new WindsorContainer();
|
_container = new WindsorContainer();
|
||||||
|
|
||||||
var propInjector = _container.Kernel.ComponentModelBuilder
|
var propInjector = _container.Kernel.ComponentModelBuilder
|
||||||
.Contributors
|
.Contributors
|
||||||
.OfType<PropertiesDependenciesModelInspector>()
|
.OfType<PropertiesDependenciesModelInspector>()
|
||||||
.Single();
|
.Single();
|
||||||
|
|
||||||
_container.Kernel.ComponentModelBuilder.RemoveContributor(propInjector);
|
_container.Kernel.ComponentModelBuilder.RemoveContributor(propInjector);
|
||||||
|
|
||||||
_container.Install(FromAssembly.This());
|
_container.Install(FromAssembly.This());
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: Find out how to parameterise this to map differently depending if ShowAdvanced is true or false.
|
||||||
|
//Mapper.CreateMap<ItemFilterBlockGroup, ItemFilterBlockGroupViewModel>()
|
||||||
|
// .ForMember(dest => dest.IsChecked,
|
||||||
|
// opts => opts.MapFrom(from => from.IsChecked))
|
||||||
|
// .ForMember(dest => dest.SourceBlockGroup,
|
||||||
|
// opts => opts.MapFrom(from => from));
|
||||||
|
|
||||||
|
//Mapper.CreateMap<ItemFilterBlockGroup, ItemFilterBlockGroupViewModel>()
|
||||||
|
// .ForMember(dest => dest.IsChecked,
|
||||||
|
// opts => opts.MapFrom(from => from.IsChecked))
|
||||||
|
// .ForMember(dest => dest.ChildGroups,
|
||||||
|
// opts => opts.ResolveUsing<ChildGroupsResolver>())
|
||||||
|
// .ForMember(dest => dest.SourceBlockGroup,
|
||||||
|
// opts => opts.MapFrom(from => from));
|
||||||
|
|
||||||
|
//.ForMember(dest => dest.ChildGroups,
|
||||||
|
// opts => opts.Condition(src => src.Advanced == false))
|
||||||
|
|
||||||
|
//opts => opts.ResolveUsing<ItemFilterBlockGroupChildGroupsResolver>())
|
||||||
|
|
||||||
|
//opts => opts.MapFrom(from => from.ChildGroups))
|
||||||
|
|
||||||
|
//Mapper.AssertConfigurationIsValid();
|
||||||
|
|
||||||
var mainWindow = _container.Resolve<IMainWindow>();
|
var mainWindow = _container.Resolve<IMainWindow>();
|
||||||
mainWindow.Show();
|
mainWindow.Show();
|
||||||
|
|
||||||
//String[] arguments = Environment.GetCommandLineArgs();
|
|
||||||
|
|
||||||
//if (arguments.GetLength(0) <= 1) return;
|
|
||||||
//if (!arguments[1].EndsWith(".filter")) return;
|
|
||||||
|
|
||||||
//var filePathFormMainArgs = arguments[1];
|
|
||||||
//mainWindow.OpenScriptFromCommandLineArgument(filePathFormMainArgs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//private class ChildGroupsResolver : ValueResolver<ItemFilterBlockGroup, ItemFilterBlockGroupViewModel>
|
||||||
|
//{
|
||||||
|
// protected override ItemFilterBlockGroupViewModel ResolveCore(ItemFilterBlockGroup source)
|
||||||
|
// {
|
||||||
|
// return !source.Advanced ? Mapper.Map<ItemFilterBlockGroup, ItemFilterBlockGroupViewModel>(source) : null;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//private class ChildGroupsResolver :
|
||||||
|
// ValueResolver<List<ItemFilterBlockGroup>, ObservableCollection<ItemFilterBlockGroupViewModel>>
|
||||||
|
//{
|
||||||
|
// protected override ObservableCollection<ItemFilterBlockGroupViewModel> ResolveCore(List<ItemFilterBlockGroup> source)
|
||||||
|
// {
|
||||||
|
// var result = new ObservableCollection<ItemFilterBlockGroupViewModel>();
|
||||||
|
|
||||||
|
// if (source != null && source.Count > 0)
|
||||||
|
// {
|
||||||
|
|
||||||
|
// var filteredSource = source.Where(g => g.Advanced == false);
|
||||||
|
// foreach (var blockGroup in filteredSource)
|
||||||
|
// {
|
||||||
|
// result.Add(Mapper.Map<ItemFilterBlockGroup, ItemFilterBlockGroupViewModel>(blockGroup));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return result;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
protected override void OnExit(ExitEventArgs e)
|
protected override void OnExit(ExitEventArgs e)
|
||||||
{
|
{
|
||||||
_container.Dispose();
|
_container.Dispose();
|
||||||
|
|
|
@ -41,6 +41,12 @@
|
||||||
<ApplicationIcon>Resources\filtration.ico</ApplicationIcon>
|
<ApplicationIcon>Resources\filtration.ico</ApplicationIcon>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="AutoMapper">
|
||||||
|
<HintPath>..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="AutoMapper.Net4">
|
||||||
|
<HintPath>..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="Castle.Core">
|
<Reference Include="Castle.Core">
|
||||||
<HintPath>..\packages\Castle.Core.3.3.0\lib\net45\Castle.Core.dll</HintPath>
|
<HintPath>..\packages\Castle.Core.3.3.0\lib\net45\Castle.Core.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
@ -175,6 +181,8 @@
|
||||||
<Compile Include="UserControls\ItemPreviewControl.xaml.cs">
|
<Compile Include="UserControls\ItemPreviewControl.xaml.cs">
|
||||||
<DependentUpon>ItemPreviewControl.xaml</DependentUpon>
|
<DependentUpon>ItemPreviewControl.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Utilities\AutoMapperHelpers.cs" />
|
||||||
|
<Compile Include="Utilities\BlockGroupMapper.cs" />
|
||||||
<Compile Include="Utilities\LineReader.cs" />
|
<Compile Include="Utilities\LineReader.cs" />
|
||||||
<Compile Include="ViewModels\AvalonDockWorkspaceViewModel.cs" />
|
<Compile Include="ViewModels\AvalonDockWorkspaceViewModel.cs" />
|
||||||
<Compile Include="ViewModels\BlockGroupBrowserViewModel.cs" />
|
<Compile Include="ViewModels\BlockGroupBrowserViewModel.cs" />
|
||||||
|
@ -182,6 +190,7 @@
|
||||||
<Compile Include="ViewModels\IDocument.cs" />
|
<Compile Include="ViewModels\IDocument.cs" />
|
||||||
<Compile Include="ViewModels\IItemFilterScriptViewModelFactory.cs" />
|
<Compile Include="ViewModels\IItemFilterScriptViewModelFactory.cs" />
|
||||||
<Compile Include="ViewModels\IItemFilterBlockViewModelFactory.cs" />
|
<Compile Include="ViewModels\IItemFilterBlockViewModelFactory.cs" />
|
||||||
|
<Compile Include="ViewModels\ItemFilterBlockGroupViewModel.cs" />
|
||||||
<Compile Include="ViewModels\ItemFilterBlockViewModel.cs" />
|
<Compile Include="ViewModels\ItemFilterBlockViewModel.cs" />
|
||||||
<Compile Include="ViewModels\ItemFilterScriptViewModel.cs" />
|
<Compile Include="ViewModels\ItemFilterScriptViewModel.cs" />
|
||||||
<Compile Include="ViewModels\PaneViewModel.cs" />
|
<Compile Include="ViewModels\PaneViewModel.cs" />
|
||||||
|
@ -425,6 +434,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Import Project="$(XamlSpyInstallPath)MSBuild\FirstFloor.XamlSpy.WPF.targets" Condition="'$(XamlSpyInstallPath)' != '' and '$(Configuration)' == 'DEBUG'" />
|
<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')" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- 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.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
||||||
|
|
|
@ -1,29 +1,44 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using Filtration.Annotations;
|
|
||||||
|
|
||||||
namespace Filtration.Models
|
namespace Filtration.Models
|
||||||
{
|
{
|
||||||
internal class ItemFilterBlockGroup : INotifyPropertyChanged
|
internal class ItemFilterBlockGroup
|
||||||
{
|
{
|
||||||
private bool? _isChecked;
|
private bool _isChecked;
|
||||||
private bool _reentrancyCheck;
|
|
||||||
|
|
||||||
public ItemFilterBlockGroup(string groupName, ItemFilterBlockGroup parent, bool advanced = false)
|
public ItemFilterBlockGroup(string groupName, ItemFilterBlockGroup parent, bool advanced = false)
|
||||||
{
|
{
|
||||||
GroupName = groupName;
|
GroupName = groupName;
|
||||||
ParentGroup = parent;
|
ParentGroup = parent;
|
||||||
Advanced = advanced;
|
Advanced = advanced;
|
||||||
ChildGroups = new ObservableCollection<ItemFilterBlockGroup>();
|
ChildGroups = new List<ItemFilterBlockGroup>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler BlockGroupStatusChanged;
|
public event EventHandler BlockGroupStatusChanged;
|
||||||
|
|
||||||
public string GroupName { get; private set; }
|
public string GroupName { get; private set; }
|
||||||
public ItemFilterBlockGroup ParentGroup { get; private set; }
|
public ItemFilterBlockGroup ParentGroup { get; private set; }
|
||||||
public ObservableCollection<ItemFilterBlockGroup> ChildGroups { get; private set; }
|
public List<ItemFilterBlockGroup> ChildGroups { get; private set; }
|
||||||
|
public bool Advanced { get; private set; }
|
||||||
|
|
||||||
|
public bool IsChecked
|
||||||
|
{
|
||||||
|
get { return _isChecked; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _isChecked)
|
||||||
|
{
|
||||||
|
_isChecked = value;
|
||||||
|
// Raise an event to let blocks that have this block group assigned that
|
||||||
|
// they might need to change their Action due to the block group status changing.
|
||||||
|
if (BlockGroupStatusChanged != null)
|
||||||
|
{
|
||||||
|
BlockGroupStatusChanged.Invoke(null, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
|
@ -43,109 +58,5 @@ namespace Filtration.Models
|
||||||
|
|
||||||
return outputString;
|
return outputString;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Advanced { get; private set; }
|
|
||||||
|
|
||||||
public bool? IsChecked
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _isChecked;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_isChecked != value)
|
|
||||||
{
|
|
||||||
if (_reentrancyCheck)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_reentrancyCheck = true;
|
|
||||||
_isChecked = value;
|
|
||||||
UpdateCheckState();
|
|
||||||
OnPropertyChanged();
|
|
||||||
|
|
||||||
// Raise an event to let blocks that have this block group assigned that
|
|
||||||
// they might need to change their Action due to the block group status changing.
|
|
||||||
if (BlockGroupStatusChanged != null)
|
|
||||||
{
|
|
||||||
BlockGroupStatusChanged.Invoke(null, null);
|
|
||||||
}
|
|
||||||
_reentrancyCheck = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateCheckState()
|
|
||||||
{
|
|
||||||
// update all children:
|
|
||||||
if (ChildGroups.Count != 0)
|
|
||||||
{
|
|
||||||
UpdateChildrenCheckState();
|
|
||||||
}
|
|
||||||
|
|
||||||
// update parent item
|
|
||||||
if (ParentGroup != null)
|
|
||||||
{
|
|
||||||
var parentIsChecked = ParentGroup.DetermineCheckState();
|
|
||||||
ParentGroup.IsChecked = parentIsChecked;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateChildrenCheckState()
|
|
||||||
{
|
|
||||||
foreach (var childGroup in ChildGroups.Where(c => IsChecked != null && !c.Advanced))
|
|
||||||
{
|
|
||||||
childGroup.IsChecked = IsChecked;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool? DetermineCheckState()
|
|
||||||
{
|
|
||||||
var allChildrenChecked = ChildGroups.Count(x => x.IsChecked == true) == ChildGroups.Count;
|
|
||||||
if (allChildrenChecked)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var allChildrenUnchecked = ChildGroups.Count(x => x.IsChecked == false) == ChildGroups.Count;
|
|
||||||
if (allChildrenUnchecked)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ItemFilterBlockGroup Search(Func<ItemFilterBlockGroup, bool> predicate)
|
|
||||||
{
|
|
||||||
// if node is a leaf
|
|
||||||
if (ChildGroups == null || ChildGroups.Count == 0)
|
|
||||||
{
|
|
||||||
return predicate(this) ? this : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var results = ChildGroups
|
|
||||||
.Select(i => i.Search(predicate))
|
|
||||||
.Where(i => i != null).ToList();
|
|
||||||
|
|
||||||
if (results.Any())
|
|
||||||
{
|
|
||||||
var result = (ItemFilterBlockGroup)MemberwiseClone();
|
|
||||||
result.ChildGroups = new ObservableCollection<ItemFilterBlockGroup>(results);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
|
||||||
|
|
||||||
[NotifyPropertyChangedInvocator]
|
|
||||||
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
|
|
||||||
{
|
|
||||||
var handler = PropertyChanged;
|
|
||||||
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -433,6 +433,7 @@ namespace Filtration.Translators
|
||||||
|
|
||||||
private void AddStringListBlockItemToString(ref string targetString, StringListBlockItem blockItem)
|
private void AddStringListBlockItemToString(ref string targetString, StringListBlockItem blockItem)
|
||||||
{
|
{
|
||||||
|
|
||||||
var enumerable = blockItem.Items as IList<string> ?? blockItem.Items.ToList();
|
var enumerable = blockItem.Items as IList<string> ?? blockItem.Items.ToList();
|
||||||
if (enumerable.Count > 0)
|
if (enumerable.Count > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System.Linq;
|
||||||
|
using Filtration.ViewModels;
|
||||||
|
|
||||||
|
namespace Filtration.Utilities
|
||||||
|
{
|
||||||
|
internal class AutoMapperHelpers
|
||||||
|
{
|
||||||
|
public static void ItemFilterBlockGroupViewModelPostMap(ItemFilterBlockGroupViewModel viewModel)
|
||||||
|
{
|
||||||
|
foreach (var childViewModel in viewModel.ChildGroups)
|
||||||
|
{
|
||||||
|
ItemFilterBlockGroupViewModelPostMap(childViewModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (viewModel.ChildGroups.Count > 0)
|
||||||
|
{
|
||||||
|
if (viewModel.ChildGroups.All(g => g.IsChecked == true))
|
||||||
|
{
|
||||||
|
viewModel.IsChecked = true;
|
||||||
|
} else if (viewModel.ChildGroups.Any(g => g.IsChecked == true))
|
||||||
|
{
|
||||||
|
viewModel.IsChecked = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
viewModel.IsChecked = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using AutoMapper;
|
||||||
|
using Filtration.Models;
|
||||||
|
using Filtration.ViewModels;
|
||||||
|
|
||||||
|
namespace Filtration.Utilities
|
||||||
|
{
|
||||||
|
internal interface IBlockGroupMapper
|
||||||
|
{
|
||||||
|
ObservableCollection<ItemFilterBlockGroupViewModel> MapBlockGroupsToViewModels(
|
||||||
|
ObservableCollection<ItemFilterBlockGroup> blockGroups, bool showAdvanced);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class BlockGroupMapper : IBlockGroupMapper
|
||||||
|
{
|
||||||
|
public ObservableCollection<ItemFilterBlockGroupViewModel> MapBlockGroupsToViewModels(
|
||||||
|
ObservableCollection<ItemFilterBlockGroup> blockGroups, bool showAdvanced)
|
||||||
|
{
|
||||||
|
|
||||||
|
Mapper.Reset();
|
||||||
|
if (showAdvanced)
|
||||||
|
{
|
||||||
|
Mapper.CreateMap<ItemFilterBlockGroup, ItemFilterBlockGroupViewModel>()
|
||||||
|
.ForMember(dest => dest.IsChecked,
|
||||||
|
opts => opts.MapFrom(from => from.IsChecked))
|
||||||
|
.ForMember(dest => dest.SourceBlockGroup,
|
||||||
|
opts => opts.MapFrom(from => from));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Mapper.CreateMap<ItemFilterBlockGroup, ItemFilterBlockGroupViewModel>()
|
||||||
|
.ForMember(dest => dest.IsChecked,
|
||||||
|
opts => opts.MapFrom(from => from.IsChecked))
|
||||||
|
.ForMember(dest => dest.ChildGroups,
|
||||||
|
opts => opts.MapFrom(from => from.ChildGroups.Where(c => c.Advanced == false)))
|
||||||
|
.ForMember(dest => dest.SourceBlockGroup,
|
||||||
|
opts => opts.MapFrom(from => from));
|
||||||
|
}
|
||||||
|
|
||||||
|
var mappedViewModels = Mapper.Map<ObservableCollection<ItemFilterBlockGroupViewModel>>(blockGroups);
|
||||||
|
AutoMapperHelpers.ItemFilterBlockGroupViewModelPostMap(mappedViewModels.First());
|
||||||
|
return mappedViewModels.First().ChildGroups;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using Filtration.Models;
|
||||||
|
|
||||||
|
namespace Filtration.ViewModels
|
||||||
|
{
|
||||||
|
internal class ItemFilterBlockGroupViewModel : FiltrationViewModelBase
|
||||||
|
{
|
||||||
|
private bool? _isChecked;
|
||||||
|
private bool _reentrancyCheck;
|
||||||
|
private bool _postMapComplete;
|
||||||
|
|
||||||
|
public ItemFilterBlockGroupViewModel()
|
||||||
|
{
|
||||||
|
ChildGroups = new ObservableCollection<ItemFilterBlockGroupViewModel>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GroupName { get; internal set; }
|
||||||
|
public ItemFilterBlockGroupViewModel ParentGroup { get; internal set; }
|
||||||
|
public ObservableCollection<ItemFilterBlockGroupViewModel> ChildGroups { get; internal set; }
|
||||||
|
public bool Advanced { get; internal set; }
|
||||||
|
public ItemFilterBlockGroup SourceBlockGroup { get; internal set; }
|
||||||
|
|
||||||
|
public bool? IsChecked
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _isChecked;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (!_postMapComplete)
|
||||||
|
{
|
||||||
|
_isChecked = value;
|
||||||
|
_postMapComplete = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_isChecked != value)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (_reentrancyCheck)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_reentrancyCheck = true;
|
||||||
|
_isChecked = value;
|
||||||
|
UpdateCheckState();
|
||||||
|
RaisePropertyChanged();
|
||||||
|
SourceBlockGroup.IsChecked = value ?? false;
|
||||||
|
_reentrancyCheck = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateCheckState()
|
||||||
|
{
|
||||||
|
// update all children:
|
||||||
|
if (ChildGroups.Count != 0)
|
||||||
|
{
|
||||||
|
UpdateChildrenCheckState();
|
||||||
|
}
|
||||||
|
|
||||||
|
// update parent item
|
||||||
|
if (ParentGroup != null)
|
||||||
|
{
|
||||||
|
var parentIsChecked = ParentGroup.DetermineCheckState();
|
||||||
|
ParentGroup.IsChecked = parentIsChecked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateChildrenCheckState()
|
||||||
|
{
|
||||||
|
foreach (var childGroup in ChildGroups.Where(c => IsChecked != null))
|
||||||
|
{
|
||||||
|
childGroup.IsChecked = IsChecked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool? DetermineCheckState()
|
||||||
|
{
|
||||||
|
var allChildrenChecked = ChildGroups.Count(x => x.IsChecked == true) == ChildGroups.Count;
|
||||||
|
if (allChildrenChecked)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var allChildrenUnchecked = ChildGroups.Count(x => x.IsChecked == false) == ChildGroups.Count;
|
||||||
|
if (allChildrenUnchecked)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,7 +8,6 @@ using System.Windows;
|
||||||
using System.Windows.Data;
|
using System.Windows.Data;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Castle.Core.Internal;
|
using Castle.Core.Internal;
|
||||||
using Filtration.Enums;
|
|
||||||
using Filtration.Models;
|
using Filtration.Models;
|
||||||
using Filtration.Services;
|
using Filtration.Services;
|
||||||
using Filtration.Translators;
|
using Filtration.Translators;
|
||||||
|
@ -24,7 +23,7 @@ namespace Filtration.ViewModels
|
||||||
ItemFilterScript Script { get; }
|
ItemFilterScript Script { get; }
|
||||||
IItemFilterBlockViewModel SelectedBlockViewModel { get; set; }
|
IItemFilterBlockViewModel SelectedBlockViewModel { get; set; }
|
||||||
IItemFilterBlockViewModel SectionBrowserSelectedBlockViewModel { get; set; }
|
IItemFilterBlockViewModel SectionBrowserSelectedBlockViewModel { get; set; }
|
||||||
IEnumerable<ItemFilterBlockGroup> BlockGroups { get; }
|
ObservableCollection<ItemFilterBlockGroup> BlockGroups { get; }
|
||||||
IEnumerable<IItemFilterBlockViewModel> ItemFilterSectionViewModels { get; }
|
IEnumerable<IItemFilterBlockViewModel> ItemFilterSectionViewModels { get; }
|
||||||
Predicate<IItemFilterBlockViewModel> BlockFilterPredicate { get; set; }
|
Predicate<IItemFilterBlockViewModel> BlockFilterPredicate { get; set; }
|
||||||
bool IsDirty { get; }
|
bool IsDirty { get; }
|
||||||
|
@ -111,7 +110,6 @@ namespace Filtration.ViewModels
|
||||||
_itemFilterBlockViewModelsCollectionView.Filter = null;
|
_itemFilterBlockViewModelsCollectionView.Filter = null;
|
||||||
}
|
}
|
||||||
return _itemFilterBlockViewModels;
|
return _itemFilterBlockViewModels;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,8 +129,6 @@ namespace Filtration.ViewModels
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ObservableCollection<IItemFilterBlockViewModel> DisplayedItemFilterBlockViewModels { get; private set; }
|
|
||||||
|
|
||||||
public IEnumerable<IItemFilterBlockViewModel> ItemFilterSectionViewModels
|
public IEnumerable<IItemFilterBlockViewModel> ItemFilterSectionViewModels
|
||||||
{
|
{
|
||||||
get { return ItemFilterBlockViewModels.Where(b => b.Block.GetType() == typeof (ItemFilterSection)); }
|
get { return ItemFilterBlockViewModels.Where(b => b.Block.GetType() == typeof (ItemFilterSection)); }
|
||||||
|
@ -187,7 +183,7 @@ namespace Filtration.ViewModels
|
||||||
|
|
||||||
public ItemFilterScript Script { get; private set; }
|
public ItemFilterScript Script { get; private set; }
|
||||||
|
|
||||||
public IEnumerable<ItemFilterBlockGroup> BlockGroups
|
public ObservableCollection<ItemFilterBlockGroup> BlockGroups
|
||||||
{
|
{
|
||||||
get { return Script.ItemFilterBlockGroups; }
|
get { return Script.ItemFilterBlockGroups; }
|
||||||
}
|
}
|
||||||
|
@ -251,6 +247,12 @@ namespace Filtration.ViewModels
|
||||||
ItemFilterBlockViewModels.Add(vm);
|
ItemFilterBlockViewModels.Add(vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//BlockGroupViewModels =_blockGroupMapper.MapBlockGroupsToViewModels(Script.ItemFilterBlockGroups, false);
|
||||||
|
|
||||||
|
// Necessary to perform the AfterMap here instead of in the AutoMapper config due to the mapping being
|
||||||
|
// performed on a collection, but the postmap needs to be performed from the root BlockGroup.
|
||||||
|
//AutoMapperHelpers.ItemFilterBlockGroupViewModelPostMap(BlockGroupViewModels.First());
|
||||||
|
|
||||||
_filenameIsFake = newScript;
|
_filenameIsFake = newScript;
|
||||||
|
|
||||||
if (newScript)
|
if (newScript)
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
</ToolBar>
|
</ToolBar>
|
||||||
<ToolBar>
|
<ToolBar>
|
||||||
<Button ToolTip="Clear Filter" Command="{Binding ClearFilterCommand}" Content="{StaticResource ClearFilterIcon}" />
|
<Button ToolTip="Clear Filter" Command="{Binding ClearFilterCommand}" Content="{StaticResource ClearFilterIcon}" />
|
||||||
<!--<ToggleButton ToolTip="Show Advanced Block Groups" Command="{Binding ToggleShowAdvancedCommand}" CommandParameter="{Binding Path=IsChecked, RelativeSource={RelativeSource Self}}" Content="{StaticResource ShowAdvancedIcon}" />-->
|
<ToggleButton ToolTip="Show Advanced Block Groups" Command="{Binding ToggleShowAdvancedCommand}" CommandParameter="{Binding Path=IsChecked, RelativeSource={RelativeSource Self}}" Content="{StaticResource ShowAdvancedIcon}" />
|
||||||
</ToolBar>
|
</ToolBar>
|
||||||
</ToolBarTray>
|
</ToolBarTray>
|
||||||
<userControls:AutoScrollingListBox ItemsSource="{Binding ItemFilterBlockViewModels}"
|
<userControls:AutoScrollingListBox ItemsSource="{Binding ItemFilterBlockViewModels}"
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:models="clr-namespace:Filtration.Models"
|
|
||||||
xmlns:viewModels="clr-namespace:Filtration.ViewModels"
|
xmlns:viewModels="clr-namespace:Filtration.ViewModels"
|
||||||
xmlns:converters="clr-namespace:Filtration.Converters"
|
xmlns:converters="clr-namespace:Filtration.Converters"
|
||||||
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
|
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
|
||||||
|
@ -13,7 +12,6 @@
|
||||||
d:DesignHeight="300" d:DesignWidth="300">
|
d:DesignHeight="300" d:DesignWidth="300">
|
||||||
<UserControl.Resources>
|
<UserControl.Resources>
|
||||||
<converters:BlockGroupAdvancedColorConverter x:Key="BlockGroupAdvancedColorConverter" />
|
<converters:BlockGroupAdvancedColorConverter x:Key="BlockGroupAdvancedColorConverter" />
|
||||||
<converters:BlockGroupVisibilityConverter x:Key="BlockGroupVisibilityConverter" />
|
|
||||||
</UserControl.Resources>
|
</UserControl.Resources>
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
|
@ -24,12 +22,12 @@
|
||||||
<Button Height="20" Command="{Binding FilterToSelectedBlockGroupCommand}" Content="{StaticResource FilterIcon}" ToolTip="Filter to Selected Block Group" />
|
<Button Height="20" Command="{Binding FilterToSelectedBlockGroupCommand}" Content="{StaticResource FilterIcon}" ToolTip="Filter to Selected Block Group" />
|
||||||
</ToolBar>
|
</ToolBar>
|
||||||
|
|
||||||
<TreeView Grid.Row="1" ItemsSource="{Binding BlockGroups}" Name="TreeView">
|
<TreeView Grid.Row="1" ItemsSource="{Binding BlockGroupViewModels}" Name="TreeView">
|
||||||
<i:Interaction.Behaviors>
|
<i:Interaction.Behaviors>
|
||||||
<behaviors:BindableSelectedItemBehavior SelectedItem="{Binding SelectedBlockGroup, Mode=OneWayToSource}" />
|
<behaviors:BindableSelectedItemBehavior SelectedItem="{Binding SelectedBlockGroupViewModel, Mode=OneWayToSource}" />
|
||||||
</i:Interaction.Behaviors>
|
</i:Interaction.Behaviors>
|
||||||
<TreeView.Resources>
|
<TreeView.Resources>
|
||||||
<HierarchicalDataTemplate DataType="{x:Type models:ItemFilterBlockGroup}" ItemsSource="{Binding ChildGroups}">
|
<HierarchicalDataTemplate DataType="{x:Type viewModels:ItemFilterBlockGroupViewModel}" ItemsSource="{Binding ChildGroups}">
|
||||||
<WrapPanel>
|
<WrapPanel>
|
||||||
<CheckBox IsThreeState="True" IsChecked="{Binding IsChecked}" Click="BlockGroupCheckBox_Clicked" />
|
<CheckBox IsThreeState="True" IsChecked="{Binding IsChecked}" Click="BlockGroupCheckBox_Clicked" />
|
||||||
<TextBlock Text="{Binding GroupName}" Foreground="{Binding Advanced, Converter={StaticResource BlockGroupAdvancedColorConverter}}" />
|
<TextBlock Text="{Binding GroupName}" Foreground="{Binding Advanced, Converter={StaticResource BlockGroupAdvancedColorConverter}}" />
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using Castle.MicroKernel.SubSystems.Configuration;
|
using Castle.MicroKernel.SubSystems.Configuration;
|
||||||
using Castle.Windsor;
|
using Castle.Windsor;
|
||||||
using Filtration.Services;
|
using Filtration.Services;
|
||||||
|
using Filtration.Utilities;
|
||||||
|
|
||||||
namespace Filtration.WindsorInstallers
|
namespace Filtration.WindsorInstallers
|
||||||
{
|
{
|
||||||
|
@ -23,6 +24,11 @@ namespace Filtration.WindsorInstallers
|
||||||
Component.For<IStaticDataService>()
|
Component.For<IStaticDataService>()
|
||||||
.ImplementedBy<StaticDataService>()
|
.ImplementedBy<StaticDataService>()
|
||||||
.LifeStyle.Singleton);
|
.LifeStyle.Singleton);
|
||||||
|
|
||||||
|
container.Register(
|
||||||
|
Component.For<IBlockGroupMapper>()
|
||||||
|
.ImplementedBy<BlockGroupMapper>()
|
||||||
|
.LifeStyle.Singleton);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="AutoMapper" version="3.3.1" targetFramework="net451" />
|
||||||
<package id="AvalonDock" version="2.0.2000" targetFramework="net451" />
|
<package id="AvalonDock" version="2.0.2000" targetFramework="net451" />
|
||||||
<package id="Castle.Core" version="3.3.0" targetFramework="net451" />
|
<package id="Castle.Core" version="3.3.0" targetFramework="net451" />
|
||||||
<package id="Castle.Windsor" version="3.3.0" targetFramework="net451" />
|
<package id="Castle.Windsor" version="3.3.0" targetFramework="net451" />
|
||||||
|
|
Loading…
Reference in New Issue