Implemented script-level undo/redo (currently hidden in UI)

This commit is contained in:
Ben Wallis 2017-12-07 18:14:47 +00:00
parent fee2a4dd99
commit d84b17ced3
36 changed files with 888 additions and 384 deletions

182
.gitignore vendored
View File

@ -1,23 +1,36 @@
## Ignore Visual Studio temporary files, build results, and ## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons. ## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files # User-specific files
*.suo *.suo
*.user *.user
*.userosscache
*.sln.docstates *.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results # Build results
[Dd]ebug/ [Dd]ebug/
[Dd]ebugPublic/ [Dd]ebugPublic/
[Rr]elease/ [Rr]elease/
[Rr]eleases/
x64/ x64/
build/ x86/
bld/ bld/
[Bb]in/ [Bb]in/
[Oo]bj/ [Oo]bj/
[Ll]og/
# Roslyn cache directories # Visual Studio 2015/2017 cache/options directory
*.ide/ .vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results # MSTest test Results
[Tt]est[Rr]esult*/ [Tt]est[Rr]esult*/
@ -32,6 +45,19 @@ TestResult.xml
[Rr]eleasePS/ [Rr]eleasePS/
dlldata.c dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c *_i.c
*_p.c *_p.c
*_i.h *_i.h
@ -64,14 +90,21 @@ _Chutzpah*
ipch/ ipch/
*.aps *.aps
*.ncb *.ncb
*.opendb
*.opensdf *.opensdf
*.sdf *.sdf
*.cachefile *.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler # Visual Studio profiler
*.psess *.psess
*.vsp *.vsp
*.vspx *.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace # TFS 2012 Local Workspace
$tf/ $tf/
@ -84,7 +117,7 @@ _ReSharper*/
*.[Rr]e[Ss]harper *.[Rr]e[Ss]harper
*.DotSettings.user *.DotSettings.user
# JustCode is a .NET coding addin-in # JustCode is a .NET coding add-in
.JustCode .JustCode
# TeamCity is a build add-in # TeamCity is a build add-in
@ -93,9 +126,18 @@ _TeamCity*
# DotCover is a Code Coverage Tool # DotCover is a Code Coverage Tool
*.dotCover *.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch # NCrunch
_NCrunch_* _NCrunch_*
.*crunch*.local.xml .*crunch*.local.xml
nCrunchTemp_*
# MightyMoose # MightyMoose
*.mm.* *.mm.*
@ -123,42 +165,63 @@ publish/
# Publish Web Output # Publish Web Output
*.[Pp]ublish.xml *.[Pp]ublish.xml
*.azurePubxml *.azurePubxml
## TODO: Comment the next line if you want to checkin your # Note: Comment the next line if you want to checkin your web deploy settings,
## web deploy settings but do note that will include unencrypted # but database connection strings (with potential passwords) will be unencrypted
## passwords *.pubxml
#*.pubxml *.publishproj
# NuGet Packages Directory # Microsoft Azure Web App publish settings. Comment the next line if you want to
packages/* # checkin your Azure Web App publish settings, but sensitive information contained
## TODO: If the tool you use requires repositories.config # in these scripts will be unencrypted
## uncomment the next line PublishScripts/
#!packages/repositories.config
# Enable "build/" folder in the NuGet Packages folder since # NuGet Packages
# NuGet packages use it for MSBuild targets. *.nupkg
# This line needs to be after the ignore of the build folder # The packages folder can be ignored because of Package Restore
# (and the packages folder if the line above has been uncommented) **/[Pp]ackages/*
!packages/build/ # except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Windows Azure Build Output # Microsoft Azure Build Output
csx/ csx/
*.build.csdef *.build.csdef
# Windows Store app package directory # Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/ AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others # Others
sql/
*.Cache
ClientBin/ ClientBin/
[Ss]tyle[Cc]op.*
~$* ~$*
*~ *~
*.dbmdl *.dbmdl
*.dbproj.schemaview *.dbproj.schemaview
*.jfm
*.pfx *.pfx
*.publishsettings *.publishsettings
node_modules/ orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects # RIA/Silverlight projects
Generated_Code/ Generated_Code/
@ -174,6 +237,7 @@ UpgradeLog*.htm
# SQL Server files # SQL Server files
*.mdf *.mdf
*.ldf *.ldf
*.ndf
# Business Intelligence projects # Business Intelligence projects
*.rdl.data *.rdl.data
@ -183,7 +247,69 @@ UpgradeLog*.htm
# Microsoft Fakes # Microsoft Fakes
FakesAssemblies/ FakesAssemblies/
# LightSwitch generated files # GhostDoc plugin setting file
GeneratedArtifacts/ *.GhostDoc.xml
_Pvt_Extensions/
ModelManifest.xml # Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# TypeScript v1 declaration files
typings/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/

View File

@ -28,8 +28,7 @@ namespace Filtration.ObjectModel.Commands
public void ExecuteCommand(ICommand command) public void ExecuteCommand(ICommand command)
{ {
command.Execute(); command.Execute();
var undoableCommand = command as IUndoableCommand; if (command is IUndoableCommand undoableCommand)
if (undoableCommand != null)
{ {
_undoCommandStack.Push(undoableCommand); _undoCommandStack.Push(undoableCommand);
_redoCommandStack.Clear(); _redoCommandStack.Clear();

View File

@ -0,0 +1,37 @@
using System;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class AddBlockCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly IItemFilterBlockBase _addAfterItemFilterBlock;
private IItemFilterBlock _newItemFilterBlock;
public AddBlockCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase addAfterItemFilterBlock)
{
_itemFilterScript = itemFilterScript;
_addAfterItemFilterBlock = addAfterItemFilterBlock;
}
public void Execute()
{
_newItemFilterBlock = new ItemFilterBlock(_itemFilterScript);
if (_addAfterItemFilterBlock != null)
{
_itemFilterScript.ItemFilterBlocks.Insert(_itemFilterScript.ItemFilterBlocks.IndexOf(_addAfterItemFilterBlock) + 1, _newItemFilterBlock);
}
else
{
_itemFilterScript.ItemFilterBlocks.Add(_newItemFilterBlock);
}
}
public void Undo()
{
_itemFilterScript.ItemFilterBlocks.Remove(_newItemFilterBlock);
}
public void Redo() => Execute();
}
}

View File

@ -0,0 +1,37 @@
using System;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class AddCommentBlockCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly IItemFilterBlockBase _addAfterItemFilterBlock;
private IItemFilterCommentBlock _newItemFilterBlock;
public AddCommentBlockCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase addAfterItemFilterBlock)
{
_itemFilterScript = itemFilterScript;
_addAfterItemFilterBlock = addAfterItemFilterBlock;
}
public void Execute()
{
_newItemFilterBlock = new ItemFilterCommentBlock(_itemFilterScript);
if (_addAfterItemFilterBlock != null)
{
_itemFilterScript.ItemFilterBlocks.Insert(_itemFilterScript.ItemFilterBlocks.IndexOf(_addAfterItemFilterBlock) + 1, _newItemFilterBlock);
}
else
{
_itemFilterScript.ItemFilterBlocks.Add(_newItemFilterBlock);
}
}
public void Undo()
{
_itemFilterScript.ItemFilterBlocks.Remove(_newItemFilterBlock);
}
public void Redo() => Execute();
}
}

View File

@ -0,0 +1,39 @@
using System;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class MoveBlockDownCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly IItemFilterBlockBase _blockToMove;
private int _indexMovedFrom;
public MoveBlockDownCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase blockToMove)
{
_itemFilterScript = itemFilterScript;
_blockToMove = blockToMove;
}
public void Execute()
{
_indexMovedFrom = _itemFilterScript.ItemFilterBlocks.IndexOf(_blockToMove);
if (_indexMovedFrom >= _itemFilterScript.ItemFilterBlocks.Count)
{
throw new InvalidOperationException("Cannot move the bottom block down");
}
_itemFilterScript.ItemFilterBlocks.Remove(_blockToMove);
_itemFilterScript.ItemFilterBlocks.Insert(_indexMovedFrom + 1, _blockToMove);
}
public void Undo()
{
_itemFilterScript.ItemFilterBlocks.Remove(_blockToMove);
_itemFilterScript.ItemFilterBlocks.Insert(_indexMovedFrom, _blockToMove);
}
public void Redo() => Execute();
}
}

View File

@ -0,0 +1,30 @@
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class MoveBlockToBottomCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly IItemFilterBlockBase _blockToMove;
private int _indexMovedFrom;
public MoveBlockToBottomCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase blockToMove)
{
_itemFilterScript = itemFilterScript;
_blockToMove = blockToMove;
}
public void Execute()
{
_indexMovedFrom = _itemFilterScript.ItemFilterBlocks.IndexOf(_blockToMove);
_itemFilterScript.ItemFilterBlocks.Remove(_blockToMove);
_itemFilterScript.ItemFilterBlocks.Add(_blockToMove);
}
public void Undo()
{
_itemFilterScript.ItemFilterBlocks.Remove(_blockToMove);
_itemFilterScript.ItemFilterBlocks.Insert(_indexMovedFrom, _blockToMove);
}
public void Redo() => Execute();
}
}

View File

@ -0,0 +1,30 @@
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class MoveBlockToTopCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly IItemFilterBlockBase _blockToMove;
private int _indexMovedFrom;
public MoveBlockToTopCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase blockToMove)
{
_itemFilterScript = itemFilterScript;
_blockToMove = blockToMove;
}
public void Execute()
{
_indexMovedFrom = _itemFilterScript.ItemFilterBlocks.IndexOf(_blockToMove);
_itemFilterScript.ItemFilterBlocks.Remove(_blockToMove);
_itemFilterScript.ItemFilterBlocks.Insert(0, _blockToMove);
}
public void Undo()
{
_itemFilterScript.ItemFilterBlocks.Remove(_blockToMove);
_itemFilterScript.ItemFilterBlocks.Insert(_indexMovedFrom, _blockToMove);
}
public void Redo() => Execute();
}
}

View File

@ -0,0 +1,39 @@
using System;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class MoveBlockUpCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly IItemFilterBlockBase _blockToMove;
private int _indexMovedFrom;
public MoveBlockUpCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase blockToMove)
{
_itemFilterScript = itemFilterScript;
_blockToMove = blockToMove;
}
public void Execute()
{
_indexMovedFrom = _itemFilterScript.ItemFilterBlocks.IndexOf(_blockToMove);
if (_indexMovedFrom <= 0)
{
throw new InvalidOperationException("Cannot move the top block up");
}
_itemFilterScript.ItemFilterBlocks.Remove(_blockToMove);
_itemFilterScript.ItemFilterBlocks.Insert(_indexMovedFrom-1, _blockToMove);
}
public void Undo()
{
_itemFilterScript.ItemFilterBlocks.Remove(_blockToMove);
_itemFilterScript.ItemFilterBlocks.Insert(_indexMovedFrom, _blockToMove);
}
public void Redo() => Execute();
}
}

View File

@ -0,0 +1,37 @@
using System;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class PasteBlockCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly IItemFilterBlockBase _pastedItemFilterBlock;
private readonly IItemFilterBlockBase _addAfterItemFilterBlock;
public PasteBlockCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase pastedItemFilterBlock, IItemFilterBlockBase addAfterItemFilterBlock)
{
_itemFilterScript = itemFilterScript;
_pastedItemFilterBlock = pastedItemFilterBlock;
_addAfterItemFilterBlock = addAfterItemFilterBlock;
}
public void Execute()
{
if (_addAfterItemFilterBlock != null)
{
_itemFilterScript.ItemFilterBlocks.Insert(_itemFilterScript.ItemFilterBlocks.IndexOf(_addAfterItemFilterBlock) + 1, _pastedItemFilterBlock);
}
else
{
_itemFilterScript.ItemFilterBlocks.Add(_pastedItemFilterBlock);
}
}
public void Undo()
{
_itemFilterScript.ItemFilterBlocks.Remove(_pastedItemFilterBlock);
}
public void Redo() => Execute();
}
}

View File

@ -0,0 +1,29 @@
using System;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class RemoveBlockCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private IItemFilterBlockBase _removedItemFilterBlock;
private int _indexRemovedFrom;
public RemoveBlockCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase itemFilterBlockBase)
{
_itemFilterScript = itemFilterScript;
_removedItemFilterBlock = itemFilterBlockBase;
}
public void Execute()
{
_indexRemovedFrom = _itemFilterScript.ItemFilterBlocks.IndexOf(_removedItemFilterBlock);
_itemFilterScript.ItemFilterBlocks.Remove(_removedItemFilterBlock);
}
public void Undo()
{
_itemFilterScript.ItemFilterBlocks.Insert(_indexRemovedFrom, _removedItemFilterBlock);
}
public void Redo() => Execute();
}
}

View File

@ -0,0 +1,30 @@
using System;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class SetScriptDescriptionCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly string _newDescription;
private string _oldDescription;
public SetScriptDescriptionCommand(IItemFilterScript itemFilterScript, string newDescription)
{
_itemFilterScript = itemFilterScript;
_newDescription = newDescription;
}
public void Execute()
{
_oldDescription = _itemFilterScript.Description;
_itemFilterScript.Description = _newDescription;
}
public void Undo()
{
_itemFilterScript.Description = _oldDescription;
}
public void Redo() => Execute();
}
}

View File

@ -76,6 +76,15 @@
<Compile Include="BlockItemTypes\WidthBlockItem.cs" /> <Compile Include="BlockItemTypes\WidthBlockItem.cs" />
<Compile Include="Commands\CommandManager.cs" /> <Compile Include="Commands\CommandManager.cs" />
<Compile Include="Commands\ICommand.cs" /> <Compile Include="Commands\ICommand.cs" />
<Compile Include="Commands\ItemFilterScript\PasteBlockCommand.cs" />
<Compile Include="Commands\ItemFilterScript\MoveBlockToBottomCommand.cs" />
<Compile Include="Commands\ItemFilterScript\AddCommentBlockCommand.cs" />
<Compile Include="Commands\ItemFilterScript\MoveBlockDownCommand.cs" />
<Compile Include="Commands\ItemFilterScript\MoveBlockUpCommand.cs" />
<Compile Include="Commands\ItemFilterScript\MoveBlockToTopCommand.cs" />
<Compile Include="Commands\ItemFilterScript\SetScriptDescriptionCommand.cs" />
<Compile Include="Commands\ItemFilterScript\RemoveBlockCommand.cs" />
<Compile Include="Commands\ItemFilterScript\AddBlockCommand.cs" />
<Compile Include="Commands\IUndoableCommand.cs" /> <Compile Include="Commands\IUndoableCommand.cs" />
<Compile Include="Enums\BlockAction.cs" /> <Compile Include="Enums\BlockAction.cs" />
<Compile Include="Enums\BlockItemType.cs" /> <Compile Include="Enums\BlockItemType.cs" />

View File

@ -4,6 +4,7 @@ using System.Linq;
using System.Windows.Media; using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.BlockItemTypes;
using Filtration.ObjectModel.Commands;
using Filtration.ObjectModel.Enums; using Filtration.ObjectModel.Enums;
using Filtration.ObjectModel.Extensions; using Filtration.ObjectModel.Extensions;
@ -29,9 +30,20 @@ namespace Filtration.ObjectModel
{ {
} }
public class ItemFilterBlockBase : IItemFilterBlockBase public abstract class ItemFilterBlockBase : IItemFilterBlockBase
{ {
protected ItemFilterBlockBase()
{
}
protected ItemFilterBlockBase(IItemFilterScript parentScript)
{
CommandManager = parentScript.CommandManager;
ParentScript = parentScript;
}
public ICommandManager CommandManager { get; }
public IItemFilterScript ParentScript { get; set; }
} }
public interface IItemFilterCommentBlock : IItemFilterBlockBase public interface IItemFilterCommentBlock : IItemFilterBlockBase
@ -41,6 +53,10 @@ namespace Filtration.ObjectModel
public class ItemFilterCommentBlock : ItemFilterBlockBase, IItemFilterCommentBlock public class ItemFilterCommentBlock : ItemFilterBlockBase, IItemFilterCommentBlock
{ {
public ItemFilterCommentBlock(IItemFilterScript parentScript) : base(parentScript)
{
}
public string Comment { get; set; } public string Comment { get; set; }
} }
@ -48,14 +64,19 @@ namespace Filtration.ObjectModel
{ {
private ItemFilterBlockGroup _blockGroup; private ItemFilterBlockGroup _blockGroup;
public ItemFilterBlock() internal ItemFilterBlock()
{ {
ActionBlockItem = new ActionBlockItem(BlockAction.Show);
BlockItems = new ObservableCollection<IItemFilterBlockItem> { ActionBlockItem }; BlockItems = new ObservableCollection<IItemFilterBlockItem> { ActionBlockItem };
Enabled = true;
} }
public bool Enabled { get; set; } public ItemFilterBlock(IItemFilterScript parentScript) : base(parentScript)
{
BlockItems = new ObservableCollection<IItemFilterBlockItem> { ActionBlockItem };
}
public ICommandManager CommandManager { get; }
public bool Enabled { get; set; } = true;
public string Description { get; set; } public string Description { get; set; }
public ItemFilterBlockGroup BlockGroup public ItemFilterBlockGroup BlockGroup
@ -98,7 +119,7 @@ namespace Filtration.ObjectModel
} }
} }
public ActionBlockItem ActionBlockItem { get; } public ActionBlockItem ActionBlockItem { get; } = new ActionBlockItem(BlockAction.Show);
public ObservableCollection<IItemFilterBlockItem> BlockItems { get; } public ObservableCollection<IItemFilterBlockItem> BlockItems { get; }

View File

@ -37,6 +37,7 @@ namespace Filtration.ObjectModel
public class ItemFilterScript : IItemFilterScriptInternal public class ItemFilterScript : IItemFilterScriptInternal
{ {
private bool _isDirty; private bool _isDirty;
private string _description;
internal ItemFilterScript() internal ItemFilterScript()
{ {
@ -65,7 +66,18 @@ namespace Filtration.ObjectModel
public IItemFilterScriptSettings ItemFilterScriptSettings { get; } public IItemFilterScriptSettings ItemFilterScriptSettings { get; }
public string FilePath { get; set; } public string FilePath { get; set; }
public string Description { get; set; }
public string Description
{
get => _description;
set
{
if (value == _description) return;
_description = value;
OnPropertyChanged();
}
}
public DateTime DateModified { get; set; } public DateTime DateModified { get; set; }
public bool IsDirty public bool IsDirty

View File

@ -5,10 +5,11 @@ namespace Filtration.Parser.Interface.Services
{ {
public interface IItemFilterBlockTranslator public interface IItemFilterBlockTranslator
{ {
IItemFilterBlock TranslateStringToItemFilterBlock(string inputString, IItemFilterScriptSettings itemFilterScriptSettings); IItemFilterBlock TranslateStringToItemFilterBlock(string inputString, IItemFilterScript parentItemFilterScript, bool initialiseBlockGroupHierarchyBuilder = false);
IItemFilterCommentBlock TranslateStringToItemFilterCommentBlock(string inputString, IItemFilterScript parentItemFilterScript);
string TranslateItemFilterBlockToString(IItemFilterBlock block); string TranslateItemFilterBlockToString(IItemFilterBlock block);
void ReplaceAudioVisualBlockItemsFromString(ObservableCollection<IItemFilterBlockItem> blockItems, string inputString); void ReplaceAudioVisualBlockItemsFromString(ObservableCollection<IItemFilterBlockItem> blockItems, string inputString);
IItemFilterCommentBlock TranslateStringToItemFilterCommentBlock(string inputString);
string TranslateItemFilterCommentBlockToString(IItemFilterCommentBlock itemFilterCommentBlock); string TranslateItemFilterCommentBlockToString(IItemFilterCommentBlock itemFilterCommentBlock);
string TranslateItemFilterBlockBaseToString(IItemFilterBlockBase itemFilterBlockBase); string TranslateItemFilterBlockBaseToString(IItemFilterBlockBase itemFilterBlockBase);
} }

View File

@ -33,7 +33,7 @@ namespace Filtration.Parser.Tests.Services
var testInputString = "# This is a comment\r\n# Line 2 \r\n # Test"; var testInputString = "# This is a comment\r\n# Line 2 \r\n # Test";
//Act //Act
var result = _testUtility.Translator.TranslateStringToItemFilterCommentBlock(testInputString); var result = _testUtility.Translator.TranslateStringToItemFilterCommentBlock(testInputString, Mock.Of<IItemFilterScript>());
//Assert //Assert
Assert.AreEqual(" This is a comment\r\n Line 2 \r\n Test", result.Comment); Assert.AreEqual(" This is a comment\r\n Line 2 \r\n Test", result.Comment);
@ -52,7 +52,7 @@ namespace Filtration.Parser.Tests.Services
.Returns(inputBlockGroup); .Returns(inputBlockGroup);
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>(i => i.BlockGroupsEnabled)); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.BlockGroupsEnabled));
//Assert //Assert
Assert.IsTrue(string.IsNullOrEmpty(result.ActionBlockItem.Comment)); Assert.IsTrue(string.IsNullOrEmpty(result.ActionBlockItem.Comment));
@ -68,7 +68,7 @@ namespace Filtration.Parser.Tests.Services
var inputString = $"Show #{testInputExpectedComment}" + Environment.NewLine; var inputString = $"Show #{testInputExpectedComment}" + Environment.NewLine;
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>(i => i.BlockGroupsEnabled == false)); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.BlockGroupsEnabled == false));
//Assert //Assert
Assert.AreEqual(testInputExpectedComment, result.ActionBlockItem.Comment); Assert.AreEqual(testInputExpectedComment, result.ActionBlockItem.Comment);
@ -82,7 +82,7 @@ namespace Filtration.Parser.Tests.Services
" ItemLevel >= 55"; " ItemLevel >= 55";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(true, result.Enabled); Assert.AreEqual(true, result.Enabled);
@ -96,7 +96,7 @@ namespace Filtration.Parser.Tests.Services
" ItemLevel >= 55"; " ItemLevel >= 55";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(2, result.BlockItems.Count); Assert.AreEqual(2, result.BlockItems.Count);
@ -112,7 +112,7 @@ namespace Filtration.Parser.Tests.Services
" ItemLevel >= 55"; " ItemLevel >= 55";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ItemLevelBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is ItemLevelBlockItem));
@ -130,7 +130,7 @@ namespace Filtration.Parser.Tests.Services
// Act // Act
_testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Returns(inputBlockGroup).Verifiable(); _testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Returns(inputBlockGroup).Verifiable();
_testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>(i => i.BlockGroupsEnabled)); _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.BlockGroupsEnabled));
// Assert // Assert
Assert.AreEqual(true, inputBlockGroup.IsChecked); Assert.AreEqual(true, inputBlockGroup.IsChecked);
@ -145,7 +145,7 @@ namespace Filtration.Parser.Tests.Services
// Act // Act
_testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Returns(inputBlockGroup).Verifiable(); _testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Returns(inputBlockGroup).Verifiable();
_testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>(i => i.BlockGroupsEnabled)); _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.BlockGroupsEnabled));
// Assert // Assert
Assert.AreEqual(false, inputBlockGroup.IsChecked); Assert.AreEqual(false, inputBlockGroup.IsChecked);
@ -160,7 +160,7 @@ namespace Filtration.Parser.Tests.Services
// Act // Act
_testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Returns(inputBlockGroup).Verifiable(); _testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Returns(inputBlockGroup).Verifiable();
_testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>(i => i.BlockGroupsEnabled)); _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.BlockGroupsEnabled));
// Assert // Assert
_testUtility.MockBlockGroupHierarchyBuilder.Verify(); _testUtility.MockBlockGroupHierarchyBuilder.Verify();
@ -174,7 +174,7 @@ namespace Filtration.Parser.Tests.Services
// Act // Act
_testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Verifiable(); _testUtility.MockBlockGroupHierarchyBuilder.Setup(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>())).Verifiable();
_testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>(i => i.BlockGroupsEnabled)); _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.BlockGroupsEnabled));
// Assert // Assert
_testUtility.MockBlockGroupHierarchyBuilder.Verify(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>()), Times.Never); _testUtility.MockBlockGroupHierarchyBuilder.Verify(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>()), Times.Never);
@ -187,7 +187,7 @@ namespace Filtration.Parser.Tests.Services
var inputString = "Show #" + Environment.NewLine; var inputString = "Show #" + Environment.NewLine;
// Act // Act
_testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>(i => i.BlockGroupsEnabled)); _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.BlockGroupsEnabled));
// Assert // Assert
_testUtility.MockBlockGroupHierarchyBuilder.Verify(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>()), Times.Never); _testUtility.MockBlockGroupHierarchyBuilder.Verify(b => b.IntegrateStringListIntoBlockGroupHierarchy(It.IsAny<IEnumerable<string>>()), Times.Never);
@ -206,7 +206,7 @@ namespace Filtration.Parser.Tests.Services
.Returns(testBlockGroup) .Returns(testBlockGroup)
.Verifiable(); .Verifiable();
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>(i => i.BlockGroupsEnabled)); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.BlockGroupsEnabled));
// Assert // Assert
Assert.AreEqual(testBlockGroup, result.BlockGroup); Assert.AreEqual(testBlockGroup, result.BlockGroup);
@ -226,7 +226,7 @@ namespace Filtration.Parser.Tests.Services
.Returns(testBlockGroup) .Returns(testBlockGroup)
.Verifiable(); .Verifiable();
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>(i => i.BlockGroupsEnabled)); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.BlockGroupsEnabled));
// Assert // Assert
Assert.AreEqual(testBlockGroup, result.BlockGroup); Assert.AreEqual(testBlockGroup, result.BlockGroup);
@ -240,7 +240,7 @@ namespace Filtration.Parser.Tests.Services
var inputString = "Show # AAA - BBB - CCC" + Environment.NewLine; var inputString = "Show # AAA - BBB - CCC" + Environment.NewLine;
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>(i => i.BlockGroupsEnabled == false)); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.BlockGroupsEnabled == false));
// Assert // Assert
Assert.IsNull(result.BlockGroup); Assert.IsNull(result.BlockGroup);
@ -254,7 +254,7 @@ namespace Filtration.Parser.Tests.Services
var inputString = "Hide" + Environment.NewLine; var inputString = "Hide" + Environment.NewLine;
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ActionBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is ActionBlockItem));
@ -270,7 +270,7 @@ namespace Filtration.Parser.Tests.Services
" ItemLevel >= 55"; " ItemLevel >= 55";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual("This is a test Block", result.Description); Assert.AreEqual("This is a test Block", result.Description);
@ -290,7 +290,7 @@ namespace Filtration.Parser.Tests.Services
" ItemLevel >= 55"; " ItemLevel >= 55";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual("Second Line", result.Description); Assert.AreEqual("Second Line", result.Description);
@ -308,7 +308,7 @@ namespace Filtration.Parser.Tests.Services
" DropLevel = 40"; " DropLevel = 40";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
@ -326,7 +326,7 @@ namespace Filtration.Parser.Tests.Services
" Corrupted True"; " Corrupted True";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
@ -343,7 +343,7 @@ namespace Filtration.Parser.Tests.Services
" Identified True"; " Identified True";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
@ -360,7 +360,7 @@ namespace Filtration.Parser.Tests.Services
" Quality < 18"; " Quality < 18";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
@ -378,7 +378,7 @@ namespace Filtration.Parser.Tests.Services
" Rarity > Normal"; " Rarity > Normal";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
@ -396,7 +396,7 @@ namespace Filtration.Parser.Tests.Services
" Rarity Normal"; " Rarity Normal";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is RarityBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is RarityBlockItem));
@ -413,7 +413,7 @@ namespace Filtration.Parser.Tests.Services
@" Class ""Test Class 1"" ""TestOneWordClassInQuotes"" TestOneWordClassNotInQuotes ""Test Class 2"""; @" Class ""Test Class 1"" ""TestOneWordClassInQuotes"" TestOneWordClassNotInQuotes ""Test Class 2""";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ClassBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is ClassBlockItem));
@ -432,7 +432,7 @@ namespace Filtration.Parser.Tests.Services
@" BaseType ""Test Base Type 1"" ""TestOneWordBaseTypeInQuotes"" TestOneWordBaseTypeNotInQuotes ""Test BaseType 2"""; @" BaseType ""Test Base Type 1"" ""TestOneWordBaseTypeInQuotes"" TestOneWordBaseTypeNotInQuotes ""Test BaseType 2""";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is BaseTypeBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is BaseTypeBlockItem));
@ -451,7 +451,7 @@ namespace Filtration.Parser.Tests.Services
" Sockets > 2"; " Sockets > 2";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
@ -469,7 +469,7 @@ namespace Filtration.Parser.Tests.Services
" LinkedSockets > 1"; " LinkedSockets > 1";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
@ -487,7 +487,7 @@ namespace Filtration.Parser.Tests.Services
" Width = 1"; " Width = 1";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
@ -505,7 +505,7 @@ namespace Filtration.Parser.Tests.Services
" Height <= 3"; " Height <= 3";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
@ -523,7 +523,7 @@ namespace Filtration.Parser.Tests.Services
" Height <=3"; " Height <=3";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is HeightBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is HeightBlockItem));
@ -540,7 +540,7 @@ namespace Filtration.Parser.Tests.Services
" SocketGroup RRGB"; " SocketGroup RRGB";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is SocketGroupBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is SocketGroupBlockItem));
@ -558,7 +558,7 @@ namespace Filtration.Parser.Tests.Services
" SetTextColor 255 20 100"; " SetTextColor 255 20 100";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is TextColorBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is TextColorBlockItem));
@ -576,7 +576,7 @@ namespace Filtration.Parser.Tests.Services
" SetTextColor 65 0 255 12"; " SetTextColor 65 0 255 12";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is TextColorBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is TextColorBlockItem));
@ -595,7 +595,7 @@ namespace Filtration.Parser.Tests.Services
" SetBackgroundColor 255 20 100"; " SetBackgroundColor 255 20 100";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is BackgroundColorBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is BackgroundColorBlockItem));
@ -614,7 +614,7 @@ namespace Filtration.Parser.Tests.Services
" SetBorderColor 255 20 100"; " SetBorderColor 255 20 100";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is BorderColorBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is BorderColorBlockItem));
@ -633,8 +633,8 @@ namespace Filtration.Parser.Tests.Services
// Act // Act
Assert.DoesNotThrow(() => _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>())); Assert.DoesNotThrow(() => _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript));
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is BorderColorBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is BorderColorBlockItem));
@ -652,10 +652,9 @@ namespace Filtration.Parser.Tests.Services
" SetTextColor 255 20 100 # Rare Item Text"; " SetTextColor 255 20 100 # Rare Item Text";
var testComponent = new ThemeComponent(ThemeComponentType.TextColor, "Rare Item Text", new Color { R = 255, G = 20, B = 100}); var testComponent = new ThemeComponent(ThemeComponentType.TextColor, "Rare Item Text", new Color { R = 255, G = 20, B = 100});
var testInputThemeComponentCollection = new ThemeComponentCollection { testComponent }; var testInputThemeComponentCollection = new ThemeComponentCollection { testComponent };
var testInputItemFilterScriptSettings = Mock.Of<IItemFilterScriptSettings>(i => i.ThemeComponentCollection == testInputThemeComponentCollection);
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, testInputItemFilterScriptSettings); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.ThemeComponentCollection == testInputThemeComponentCollection));
// Assert // Assert
var blockItem = result.BlockItems.OfType<TextColorBlockItem>().First(); var blockItem = result.BlockItems.OfType<TextColorBlockItem>().First();
@ -673,7 +672,7 @@ namespace Filtration.Parser.Tests.Services
" SetFontSize 15"; " SetFontSize 15";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is FontSizeBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is FontSizeBlockItem));
@ -690,7 +689,7 @@ namespace Filtration.Parser.Tests.Services
" PlayAlertSound 4"; " PlayAlertSound 4";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is SoundBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is SoundBlockItem));
@ -708,7 +707,7 @@ namespace Filtration.Parser.Tests.Services
" PlayAlertSound 2 95"; " PlayAlertSound 2 95";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is SoundBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is SoundBlockItem));
@ -745,7 +744,7 @@ namespace Filtration.Parser.Tests.Services
" PlayAlertSound 3"; " PlayAlertSound 3";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual("Test filter with everything", result.Description); Assert.AreEqual("Test filter with everything", result.Description);
@ -833,7 +832,7 @@ namespace Filtration.Parser.Tests.Services
" Quality < 17"; " Quality < 17";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(2, result.BlockItems.Count(b => b is ItemLevelBlockItem)); Assert.AreEqual(2, result.BlockItems.Count(b => b is ItemLevelBlockItem));
@ -862,7 +861,7 @@ namespace Filtration.Parser.Tests.Services
" SetTextColor 255 20 100"; " SetTextColor 255 20 100";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is TextColorBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is TextColorBlockItem));
@ -883,7 +882,7 @@ namespace Filtration.Parser.Tests.Services
" SetFontSize 27" + Environment.NewLine; " SetFontSize 27" + Environment.NewLine;
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is FontSizeBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is FontSizeBlockItem));
@ -902,7 +901,7 @@ namespace Filtration.Parser.Tests.Services
" PlayAlertSound 2" + Environment.NewLine; " PlayAlertSound 2" + Environment.NewLine;
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is SoundBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is SoundBlockItem));
@ -920,7 +919,7 @@ namespace Filtration.Parser.Tests.Services
" SetBackgroundColor 255 20 100"; " SetBackgroundColor 255 20 100";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is BackgroundColorBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is BackgroundColorBlockItem));
@ -939,7 +938,7 @@ namespace Filtration.Parser.Tests.Services
" SetBorderColor 255 20 100"; " SetBorderColor 255 20 100";
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is BorderColorBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is BorderColorBlockItem));
@ -967,7 +966,7 @@ namespace Filtration.Parser.Tests.Services
_testUtility.TestBlock.BlockItems.Add(new WidthBlockItem(FilterPredicateOperator.Equal, 4)); _testUtility.TestBlock.BlockItems.Add(new WidthBlockItem(FilterPredicateOperator.Equal, 4));
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is RarityBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is RarityBlockItem));
@ -994,7 +993,7 @@ namespace Filtration.Parser.Tests.Services
_testUtility.TestBlock.BlockItems.Add(new WidthBlockItem(FilterPredicateOperator.Equal, 4)); _testUtility.TestBlock.BlockItems.Add(new WidthBlockItem(FilterPredicateOperator.Equal, 4));
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ActionBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is ActionBlockItem));
@ -1029,7 +1028,7 @@ namespace Filtration.Parser.Tests.Services
_testUtility.TestBlock.BlockItems.Add(new WidthBlockItem(FilterPredicateOperator.Equal, 4)); _testUtility.TestBlock.BlockItems.Add(new WidthBlockItem(FilterPredicateOperator.Equal, 4));
// Act // Act
var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, Mock.Of<IItemFilterScriptSettings>()); var result = _testUtility.Translator.TranslateStringToItemFilterBlock(inputString, _testUtility.MockItemFilterScript);
// Assert // Assert
Assert.AreEqual(1, result.BlockItems.Count(b => b is ActionBlockItem)); Assert.AreEqual(1, result.BlockItems.Count(b => b is ActionBlockItem));
@ -1870,6 +1869,7 @@ namespace Filtration.Parser.Tests.Services
// Mock setups // Mock setups
MockBlockGroupHierarchyBuilder = new Mock<IBlockGroupHierarchyBuilder>(); MockBlockGroupHierarchyBuilder = new Mock<IBlockGroupHierarchyBuilder>();
MockItemFilterScript = Mock.Of<IItemFilterScript>(i => i.ItemFilterScriptSettings.ThemeComponentCollection == new ThemeComponentCollection());
// Class under test instantiation // Class under test instantiation
Translator = new ItemFilterBlockTranslator(MockBlockGroupHierarchyBuilder.Object); Translator = new ItemFilterBlockTranslator(MockBlockGroupHierarchyBuilder.Object);
@ -1878,6 +1878,8 @@ namespace Filtration.Parser.Tests.Services
public ItemFilterBlock TestBlock { get; set; } public ItemFilterBlock TestBlock { get; set; }
public Mock<IBlockGroupHierarchyBuilder> MockBlockGroupHierarchyBuilder { get; } public Mock<IBlockGroupHierarchyBuilder> MockBlockGroupHierarchyBuilder { get; }
public ItemFilterBlockTranslator Translator { get; } public ItemFilterBlockTranslator Translator { get; }
public IItemFilterScript MockItemFilterScript { get; }
} }
} }
} }

View File

@ -40,7 +40,7 @@ namespace Filtration.Parser.Tests.Services
// Assert // Assert
Assert.AreEqual(5, script.ItemFilterBlocks.Count); Assert.AreEqual(5, script.ItemFilterBlocks.Count);
mockItemFilterBlockTranslator.Verify(t => t.TranslateStringToItemFilterBlock(It.IsAny<string>(), It.IsAny<IItemFilterScriptSettings>())); mockItemFilterBlockTranslator.Verify(t => t.TranslateStringToItemFilterBlock(It.IsAny<string>(), It.IsAny<IItemFilterScript>(), false));
} }
[Test] [Test]

View File

@ -30,9 +30,9 @@ namespace Filtration.Parser.Services
} }
// Converts a string into an ItemFilterCommentBlock maintaining newlines and spaces but removing # characters // Converts a string into an ItemFilterCommentBlock maintaining newlines and spaces but removing # characters
public IItemFilterCommentBlock TranslateStringToItemFilterCommentBlock(string inputString) public IItemFilterCommentBlock TranslateStringToItemFilterCommentBlock(string inputString, IItemFilterScript parentItemFilterScript)
{ {
var itemFilterCommentBlock = new ItemFilterCommentBlock(); var itemFilterCommentBlock = new ItemFilterCommentBlock(parentItemFilterScript);
foreach (var line in new LineReader(() => new StringReader(inputString))) foreach (var line in new LineReader(() => new StringReader(inputString)))
{ {
@ -47,10 +47,15 @@ namespace Filtration.Parser.Services
// This method converts a string into a ItemFilterBlock. This is used for pasting ItemFilterBlocks // This method converts a string into a ItemFilterBlock. This is used for pasting ItemFilterBlocks
// and reading ItemFilterScripts from a file. // and reading ItemFilterScripts from a file.
public IItemFilterBlock TranslateStringToItemFilterBlock(string inputString, IItemFilterScriptSettings itemFilterScriptSettings) public IItemFilterBlock TranslateStringToItemFilterBlock(string inputString, IItemFilterScript parentItemFilterScript, bool initialiseBlockGroupHierarchyBuilder = false)
{ {
_masterComponentCollection = itemFilterScriptSettings.ThemeComponentCollection; if (initialiseBlockGroupHierarchyBuilder)
var block = new ItemFilterBlock(); {
_blockGroupHierarchyBuilder.Initialise(parentItemFilterScript.ItemFilterBlockGroups.First());
}
_masterComponentCollection = parentItemFilterScript.ItemFilterScriptSettings.ThemeComponentCollection;
var block = new ItemFilterBlock(parentItemFilterScript);
var showHideFound = false; var showHideFound = false;
foreach (var line in new LineReader(() => new StringReader(inputString))) foreach (var line in new LineReader(() => new StringReader(inputString)))
@ -78,7 +83,7 @@ namespace Filtration.Parser.Services
// If block groups are enabled for this script, the comment after Show/Hide is parsed as a block // If block groups are enabled for this script, the comment after Show/Hide is parsed as a block
// group hierarchy, if block groups are disabled it is preserved as a simple text comment. // group hierarchy, if block groups are disabled it is preserved as a simple text comment.
if (itemFilterScriptSettings.BlockGroupsEnabled) if (parentItemFilterScript.ItemFilterScriptSettings.BlockGroupsEnabled)
{ {
AddBlockGroupToBlock(block, trimmedLine); AddBlockGroupToBlock(block, trimmedLine);
} }

View File

@ -154,11 +154,11 @@ namespace Filtration.Parser.Services
if (boundary.Value.BoundaryType == ItemFilterBlockBoundaryType.ItemFilterBlock) if (boundary.Value.BoundaryType == ItemFilterBlockBoundaryType.ItemFilterBlock)
{ {
script.ItemFilterBlocks.Add(_blockTranslator.TranslateStringToItemFilterBlock(blockString, script.ItemFilterScriptSettings)); script.ItemFilterBlocks.Add(_blockTranslator.TranslateStringToItemFilterBlock(blockString, script));
} }
else else
{ {
script.ItemFilterBlocks.Add(_blockTranslator.TranslateStringToItemFilterCommentBlock(blockString)); script.ItemFilterBlocks.Add(_blockTranslator.TranslateStringToItemFilterCommentBlock(blockString, script));
} }
} }

View File

@ -6,6 +6,7 @@ using Filtration.ObjectModel.Factories;
using Filtration.Repositories; using Filtration.Repositories;
using Filtration.Services; using Filtration.Services;
using Filtration.ViewModels; using Filtration.ViewModels;
using Filtration.ViewModels.Factories;
using FluentAssertions; using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;

View File

@ -184,11 +184,14 @@
<Compile Include="Utility\RoutedCommandHandler.cs" /> <Compile Include="Utility\RoutedCommandHandler.cs" />
<Compile Include="Utility\RoutedCommandHandlers.cs" /> <Compile Include="Utility\RoutedCommandHandlers.cs" />
<Compile Include="ViewModels\AvalonDockWorkspaceViewModel.cs" /> <Compile Include="ViewModels\AvalonDockWorkspaceViewModel.cs" />
<Compile Include="ViewModels\IItemFilterCommentBlockViewModelFactory.cs" /> <Compile Include="ViewModels\Factories\IItemFilterCommentBlockViewModelFactory.cs" />
<Compile Include="ViewModels\Factories\ItemFilterBlockBaseViewModelFactory.cs" />
<Compile Include="ViewModels\ItemFilterBlockViewModelBase.cs" />
<Compile Include="ViewModels\ItemFilterCommentBlockViewModel.cs" />
<Compile Include="ViewModels\SettingsPageViewModel.cs" /> <Compile Include="ViewModels\SettingsPageViewModel.cs" />
<Compile Include="ViewModels\ToolPanes\BlockGroupBrowserViewModel.cs" /> <Compile Include="ViewModels\ToolPanes\BlockGroupBrowserViewModel.cs" />
<Compile Include="ViewModels\IItemFilterScriptViewModelFactory.cs" /> <Compile Include="ViewModels\Factories\IItemFilterScriptViewModelFactory.cs" />
<Compile Include="ViewModels\IItemFilterBlockViewModelFactory.cs" /> <Compile Include="ViewModels\Factories\IItemFilterBlockViewModelFactory.cs" />
<Compile Include="ViewModels\ItemFilterBlockGroupViewModel.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" />
@ -443,6 +446,8 @@
<Resource Include="Resources\Icons\ThemeComponentDelete.ico" /> <Resource Include="Resources\Icons\ThemeComponentDelete.ico" />
<Resource Include="Resources\Icons\standby_disabled_icon.png" /> <Resource Include="Resources\Icons\standby_disabled_icon.png" />
<Resource Include="Resources\Icons\standby_enabled_icon.png" /> <Resource Include="Resources\Icons\standby_enabled_icon.png" />
<Resource Include="Resources\Icons\redo_icon.png" />
<Resource Include="Resources\Icons\undo_icon.png" />
<Content Include="Resources\ItemBaseTypes.txt" /> <Content Include="Resources\ItemBaseTypes.txt" />
<Content Include="Resources\ItemClasses.txt" /> <Content Include="Resources\ItemClasses.txt" />
</ItemGroup> </ItemGroup>

View File

@ -3,6 +3,7 @@ using Filtration.ObjectModel;
using Filtration.ObjectModel.Factories; using Filtration.ObjectModel.Factories;
using Filtration.Services; using Filtration.Services;
using Filtration.ViewModels; using Filtration.ViewModels;
using Filtration.ViewModels.Factories;
namespace Filtration.Repositories namespace Filtration.Repositories
{ {

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

View File

@ -1,4 +1,4 @@
namespace Filtration.ViewModels namespace Filtration.ViewModels.Factories
{ {
internal interface IItemFilterBlockViewModelFactory internal interface IItemFilterBlockViewModelFactory
{ {

View File

@ -1,4 +1,4 @@
namespace Filtration.ViewModels namespace Filtration.ViewModels.Factories
{ {
internal interface IItemFilterCommentBlockViewModelFactory internal interface IItemFilterCommentBlockViewModelFactory
{ {

View File

@ -1,4 +1,4 @@
namespace Filtration.ViewModels namespace Filtration.ViewModels.Factories
{ {
internal interface IItemFilterScriptViewModelFactory internal interface IItemFilterScriptViewModelFactory
{ {

View File

@ -0,0 +1,37 @@
using System;
using Filtration.ObjectModel;
namespace Filtration.ViewModels.Factories
{
internal interface IItemFilterBlockBaseViewModelFactory
{
IItemFilterBlockViewModelBase Create(IItemFilterBlockBase itemFilterBlockBase);
}
internal class ItemFilterBlockBaseViewModelFactory : IItemFilterBlockBaseViewModelFactory
{
private readonly IItemFilterBlockViewModelFactory _itemFilterBlockViewModelFactory;
private readonly IItemFilterCommentBlockViewModelFactory _itemFilterCommentBlockViewModelFactory;
public ItemFilterBlockBaseViewModelFactory(IItemFilterBlockViewModelFactory itemFilterBlockViewModelFactory,
IItemFilterCommentBlockViewModelFactory itemFilterCommentBlockViewModelFactory)
{
_itemFilterBlockViewModelFactory = itemFilterBlockViewModelFactory;
_itemFilterCommentBlockViewModelFactory = itemFilterCommentBlockViewModelFactory;
}
public IItemFilterBlockViewModelBase Create(IItemFilterBlockBase itemFilterBlockBase)
{
if (itemFilterBlockBase is IItemFilterBlock)
{
return _itemFilterBlockViewModelFactory.Create();
}
if (itemFilterBlockBase is IItemFilterCommentBlock)
{
return _itemFilterCommentBlockViewModelFactory.Create();
}
throw new InvalidOperationException("Unknown IItemFilterBlockBase type");
}
}
}

View File

@ -9,7 +9,6 @@ using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.BlockItemTypes;
using Filtration.Services; using Filtration.Services;
using Filtration.Views; using Filtration.Views;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.CommandWpf; using GalaSoft.MvvmLight.CommandWpf;
using Xceed.Wpf.Toolkit; using Xceed.Wpf.Toolkit;
@ -17,7 +16,6 @@ namespace Filtration.ViewModels
{ {
internal interface IItemFilterBlockViewModel : IItemFilterBlockViewModelBase internal interface IItemFilterBlockViewModel : IItemFilterBlockViewModelBase
{ {
void Initialise(IItemFilterBlock itemFilterBlock, ItemFilterScriptViewModel parentScriptViewModel);
bool IsExpanded { get; set; } bool IsExpanded { get; set; }
IItemFilterBlock Block { get; } IItemFilterBlock Block { get; }
bool BlockEnabled { get; set; } bool BlockEnabled { get; set; }
@ -25,72 +23,12 @@ namespace Filtration.ViewModels
void RefreshBlockPreview(); void RefreshBlockPreview();
} }
internal interface IItemFilterBlockViewModelBase
{
IItemFilterBlockBase BaseBlock { get; }
bool IsDirty { get; set; }
event EventHandler BlockBecameDirty;
}
internal abstract class ItemFilterBlockViewModelBase : ViewModelBase, IItemFilterBlockViewModelBase
{
private bool _isDirty;
protected void Initialise(IItemFilterBlockBase itemfilterBlock)
{
BaseBlock = itemfilterBlock;
}
public event EventHandler BlockBecameDirty;
public IItemFilterBlockBase BaseBlock { get; protected set; }
public bool IsDirty
{
get => _isDirty;
set
{
if (value != _isDirty)
{
_isDirty = value;
RaisePropertyChanged();
BlockBecameDirty?.Invoke(this, EventArgs.Empty);
}
}
}
}
internal interface IItemFilterCommentBlockViewModel : IItemFilterBlockViewModelBase
{
void Initialise(IItemFilterCommentBlock itemFilterCommentBlock);
IItemFilterCommentBlock ItemFilterCommentBlock { get; }
string Comment { get; }
}
internal class ItemFilterCommentBlockViewModel : ItemFilterBlockViewModelBase, IItemFilterCommentBlockViewModel
{
public ItemFilterCommentBlockViewModel()
{
}
public void Initialise(IItemFilterCommentBlock itemFilterCommentBlock)
{
ItemFilterCommentBlock = itemFilterCommentBlock;
BaseBlock = itemFilterCommentBlock;
}
public IItemFilterCommentBlock ItemFilterCommentBlock { get; private set; }
public string Comment => ItemFilterCommentBlock.Comment;
}
internal class ItemFilterBlockViewModel : ItemFilterBlockViewModelBase, IItemFilterBlockViewModel internal class ItemFilterBlockViewModel : ItemFilterBlockViewModelBase, IItemFilterBlockViewModel
{ {
private readonly IStaticDataService _staticDataService; private readonly IStaticDataService _staticDataService;
private readonly IReplaceColorsViewModel _replaceColorsViewModel; private readonly IReplaceColorsViewModel _replaceColorsViewModel;
private readonly MediaPlayer _mediaPlayer = new MediaPlayer(); private readonly MediaPlayer _mediaPlayer = new MediaPlayer();
private ItemFilterScriptViewModel _parentScriptViewModel; private IItemFilterScriptViewModel _parentScriptViewModel;
private bool _displaySettingsPopupOpen; private bool _displaySettingsPopupOpen;
private bool _isExpanded; private bool _isExpanded;
@ -120,8 +58,9 @@ namespace Filtration.ViewModels
PlaySoundCommand = new RelayCommand(OnPlaySoundCommand, () => HasSound); PlaySoundCommand = new RelayCommand(OnPlaySoundCommand, () => HasSound);
} }
public void Initialise(IItemFilterBlock itemFilterBlock, ItemFilterScriptViewModel parentScriptViewModel) public override void Initialise(IItemFilterBlockBase itemFilterBlockBase, IItemFilterScriptViewModel parentScriptViewModel)
{ {
var itemFilterBlock = itemFilterBlockBase as IItemFilterBlock;
if (itemFilterBlock == null || parentScriptViewModel == null) if (itemFilterBlock == null || parentScriptViewModel == null)
{ {
throw new ArgumentNullException(nameof(itemFilterBlock)); throw new ArgumentNullException(nameof(itemFilterBlock));
@ -139,7 +78,7 @@ namespace Filtration.ViewModels
} }
base.Initialise(itemFilterBlock); base.Initialise(itemFilterBlock, parentScriptViewModel);
} }
public RelayCommand CopyBlockCommand { get; } public RelayCommand CopyBlockCommand { get; }
@ -350,7 +289,7 @@ namespace Filtration.ViewModels
private void OnAddSectionCommand() private void OnAddSectionCommand()
{ {
_parentScriptViewModel.AddSection(this); _parentScriptViewModel.AddCommentBlock(this);
} }
private void OnDeleteBlockCommand() private void OnDeleteBlockCommand()

View File

@ -0,0 +1,42 @@
using System;
using Filtration.ObjectModel;
using GalaSoft.MvvmLight;
namespace Filtration.ViewModels
{
internal interface IItemFilterBlockViewModelBase
{
void Initialise(IItemFilterBlockBase itemfilterBlock, IItemFilterScriptViewModel itemFilterScriptViewModel);
IItemFilterBlockBase BaseBlock { get; }
bool IsDirty { get; set; }
event EventHandler BlockBecameDirty;
}
internal abstract class ItemFilterBlockViewModelBase : ViewModelBase, IItemFilterBlockViewModelBase
{
private bool _isDirty;
public virtual void Initialise(IItemFilterBlockBase itemfilterBlock, IItemFilterScriptViewModel itemFilterScriptViewModel)
{
BaseBlock = itemfilterBlock;
}
public event EventHandler BlockBecameDirty;
public IItemFilterBlockBase BaseBlock { get; protected set; }
public bool IsDirty
{
get => _isDirty;
set
{
if (value != _isDirty)
{
_isDirty = value;
RaisePropertyChanged();
BlockBecameDirty?.Invoke(this, EventArgs.Empty);
}
}
}
}
}

View File

@ -0,0 +1,29 @@
using Filtration.ObjectModel;
namespace Filtration.ViewModels
{
internal interface IItemFilterCommentBlockViewModel : IItemFilterBlockViewModelBase
{
IItemFilterCommentBlock ItemFilterCommentBlock { get; }
string Comment { get; }
}
internal class ItemFilterCommentBlockViewModel : ItemFilterBlockViewModelBase, IItemFilterCommentBlockViewModel
{
public ItemFilterCommentBlockViewModel()
{
}
public override void Initialise(IItemFilterBlockBase itemfilterBlock, IItemFilterScriptViewModel itemFilterScriptViewModel)
{
ItemFilterCommentBlock = itemfilterBlock as IItemFilterCommentBlock;
BaseBlock = ItemFilterCommentBlock;
base.Initialise(itemfilterBlock, itemFilterScriptViewModel);
}
public IItemFilterCommentBlock ItemFilterCommentBlock { get; private set; }
public string Comment => ItemFilterCommentBlock.Comment;
}
}

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
@ -15,8 +16,11 @@ using Filtration.Common.ViewModels;
using Filtration.Interface; using Filtration.Interface;
using Filtration.ObjectModel; using Filtration.ObjectModel;
using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Commands;
using Filtration.ObjectModel.Commands.ItemFilterScript;
using Filtration.Parser.Interface.Services; using Filtration.Parser.Interface.Services;
using Filtration.Services; using Filtration.Services;
using Filtration.ViewModels.Factories;
using GalaSoft.MvvmLight.CommandWpf; using GalaSoft.MvvmLight.CommandWpf;
using GalaSoft.MvvmLight.Messaging; using GalaSoft.MvvmLight.Messaging;
using NLog; using NLog;
@ -59,21 +63,25 @@ namespace Filtration.ViewModels
RelayCommand<bool> ToggleShowAdvancedCommand { get; } RelayCommand<bool> ToggleShowAdvancedCommand { get; }
RelayCommand ClearFilterCommand { get; } RelayCommand ClearFilterCommand { get; }
void AddSection(IItemFilterBlockViewModelBase targetBlockViewModel); void AddCommentBlock(IItemFilterBlockViewModelBase targetBlockViewModel);
void AddBlock(IItemFilterBlockViewModelBase targetBlockViewModel); void AddBlock(IItemFilterBlockViewModelBase targetBlockViewModel);
void CopyBlock(IItemFilterBlockViewModelBase targetBlockViewModel); void CopyBlock(IItemFilterBlockViewModelBase targetBlockViewModel);
void CopyBlockStyle(IItemFilterBlockViewModel targetBlockViewModel); void CopyBlockStyle(IItemFilterBlockViewModel targetBlockViewModel);
void PasteBlock(IItemFilterBlockViewModelBase targetBlockViewModel); void PasteBlock(IItemFilterBlockViewModelBase targetBlockViewModel);
void PasteBlockStyle(IItemFilterBlockViewModel targetBlockViewModel); void PasteBlockStyle(IItemFilterBlockViewModel targetBlockViewModel);
void DeleteBlock(IItemFilterBlockViewModelBase targetBlockViewModelBase);
void MoveBlockToTop(IItemFilterBlockViewModelBase targetBlockViewModelBase);
void MoveBlockUp(IItemFilterBlockViewModelBase targetBlockViewModelBase);
void MoveBlockDown(IItemFilterBlockViewModelBase targetBlockViewModelBase);
void MoveBlockToBottom(IItemFilterBlockViewModelBase targetBlockViewModelBase);
} }
internal class ItemFilterScriptViewModel : PaneViewModel, IItemFilterScriptViewModel internal class ItemFilterScriptViewModel : PaneViewModel, IItemFilterScriptViewModel
{ {
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly IItemFilterBlockViewModelFactory _itemFilterBlockViewModelFactory; private readonly IItemFilterBlockBaseViewModelFactory _itemFilterBlockBaseViewModelFactory;
private readonly IItemFilterBlockTranslator _blockTranslator; private readonly IItemFilterBlockTranslator _blockTranslator;
private readonly IItemFilterCommentBlockViewModelFactory _itemFilterCommentBlockViewModelFactory;
private readonly IAvalonDockWorkspaceViewModel _avalonDockWorkspaceViewModel; private readonly IAvalonDockWorkspaceViewModel _avalonDockWorkspaceViewModel;
private readonly IItemFilterPersistenceService _persistenceService; private readonly IItemFilterPersistenceService _persistenceService;
private readonly IMessageBoxService _messageBoxService; private readonly IMessageBoxService _messageBoxService;
@ -86,19 +94,18 @@ namespace Filtration.ViewModels
private readonly ObservableCollection<IItemFilterBlockViewModelBase> _itemFilterBlockViewModels; private readonly ObservableCollection<IItemFilterBlockViewModelBase> _itemFilterBlockViewModels;
private ICollectionView _itemFilterBlockViewModelsCollectionView; private ICollectionView _itemFilterBlockViewModelsCollectionView;
private Predicate<IItemFilterBlockViewModel> _blockFilterPredicate; private Predicate<IItemFilterBlockViewModel> _blockFilterPredicate;
private ICommandManager _scriptCommandManager;
public ItemFilterScriptViewModel(IItemFilterBlockViewModelFactory itemFilterBlockViewModelFactory, public ItemFilterScriptViewModel(IItemFilterBlockBaseViewModelFactory itemFilterBlockBaseViewModelFactory,
IItemFilterBlockTranslator blockTranslator, IItemFilterBlockTranslator blockTranslator,
IItemFilterCommentBlockViewModelFactory itemFilterCommentBlockViewModelFactory,
IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel, IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel,
IItemFilterPersistenceService persistenceService, IItemFilterPersistenceService persistenceService,
IMessageBoxService messageBoxService, IMessageBoxService messageBoxService,
IClipboardService clipboardService, IClipboardService clipboardService,
IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder) IBlockGroupHierarchyBuilder blockGroupHierarchyBuilder)
{ {
_itemFilterBlockViewModelFactory = itemFilterBlockViewModelFactory; _itemFilterBlockBaseViewModelFactory = itemFilterBlockBaseViewModelFactory;
_blockTranslator = blockTranslator; _blockTranslator = blockTranslator;
_itemFilterCommentBlockViewModelFactory = itemFilterCommentBlockViewModelFactory;
_avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel; _avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel;
_avalonDockWorkspaceViewModel.ActiveDocumentChanged += OnActiveDocumentChanged; _avalonDockWorkspaceViewModel.ActiveDocumentChanged += OnActiveDocumentChanged;
_persistenceService = persistenceService; _persistenceService = persistenceService;
@ -116,12 +123,12 @@ namespace Filtration.ViewModels
ClearFilterCommand = new RelayCommand(OnClearFilterCommand, () => BlockFilterPredicate != null); ClearFilterCommand = new RelayCommand(OnClearFilterCommand, () => BlockFilterPredicate != null);
CloseCommand = new RelayCommand(async () => await OnCloseCommand()); CloseCommand = new RelayCommand(async () => await OnCloseCommand());
DeleteBlockCommand = new RelayCommand(OnDeleteBlockCommand, () => SelectedBlockViewModel != null); DeleteBlockCommand = new RelayCommand(OnDeleteBlockCommand, () => SelectedBlockViewModel != null);
MoveBlockToTopCommand = new RelayCommand(OnMoveBlockToTopCommand, () => SelectedBlockViewModel != null); MoveBlockToTopCommand = new RelayCommand(OnMoveBlockToTopCommand, () => SelectedBlockViewModel != null && ItemFilterBlockViewModels.IndexOf(SelectedBlockViewModel) > 0);
MoveBlockUpCommand = new RelayCommand(OnMoveBlockUpCommand, () => SelectedBlockViewModel != null); MoveBlockUpCommand = new RelayCommand(OnMoveBlockUpCommand, () => SelectedBlockViewModel != null && ItemFilterBlockViewModels.IndexOf(SelectedBlockViewModel) > 0);
MoveBlockDownCommand = new RelayCommand(OnMoveBlockDownCommand, () => SelectedBlockViewModel != null); MoveBlockDownCommand = new RelayCommand(OnMoveBlockDownCommand, () => SelectedBlockViewModel != null && ItemFilterBlockViewModels.IndexOf(SelectedBlockViewModel) < ItemFilterBlockViewModels.Count);
MoveBlockToBottomCommand = new RelayCommand(OnMoveBlockToBottomCommand, () => SelectedBlockViewModel != null); MoveBlockToBottomCommand = new RelayCommand(OnMoveBlockToBottomCommand, () => SelectedBlockViewModel != null && ItemFilterBlockViewModels.IndexOf(SelectedBlockViewModel) < ItemFilterBlockViewModels.Count);
AddBlockCommand = new RelayCommand(OnAddBlockCommand); AddBlockCommand = new RelayCommand(OnAddBlockCommand);
AddSectionCommand = new RelayCommand(OnAddSectionCommand, () => SelectedBlockViewModel != null); AddSectionCommand = new RelayCommand(OnAddCommentBlockCommand, () => SelectedBlockViewModel != null);
DisableBlockCommand = new RelayCommand(OnDisableBlockCommand, HasSelectedEnabledBlock); DisableBlockCommand = new RelayCommand(OnDisableBlockCommand, HasSelectedEnabledBlock);
EnableBlockCommand = new RelayCommand(OnEnableBlockCommand, HasSelectedDisabledBlock); EnableBlockCommand = new RelayCommand(OnEnableBlockCommand, HasSelectedDisabledBlock);
CopyBlockCommand = new RelayCommand(OnCopyBlockCommand, () => SelectedBlockViewModel != null); CopyBlockCommand = new RelayCommand(OnCopyBlockCommand, () => SelectedBlockViewModel != null);
@ -138,6 +145,94 @@ namespace Filtration.ViewModels
IconSource = icon; IconSource = icon;
} }
public void Initialise(IItemFilterScript itemFilterScript, bool newScript)
{
ItemFilterBlockViewModels.Clear();
Script = itemFilterScript;
_scriptCommandManager = Script.CommandManager;
AddItemFilterBlockViewModels(Script.ItemFilterBlocks, -1);
Script.ItemFilterBlocks.CollectionChanged += ItemFilterBlocksOnCollectionChanged;
_filenameIsFake = newScript;
if (newScript)
{
Script.FilePath = "Untitled.filter";
}
Title = Filename;
ContentId = "ScriptContentId";
}
private void ItemFilterBlocksOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
{
switch (notifyCollectionChangedEventArgs.Action)
{
case NotifyCollectionChangedAction.Add:
{
AddItemFilterBlockViewModels(notifyCollectionChangedEventArgs.NewItems.Cast<IItemFilterBlockBase>(), notifyCollectionChangedEventArgs.NewStartingIndex);
break;
}
case NotifyCollectionChangedAction.Remove:
{
RemoveItemFilterBlockviewModels(notifyCollectionChangedEventArgs.OldItems.Cast<IItemFilterBlockBase>());
break;
}
default:
{
Debugger.Break(); // Unhandled NotifyCollectionChangedAction
break;
}
}
}
private void AddItemFilterBlockViewModels(IEnumerable<IItemFilterBlockBase> itemFilterBlocks, int addAtIndex)
{
var firstNewViewModel = true;
foreach (var itemFilterBlock in itemFilterBlocks)
{
var vm = _itemFilterBlockBaseViewModelFactory.Create(itemFilterBlock);
vm.Initialise(itemFilterBlock, this);
vm.BlockBecameDirty += OnBlockBecameDirty;
if (addAtIndex == -1)
{
ItemFilterBlockViewModels.Add(vm);
}
else
{
ItemFilterBlockViewModels.Insert(addAtIndex, vm);
}
if (firstNewViewModel)
{
SelectedBlockViewModel = vm;
firstNewViewModel = false;
}
}
}
private void RemoveItemFilterBlockviewModels(IEnumerable<IItemFilterBlockBase> itemFilterBlocks)
{
foreach (var itemFilterBlock in itemFilterBlocks)
{
var itemFilterBlockViewModel = ItemFilterBlockViewModels.FirstOrDefault(f => f.BaseBlock == itemFilterBlock);
if (itemFilterBlockViewModel == null)
{
throw new InvalidOperationException("Item Filter Block removed from model but does not exist in view model!");
}
ItemFilterBlockViewModels.Remove(itemFilterBlockViewModel);
if (SelectedBlockViewModel == itemFilterBlockViewModel)
{
SelectedBlockViewModel = null;
}
}
}
public RelayCommand<bool> ToggleShowAdvancedCommand { get; } public RelayCommand<bool> ToggleShowAdvancedCommand { get; }
public RelayCommand ClearFilterCommand { get; } public RelayCommand ClearFilterCommand { get; }
public RelayCommand CloseCommand { get; } public RelayCommand CloseCommand { get; }
@ -229,12 +324,7 @@ namespace Filtration.ViewModels
public string Description public string Description
{ {
get => Script.Description; get => Script.Description;
set set => _scriptCommandManager.ExecuteCommand(new SetScriptDescriptionCommand(Script, value));
{
Script.Description = value;
IsDirty = true;
RaisePropertyChanged();
}
} }
public bool ShowAdvanced public bool ShowAdvanced
@ -341,53 +431,6 @@ namespace Filtration.ViewModels
private bool _filenameIsFake; private bool _filenameIsFake;
private bool _showAdvanced; private bool _showAdvanced;
public void Initialise(IItemFilterScript itemFilterScript, bool newScript)
{
ItemFilterBlockViewModels.Clear();
Script = itemFilterScript;
foreach (var block in Script.ItemFilterBlocks)
{
var itemFilterBlock = block as IItemFilterBlock;
if (itemFilterBlock != null)
{
var itemFilterBlockViewModel = _itemFilterBlockViewModelFactory.Create();
itemFilterBlockViewModel.Initialise(itemFilterBlock, this);
itemFilterBlockViewModel.BlockBecameDirty += OnBlockBecameDirty;
ItemFilterBlockViewModels.Add(itemFilterBlockViewModel);
continue;
}
var itemFilterCommentBlock = block as IItemFilterCommentBlock;
if (itemFilterCommentBlock == null)
{
throw new InvalidOperationException("Unknown item filter block type");
}
var itemFilterCommentBlockViewModel = _itemFilterCommentBlockViewModelFactory.Create();
itemFilterCommentBlockViewModel.Initialise(itemFilterCommentBlock);
itemFilterCommentBlockViewModel.BlockBecameDirty += OnBlockBecameDirty;
ItemFilterBlockViewModels.Add(itemFilterCommentBlockViewModel);
}
_filenameIsFake = newScript;
if (newScript)
{
Script.FilePath = "Untitled.filter";
}
if (ItemFilterBlockViewModels.Count > 0)
{
SelectedBlockViewModel = ItemFilterBlockViewModels.First();
}
Title = Filename;
ContentId = "ScriptContentId";
}
public async Task SaveAsync() public async Task SaveAsync()
{ {
if (!ValidateScript()) return; if (!ValidateScript()) return;
@ -602,8 +645,7 @@ namespace Filtration.ViewModels
} }
catch catch
{ {
_messageBoxService.Show("Clipboard Error", "Failed to access the clipboard, copy command not completed.", _messageBoxService.Show("Clipboard Error", "Failed to access the clipboard, copy command not completed.", MessageBoxButton.OK, MessageBoxImage.Error);
MessageBoxButton.OK, MessageBoxImage.Error);
} }
} }
@ -671,39 +713,18 @@ namespace Filtration.ViewModels
{ {
var clipboardText = _clipboardService.GetClipboardText(); var clipboardText = _clipboardService.GetClipboardText();
if (string.IsNullOrEmpty(clipboardText)) return; if (string.IsNullOrEmpty(clipboardText)) return;
_blockGroupHierarchyBuilder.Initialise(Script.ItemFilterBlockGroups.First());
var translatedBlock = _blockTranslator.TranslateStringToItemFilterBlock(clipboardText, Script.ItemFilterScriptSettings); var translatedBlock = _blockTranslator.TranslateStringToItemFilterBlock(clipboardText, Script, true); // TODO: Doesn't handle pasting comment blocks?
if (translatedBlock == null) return; if (translatedBlock == null) return;
var vm = _itemFilterBlockViewModelFactory.Create(); _scriptCommandManager.ExecuteCommand(new PasteBlockCommand(Script, translatedBlock, targetBlockViewModelBase.BaseBlock));
vm.Initialise(translatedBlock, this);
if (ItemFilterBlockViewModels.Count > 0)
{
Script.ItemFilterBlocks.Insert(Script.ItemFilterBlocks.IndexOf(targetBlockViewModelBase.BaseBlock) + 1,
translatedBlock);
ItemFilterBlockViewModels.Insert(ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase) + 1, vm);
}
else
{
Script.ItemFilterBlocks.Add(translatedBlock);
ItemFilterBlockViewModels.Add(vm);
}
vm.BlockBecameDirty += OnBlockBecameDirty;
SelectedBlockViewModel = vm;
IsDirty = true;
} }
catch (Exception e) catch (Exception e)
{ {
Logger.Error(e); Logger.Error(e);
var innerException = e.InnerException?.Message ?? string.Empty; var innerException = e.InnerException?.Message ?? string.Empty;
_messageBoxService.Show("Paste Error", _messageBoxService.Show("Paste Error", e.Message + Environment.NewLine + innerException, MessageBoxButton.OK, MessageBoxImage.Error);
e.Message + Environment.NewLine + innerException, MessageBoxButton.OK,
MessageBoxImage.Error);
} }
} }
@ -712,21 +733,6 @@ namespace Filtration.ViewModels
MoveBlockToTop(SelectedBlockViewModel); MoveBlockToTop(SelectedBlockViewModel);
} }
public void MoveBlockToTop(IItemFilterBlockViewModelBase targetBlockViewModelBase)
{
var currentIndex = ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase);
if (currentIndex > 0)
{
var block = targetBlockViewModelBase.BaseBlock;
Script.ItemFilterBlocks.Remove(block);
Script.ItemFilterBlocks.Insert(0, block);
ItemFilterBlockViewModels.Move(currentIndex, 0);
IsDirty = true;
RaisePropertyChanged(nameof(ItemFilterCommentBlockViewModels));
}
}
private void OnMoveBlockUpCommand() private void OnMoveBlockUpCommand()
{ {
MoveBlockUp(SelectedBlockViewModel); MoveBlockUp(SelectedBlockViewModel);
@ -734,18 +740,7 @@ namespace Filtration.ViewModels
public void MoveBlockUp(IItemFilterBlockViewModelBase targetBlockViewModelBase) public void MoveBlockUp(IItemFilterBlockViewModelBase targetBlockViewModelBase)
{ {
var currentIndex = ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase); _scriptCommandManager.ExecuteCommand(new MoveBlockUpCommand(Script, targetBlockViewModelBase?.BaseBlock));
if (currentIndex > 0)
{
var block = targetBlockViewModelBase.BaseBlock;
var blockPos = Script.ItemFilterBlocks.IndexOf(block);
Script.ItemFilterBlocks.RemoveAt(blockPos);
Script.ItemFilterBlocks.Insert(blockPos - 1, block);
ItemFilterBlockViewModels.Move(currentIndex, currentIndex - 1);
IsDirty = true;
RaisePropertyChanged(nameof(ItemFilterCommentBlockViewModels));
}
} }
private void OnMoveBlockDownCommand() private void OnMoveBlockDownCommand()
@ -755,18 +750,7 @@ namespace Filtration.ViewModels
public void MoveBlockDown(IItemFilterBlockViewModelBase targetBlockViewModelBase) public void MoveBlockDown(IItemFilterBlockViewModelBase targetBlockViewModelBase)
{ {
var currentIndex = ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase); _scriptCommandManager.ExecuteCommand(new MoveBlockDownCommand(Script, targetBlockViewModelBase?.BaseBlock));
if (currentIndex < ItemFilterBlockViewModels.Count - 1)
{
var block = targetBlockViewModelBase.BaseBlock;
var blockPos = Script.ItemFilterBlocks.IndexOf(block);
Script.ItemFilterBlocks.RemoveAt(blockPos);
Script.ItemFilterBlocks.Insert(blockPos + 1, block);
ItemFilterBlockViewModels.Move(currentIndex, currentIndex + 1);
IsDirty = true;
RaisePropertyChanged(nameof(ItemFilterCommentBlockViewModels));
}
} }
private void OnMoveBlockToBottomCommand() private void OnMoveBlockToBottomCommand()
@ -774,21 +758,6 @@ namespace Filtration.ViewModels
MoveBlockToBottom(SelectedBlockViewModel); MoveBlockToBottom(SelectedBlockViewModel);
} }
public void MoveBlockToBottom(IItemFilterBlockViewModelBase targetBlockViewModelBase)
{
var currentIndex = ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase);
if (currentIndex < ItemFilterBlockViewModels.Count - 1)
{
var block = targetBlockViewModelBase.BaseBlock;
Script.ItemFilterBlocks.Remove(block);
Script.ItemFilterBlocks.Add(block);
ItemFilterBlockViewModels.Move(currentIndex, ItemFilterBlockViewModels.Count - 1);
IsDirty = true;
RaisePropertyChanged(nameof(ItemFilterCommentBlockViewModels));
}
}
private void OnAddBlockCommand() private void OnAddBlockCommand()
{ {
AddBlock(SelectedBlockViewModel); AddBlock(SelectedBlockViewModel);
@ -796,25 +765,28 @@ namespace Filtration.ViewModels
public void AddBlock(IItemFilterBlockViewModelBase targetBlockViewModelBase) public void AddBlock(IItemFilterBlockViewModelBase targetBlockViewModelBase)
{ {
var vm = _itemFilterBlockViewModelFactory.Create(); _scriptCommandManager.ExecuteCommand(new AddBlockCommand(Script, targetBlockViewModelBase?.BaseBlock));
var newBlock = new ItemFilterBlock(); // TODO: Expand new viewmodel
vm.Initialise(newBlock, this);
if (targetBlockViewModelBase != null)
{
Script.ItemFilterBlocks.Insert(Script.ItemFilterBlocks.IndexOf(targetBlockViewModelBase.BaseBlock) + 1, newBlock);
ItemFilterBlockViewModels.Insert(ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase) + 1, vm);
}
else
{
Script.ItemFilterBlocks.Add(newBlock);
ItemFilterBlockViewModels.Add(vm);
} }
vm.BlockBecameDirty += OnBlockBecameDirty; public void AddCommentBlock(IItemFilterBlockViewModelBase targetBlockViewModelBase)
SelectedBlockViewModel = vm; {
vm.IsExpanded = true; _scriptCommandManager.ExecuteCommand(new AddCommentBlockCommand(Script, targetBlockViewModelBase.BaseBlock));
IsDirty = true; }
public void DeleteBlock(IItemFilterBlockViewModelBase targetBlockViewModelBase)
{
_scriptCommandManager.ExecuteCommand(new RemoveBlockCommand(Script, targetBlockViewModelBase.BaseBlock));
}
public void MoveBlockToBottom(IItemFilterBlockViewModelBase targetBlockViewModelBase)
{
_scriptCommandManager.ExecuteCommand(new MoveBlockToBottomCommand(Script, targetBlockViewModelBase.BaseBlock));
}
public void MoveBlockToTop(IItemFilterBlockViewModelBase targetBlockViewModelBase)
{
_scriptCommandManager.ExecuteCommand(new MoveBlockToTopCommand(Script, targetBlockViewModelBase.BaseBlock));
} }
private void OnBlockBecameDirty(object sender, EventArgs e) private void OnBlockBecameDirty(object sender, EventArgs e)
@ -822,23 +794,9 @@ namespace Filtration.ViewModels
SetDirtyFlag(); SetDirtyFlag();
} }
private void OnAddSectionCommand() private void OnAddCommentBlockCommand()
{ {
AddSection(SelectedBlockViewModel); AddCommentBlock(SelectedBlockViewModel);
}
public void AddSection(IItemFilterBlockViewModelBase targetBlockViewModelBase)
{
var vm = _itemFilterCommentBlockViewModelFactory.Create();
var newSection = new ItemFilterCommentBlock { Comment = "New Comment Block" };
vm.Initialise(newSection);
Script.ItemFilterBlocks.Insert(Script.ItemFilterBlocks.IndexOf(targetBlockViewModelBase.BaseBlock), newSection);
ItemFilterBlockViewModels.Insert(ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase), vm);
IsDirty = true;
SelectedBlockViewModel = vm;
RaisePropertyChanged(nameof(ItemFilterCommentBlockViewModels));
Messenger.Default.Send(new NotificationMessage("SectionsChanged"));
} }
private void OnExpandAllBlocksCommand() private void OnExpandAllBlocksCommand()
@ -862,31 +820,6 @@ namespace Filtration.ViewModels
DeleteBlock(SelectedBlockViewModel); DeleteBlock(SelectedBlockViewModel);
} }
public void DeleteBlock(IItemFilterBlockViewModelBase targetBlockViewModelBase)
{
var result = _messageBoxService.Show("Delete Confirmation", "Are you sure you wish to delete this block?",
MessageBoxButton.YesNo,
MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
var isSection = targetBlockViewModelBase.BaseBlock is ItemFilterCommentBlock;
Script.ItemFilterBlocks.Remove(targetBlockViewModelBase.BaseBlock);
ItemFilterBlockViewModels.Remove(targetBlockViewModelBase);
IsDirty = true;
targetBlockViewModelBase.BlockBecameDirty -= OnBlockBecameDirty;
if (isSection)
{
Messenger.Default.Send(new NotificationMessage("SectionsChanged"));
}
}
SelectedBlockViewModel = null;
}
private void OnDisableBlockCommand() private void OnDisableBlockCommand()
{ {
var selectedBlockViewModel = SelectedBlockViewModel as IItemFilterBlockViewModel; var selectedBlockViewModel = SelectedBlockViewModel as IItemFilterBlockViewModel;

View File

@ -85,6 +85,11 @@ namespace Filtration.ViewModels
PasteCommand = new RelayCommand(OnPasteCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock); PasteCommand = new RelayCommand(OnPasteCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock);
PasteBlockStyleCommand = new RelayCommand(OnPasteBlockStyleCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock); PasteBlockStyleCommand = new RelayCommand(OnPasteBlockStyleCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock);
// TODO: Only enabled if undo/redo available
UndoCommand = new RelayCommand(OnUndoCommand, () => ActiveDocumentIsScript);
RedoCommand = new RelayCommand(OnRedoCommand, () => ActiveDocumentIsScript);
MoveBlockUpCommand = new RelayCommand(OnMoveBlockUpCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock); MoveBlockUpCommand = new RelayCommand(OnMoveBlockUpCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock);
MoveBlockDownCommand = new RelayCommand(OnMoveBlockDownCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock); MoveBlockDownCommand = new RelayCommand(OnMoveBlockDownCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock);
MoveBlockToTopCommand = new RelayCommand(OnMoveBlockToTopCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock); MoveBlockToTopCommand = new RelayCommand(OnMoveBlockToTopCommand, () => ActiveDocumentIsScript && ActiveScriptHasSelectedBlock);
@ -158,9 +163,7 @@ namespace Filtration.ViewModels
} }
case "OpenScript": case "OpenScript":
{ {
#pragma warning disable 4014 OnOpenScriptCommand();
Task.Run(OnOpenScriptCommand).GetAwaiter().GetResult();
#pragma warning restore 4014
break; break;
} }
case "ShowLoadingBanner": case "ShowLoadingBanner":
@ -191,6 +194,9 @@ namespace Filtration.ViewModels
public RelayCommand OpenAboutWindowCommand { get; } public RelayCommand OpenAboutWindowCommand { get; }
public RelayCommand ReplaceColorsCommand { get; } public RelayCommand ReplaceColorsCommand { get; }
public RelayCommand UndoCommand { get;}
public RelayCommand RedoCommand { get; }
public RelayCommand EditMasterThemeCommand { get; } public RelayCommand EditMasterThemeCommand { get; }
public RelayCommand CreateThemeCommand { get; } public RelayCommand CreateThemeCommand { get; }
public RelayCommand ApplyThemeToScriptCommand { get; } public RelayCommand ApplyThemeToScriptCommand { get; }
@ -521,6 +527,16 @@ namespace Filtration.ViewModels
_avalonDockWorkspaceViewModel.ActiveScriptViewModel.PasteBlockStyleCommand.Execute(null); _avalonDockWorkspaceViewModel.ActiveScriptViewModel.PasteBlockStyleCommand.Execute(null);
} }
private void OnUndoCommand()
{
_avalonDockWorkspaceViewModel.ActiveScriptViewModel.Script.CommandManager.Undo();
}
private void OnRedoCommand()
{
_avalonDockWorkspaceViewModel.ActiveScriptViewModel.Script.CommandManager.Redo();
}
private void OnNewScriptCommand() private void OnNewScriptCommand()
{ {
var newViewModel = _itemFilterScriptRepository.NewScript(); var newViewModel = _itemFilterScriptRepository.NewScript();

View File

@ -30,6 +30,8 @@
<Image Source="/Filtration;component/Resources/Icons/PasteStyle.ico" x:Key="PasteStyleIcon" x:Shared="False" /> <Image Source="/Filtration;component/Resources/Icons/PasteStyle.ico" x:Key="PasteStyleIcon" x:Shared="False" />
<Image Source="/Filtration;component/Resources/Icons/filtration_icon.png" x:Key="FiltrationIcon" x:Shared="False" /> <Image Source="/Filtration;component/Resources/Icons/filtration_icon.png" x:Key="FiltrationIcon" x:Shared="False" />
<Image Source="/Filtration;component/Resources/Icons/Add.ico" x:Key="AddIcon" x:Shared="False" /> <Image Source="/Filtration;component/Resources/Icons/Add.ico" x:Key="AddIcon" x:Shared="False" />
<Image Source="/Filtration;component/Resources/Icons/undo_icon.png" x:Key="UndoIcon" x:Shared="False" />
<Image Source="/Filtration;component/Resources/Icons/redo_icon.png" x:Key="RedoIcon" x:Shared="False" />
<Image Source="/Filtration;component/Resources/Icons/ThemeComponentDelete.ico" x:Key="ThemeComponentDeleteIcon" x:Shared="False" /> <Image Source="/Filtration;component/Resources/Icons/ThemeComponentDelete.ico" x:Key="ThemeComponentDeleteIcon" x:Shared="False" />
<Image Source="/Filtration;component/Resources/Icons/standby_enabled_icon.png" x:Key="StandbyEnabledIcon" x:Shared="False" /> <Image Source="/Filtration;component/Resources/Icons/standby_enabled_icon.png" x:Key="StandbyEnabledIcon" x:Shared="False" />
<Image Source="/Filtration;component/Resources/Icons/standby_disabled_icon.png" x:Key="StandbyDisabledIcon" x:Shared="False" /> <Image Source="/Filtration;component/Resources/Icons/standby_disabled_icon.png" x:Key="StandbyDisabledIcon" x:Shared="False" />

View File

@ -19,6 +19,10 @@
<KeyBinding Command="{Binding SaveCommand}" Modifiers="Control" Key="S" /> <KeyBinding Command="{Binding SaveCommand}" Modifiers="Control" Key="S" />
<KeyBinding Command="{Binding OpenScriptCommand}" Modifiers="Control" Key="O" /> <KeyBinding Command="{Binding OpenScriptCommand}" Modifiers="Control" Key="O" />
<KeyBinding Command="{Binding NewScriptCommand}" Modifiers="Control" Key="N" /> <KeyBinding Command="{Binding NewScriptCommand}" Modifiers="Control" Key="N" />
<!-- Undo/Redo support incomplete -->
<!--<KeyBinding Command="{Binding UndoCommand}" Modifiers="Control" Key="Z" />
<KeyBinding Command="{Binding RedoCommand}" Modifiers="Control" Key="Y" />-->
</fluent:RibbonWindow.InputBindings> </fluent:RibbonWindow.InputBindings>
<utility:RoutedCommandHandlers.Commands> <utility:RoutedCommandHandlers.Commands>
<utility:RoutedCommandHandler RoutedCommand="{StaticResource OpenScriptRoutedCommand}" Command="{Binding OpenScriptCommand}" /> <utility:RoutedCommandHandler RoutedCommand="{StaticResource OpenScriptRoutedCommand}" Command="{Binding OpenScriptCommand}" />
@ -85,6 +89,12 @@
<fluent:Button Header="Paste Style" Command="{Binding PasteBlockStyleCommand}" Icon="{StaticResource PasteStyleIcon}" LargeIcon="{StaticResource PasteIcon}" SizeDefinition="Middle" ToolTip="Paste Style (Ctrl+Shift+V)" /> <fluent:Button Header="Paste Style" Command="{Binding PasteBlockStyleCommand}" Icon="{StaticResource PasteStyleIcon}" LargeIcon="{StaticResource PasteIcon}" SizeDefinition="Middle" ToolTip="Paste Style (Ctrl+Shift+V)" />
<fluent:Button Header="Copy Script" Command="{Binding CopyScriptCommand}" Icon="{StaticResource CopyIcon}" LargeIcon="{StaticResource PasteIcon}" SizeDefinition="Middle" /> <fluent:Button Header="Copy Script" Command="{Binding CopyScriptCommand}" Icon="{StaticResource CopyIcon}" LargeIcon="{StaticResource PasteIcon}" SizeDefinition="Middle" />
</fluent:RibbonGroupBox> </fluent:RibbonGroupBox>
<!-- Undo/Redo support incomplete -->
<!--<fluent:RibbonGroupBox Header="Undo">
<fluent:Button Header="Undo" Command="{Binding UndoCommand}" ToolTip="Undo" SizeDefinition="Middle" Icon="{StaticResource UndoIcon}" />
<fluent:Button Header="Redo" Command="{Binding RedoCommand}" ToolTip="Redo" SizeDefinition="Middle" Icon="{StaticResource RedoIcon}" />
</fluent:RibbonGroupBox>-->
<fluent:RibbonGroupBox Header="Blocks"> <fluent:RibbonGroupBox Header="Blocks">
<fluent:Button Header="Add Block" Command="{Binding AddBlockCommand}" SizeDefinition="Middle" Icon="{StaticResource AddBlockIcon}" /> <fluent:Button Header="Add Block" Command="{Binding AddBlockCommand}" SizeDefinition="Middle" Icon="{StaticResource AddBlockIcon}" />
<fluent:Button Header="Add Section" Command="{Binding AddSectionCommand}" SizeDefinition="Middle" Icon="{StaticResource AddSectionIcon}" /> <fluent:Button Header="Add Section" Command="{Binding AddSectionCommand}" SizeDefinition="Middle" Icon="{StaticResource AddSectionIcon}" />

View File

@ -3,6 +3,7 @@ using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration; using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor; using Castle.Windsor;
using Filtration.ViewModels; using Filtration.ViewModels;
using Filtration.ViewModels.Factories;
using Filtration.ViewModels.ToolPanes; using Filtration.ViewModels.ToolPanes;
namespace Filtration.WindsorInstallers namespace Filtration.WindsorInstallers
@ -79,6 +80,11 @@ namespace Filtration.WindsorInstallers
container.Register( container.Register(
Component.For<IItemFilterScriptViewModelFactory>().AsFactory()); Component.For<IItemFilterScriptViewModelFactory>().AsFactory());
container.Register(
Component.For<IItemFilterBlockBaseViewModelFactory>()
.ImplementedBy<ItemFilterBlockBaseViewModelFactory>()
.LifeStyle.Singleton);
} }
} }
} }