Improve pasting to support different copy sources
This commit is contained in:
parent
2ff9ebf242
commit
69ce542c1a
|
@ -0,0 +1,49 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Filtration.ObjectModel.Commands.ItemFilterScript
|
||||
{
|
||||
public class PasteMultipleBlocksCommand : IUndoableCommand
|
||||
{
|
||||
private readonly IItemFilterScript _itemFilterScript;
|
||||
private readonly List<IItemFilterBlockBase> _pastedItemFilterBlocks;
|
||||
private readonly IItemFilterBlockBase _addAfterItemFilterBlock;
|
||||
|
||||
public PasteMultipleBlocksCommand(IItemFilterScript itemFilterScript, List<IItemFilterBlockBase> pastedItemFilterBlocks, IItemFilterBlockBase addAfterItemFilterBlock)
|
||||
{
|
||||
_itemFilterScript = itemFilterScript;
|
||||
_pastedItemFilterBlocks = pastedItemFilterBlocks;
|
||||
_addAfterItemFilterBlock = addAfterItemFilterBlock;
|
||||
}
|
||||
|
||||
public void Execute()
|
||||
{
|
||||
if (_addAfterItemFilterBlock != null)
|
||||
{
|
||||
var lastAddedBlock = _addAfterItemFilterBlock;
|
||||
foreach(var block in _pastedItemFilterBlocks)
|
||||
{
|
||||
_itemFilterScript.ItemFilterBlocks.Insert(_itemFilterScript.ItemFilterBlocks.IndexOf(lastAddedBlock) + 1, block);
|
||||
lastAddedBlock = block;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var block in _pastedItemFilterBlocks)
|
||||
{
|
||||
_itemFilterScript.ItemFilterBlocks.Add(block);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Undo()
|
||||
{
|
||||
foreach (var block in _pastedItemFilterBlocks)
|
||||
{
|
||||
_itemFilterScript.ItemFilterBlocks.Remove(block);
|
||||
}
|
||||
}
|
||||
|
||||
public void Redo() => Execute();
|
||||
}
|
||||
}
|
|
@ -117,7 +117,7 @@
|
|||
<Compile Include="Commands\ItemFilterScript\MoveBlockDownCommand.cs" />
|
||||
<Compile Include="Commands\ItemFilterScript\MoveBlockUpCommand.cs" />
|
||||
<Compile Include="Commands\ItemFilterScript\MoveBlockToTopCommand.cs" />
|
||||
<Compile Include="Commands\ItemFilterScript\PasteSectionCommand.cs" />
|
||||
<Compile Include="Commands\ItemFilterScript\PasteMultipleBlocksCommand.cs" />
|
||||
<Compile Include="Commands\ItemFilterScript\RemoveSectionCommand.cs" />
|
||||
<Compile Include="Commands\ItemFilterScript\SetScriptDescriptionCommand.cs" />
|
||||
<Compile Include="Commands\ItemFilterScript\RemoveBlockCommand.cs" />
|
||||
|
|
|
@ -93,5 +93,10 @@ namespace Filtration.ObjectModel.ThemeEditor
|
|||
Items.Count(c => c.ComponentName == componentName && c.ComponentType == componentType);
|
||||
return componentCount > 0;
|
||||
}
|
||||
|
||||
public bool ComponentExists(ThemeComponent themeComponent)
|
||||
{
|
||||
return ComponentExists(themeComponent.ComponentType, themeComponent.ComponentName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ namespace Filtration.Parser.Interface.Services
|
|||
public interface IItemFilterScriptTranslator
|
||||
{
|
||||
IItemFilterScript TranslateStringToItemFilterScript(string inputString);
|
||||
IItemFilterScript TranslatePastedStringToItemFilterScript(string inputString, bool blockGroupsEnabled);
|
||||
string TranslateItemFilterScriptToString(IItemFilterScript script);
|
||||
}
|
||||
}
|
|
@ -210,7 +210,18 @@ namespace Filtration.Parser.Services
|
|||
_blockGroupHierarchyBuilder.Cleanup();
|
||||
return script;
|
||||
}
|
||||
|
||||
|
||||
public IItemFilterScript TranslatePastedStringToItemFilterScript(string inputString, bool blockGroupsEnabled)
|
||||
{
|
||||
//Remove old disabled tags to prevent messagebox on paste
|
||||
inputString = Regex.Replace(inputString, @"#Disabled\sBlock\s(Start|End).*?\n", "");
|
||||
inputString = (inputString.EndsWith("\n#Disabled Block End")) ? inputString.Substring(0, inputString.Length - 19) : inputString;
|
||||
|
||||
inputString = (blockGroupsEnabled ? "# EnableBlockGroups" : "#") + Environment.NewLine + Environment.NewLine + inputString;
|
||||
|
||||
return TranslateStringToItemFilterScript(inputString);
|
||||
}
|
||||
|
||||
private static LinkedList<ItemFilterBlockBoundary> IdentifyBlockBoundaries(string inputString, List<bool> inBlock)
|
||||
{
|
||||
var blockBoundaries = new LinkedList<ItemFilterBlockBoundary>();
|
||||
|
|
|
@ -93,6 +93,7 @@ namespace Filtration.ViewModels
|
|||
|
||||
private readonly IItemFilterBlockBaseViewModelFactory _itemFilterBlockBaseViewModelFactory;
|
||||
private readonly IItemFilterBlockTranslator _blockTranslator;
|
||||
private readonly IItemFilterScriptTranslator _scriptTranslator;
|
||||
private readonly IAvalonDockWorkspaceViewModel _avalonDockWorkspaceViewModel;
|
||||
private readonly IItemFilterPersistenceService _persistenceService;
|
||||
private readonly IMessageBoxService _messageBoxService;
|
||||
|
@ -110,6 +111,7 @@ namespace Filtration.ViewModels
|
|||
|
||||
public ItemFilterScriptViewModel(IItemFilterBlockBaseViewModelFactory itemFilterBlockBaseViewModelFactory,
|
||||
IItemFilterBlockTranslator blockTranslator,
|
||||
IItemFilterScriptTranslator scriptTranslator,
|
||||
IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel,
|
||||
IItemFilterPersistenceService persistenceService,
|
||||
IMessageBoxService messageBoxService,
|
||||
|
@ -118,6 +120,7 @@ namespace Filtration.ViewModels
|
|||
{
|
||||
_itemFilterBlockBaseViewModelFactory = itemFilterBlockBaseViewModelFactory;
|
||||
_blockTranslator = blockTranslator;
|
||||
_scriptTranslator = scriptTranslator;
|
||||
_avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel;
|
||||
_avalonDockWorkspaceViewModel.ActiveDocumentChanged += OnActiveDocumentChanged;
|
||||
_persistenceService = persistenceService;
|
||||
|
@ -786,7 +789,7 @@ namespace Filtration.ViewModels
|
|||
var copyText = _blockTranslator.TranslateItemFilterBlockBaseToString(targetCommentBlockViewModel.BaseBlock);
|
||||
while (sectionStart < ItemFilterBlockViewModels.Count && ItemFilterBlockViewModels[sectionStart] as IItemFilterCommentBlockViewModel == null)
|
||||
{
|
||||
copyText += Environment.NewLine + "##CopySection##" + Environment.NewLine + _blockTranslator.TranslateItemFilterBlockBaseToString(ItemFilterBlockViewModels[sectionStart].BaseBlock);
|
||||
copyText += Environment.NewLine + Environment.NewLine + _blockTranslator.TranslateItemFilterBlockBaseToString(ItemFilterBlockViewModels[sectionStart].BaseBlock);
|
||||
sectionStart++;
|
||||
}
|
||||
|
||||
|
@ -875,50 +878,30 @@ namespace Filtration.ViewModels
|
|||
var clipboardText = _clipboardService.GetClipboardText();
|
||||
if (string.IsNullOrEmpty(clipboardText)) return;
|
||||
|
||||
string[] blockTexts = clipboardText.Split(new string[] { Environment.NewLine + "##CopySection##" + Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
|
||||
IItemFilterScript pastedScript = _scriptTranslator.TranslatePastedStringToItemFilterScript(clipboardText,
|
||||
Script.ItemFilterScriptSettings.BlockGroupsEnabled);
|
||||
|
||||
List<IItemFilterBlockBase> blocksToPaste = new List<IItemFilterBlockBase>();
|
||||
foreach (var curBlock in blockTexts)
|
||||
foreach (var themeComponent in pastedScript.ThemeComponents.Where(item => !Script.ThemeComponents.ComponentExists(item)))
|
||||
{
|
||||
IItemFilterBlockBase translatedBlock;
|
||||
var preparedString = PrepareBlockForParsing(curBlock);
|
||||
var isCommentBlock = true;
|
||||
string[] textLines = preparedString.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
|
||||
foreach(var line in textLines)
|
||||
{
|
||||
if(!line.StartsWith(@"#"))
|
||||
{
|
||||
isCommentBlock = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isCommentBlock)
|
||||
{
|
||||
translatedBlock = _blockTranslator.TranslateStringToItemFilterCommentBlock(preparedString, Script, curBlock);
|
||||
}
|
||||
else
|
||||
{
|
||||
translatedBlock = _blockTranslator.TranslateStringToItemFilterBlock(preparedString, Script, curBlock, true);
|
||||
}
|
||||
|
||||
if (translatedBlock == null) continue;
|
||||
|
||||
blocksToPaste.Add(translatedBlock);
|
||||
Script.ThemeComponents.Add(themeComponent);
|
||||
}
|
||||
|
||||
if (blocksToPaste.Count < 1)
|
||||
return;
|
||||
|
||||
var blockIndex = ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase) + 1;
|
||||
_scriptCommandManager.ExecuteCommand(new PasteSectionCommand(Script, blocksToPaste, targetBlockViewModelBase.BaseBlock));
|
||||
SelectedBlockViewModel = ItemFilterBlockViewModels[blockIndex];
|
||||
RaisePropertyChanged("SelectedBlockViewModel");
|
||||
var firstBlockAsComment = blocksToPaste[0] as IItemFilterCommentBlock;
|
||||
if (firstBlockAsComment != null)
|
||||
foreach (var blockGroup in pastedScript.ItemFilterBlockGroups.First().ChildGroups)
|
||||
{
|
||||
OnCollapseSectionCommand();
|
||||
Script.ItemFilterBlockGroups.First().ChildGroups.Add(blockGroup);
|
||||
}
|
||||
|
||||
_scriptCommandManager.ExecuteCommand(new PasteMultipleBlocksCommand(Script, pastedScript.ItemFilterBlocks.ToList(),
|
||||
targetBlockViewModelBase.BaseBlock));
|
||||
|
||||
Messenger.Default.Send(new NotificationMessage<bool>(ShowAdvanced, "BlockGroupsChanged"));
|
||||
var lastBlockIndex = ItemFilterBlockViewModels.IndexOf(targetBlockViewModelBase) + pastedScript.ItemFilterBlocks.Count;
|
||||
var lastBlock = ItemFilterBlockViewModels[lastBlockIndex];
|
||||
if(ViewItemFilterBlockViewModels.Contains(lastBlock))
|
||||
{
|
||||
SelectedBlockViewModel = lastBlock;
|
||||
}
|
||||
RaisePropertyChanged(nameof(SelectedBlockViewModel));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
|
|
@ -40,6 +40,11 @@ namespace Filtration.ViewModels.ToolPanes
|
|||
OnShowAdvancedToggled(message.Content);
|
||||
break;
|
||||
}
|
||||
case "BlockGroupsChanged":
|
||||
{
|
||||
BlockGroupViewModels = RebuildBlockGroupViewModels(message.Content);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue