diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj
index ac68abf..2ef758a 100644
--- a/Filtration/Filtration.csproj
+++ b/Filtration/Filtration.csproj
@@ -85,25 +85,11 @@
- ..\packages\WPFToolkit.3.5.50211.1\lib\WPFToolkit.dll
+ bin\Debug\WPFToolkit.dll
-
- ..\packages\AvalonDock.2.0.2000\lib\net40\Xceed.Wpf.AvalonDock.dll
-
-
- ..\packages\AvalonDock.2.0.2000\lib\net40\Xceed.Wpf.AvalonDock.Themes.Aero.dll
-
-
- ..\packages\AvalonDock.2.0.2000\lib\net40\Xceed.Wpf.AvalonDock.Themes.Expression.dll
-
-
- ..\packages\AvalonDock.2.0.2000\lib\net40\Xceed.Wpf.AvalonDock.Themes.Metro.dll
-
-
- ..\packages\AvalonDock.2.0.2000\lib\net40\Xceed.Wpf.AvalonDock.Themes.VS2010.dll
-
-
- .\Xceed.Wpf.AvalonDock.Themes.VS2013.dll
+
+ False
+ .\Xceed.Wpf.AvalonDock.dll
False
@@ -189,7 +175,7 @@
-
+
@@ -197,11 +183,12 @@
-
+
+
-
+
-
+
AvalonDockWorkspaceView.xaml
@@ -237,6 +224,9 @@
ReplaceColorsWindow.xaml
+
+ BlockOutputPreviewView.xaml
+
SectionBrowserView.xaml
@@ -281,6 +271,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
@@ -390,6 +384,7 @@
+
Always
diff --git a/Filtration/Resources/Icons/block_output_preview_icon.png b/Filtration/Resources/Icons/block_output_preview_icon.png
new file mode 100644
index 0000000..eb86e5c
Binary files /dev/null and b/Filtration/Resources/Icons/block_output_preview_icon.png differ
diff --git a/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs b/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs
index 8b9b3d0..fec468f 100644
--- a/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs
+++ b/Filtration/ViewModels/AvalonDockWorkspaceViewModel.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using Filtration.ViewModels.ToolPanes;
using GalaSoft.MvvmLight.Messaging;
namespace Filtration.ViewModels
@@ -10,6 +11,9 @@ namespace Filtration.ViewModels
event EventHandler ActiveDocumentChanged;
IDocument ActiveDocument { get; set; }
IItemFilterScriptViewModel ActiveScriptViewModel { get; }
+ ISectionBrowserViewModel SectionBrowserViewModel { get; }
+ IBlockGroupBrowserViewModel BlockGroupBrowserViewModel { get; }
+ IBlockOutputPreviewViewModel BlockOutputPreviewViewModel { get; }
void AddDocument(IDocument document);
void CloseDocument(IDocument document);
void SwitchActiveDocument(IDocument document);
@@ -19,6 +23,7 @@ namespace Filtration.ViewModels
{
private readonly ISectionBrowserViewModel _sectionBrowserViewModel;
private readonly IBlockGroupBrowserViewModel _blockGroupBrowserViewModel;
+ private readonly IBlockOutputPreviewViewModel _blockOutputPreviewViewModel;
private IDocument _activeDocument;
private IItemFilterScriptViewModel _activeScriptViewModel;
@@ -26,10 +31,12 @@ namespace Filtration.ViewModels
public AvalonDockWorkspaceViewModel(ISectionBrowserViewModel sectionBrowserViewModel,
IBlockGroupBrowserViewModel blockGroupBrowserViewModel,
- IStartPageViewModel startPageViewModel)
+ IStartPageViewModel startPageViewModel,
+ IBlockOutputPreviewViewModel blockOutputPreviewViewModel)
{
_sectionBrowserViewModel = sectionBrowserViewModel;
_blockGroupBrowserViewModel = blockGroupBrowserViewModel;
+ _blockOutputPreviewViewModel = blockOutputPreviewViewModel;
_sectionBrowserViewModel.Initialise(this);
_blockGroupBrowserViewModel.Initialise(this);
@@ -76,18 +83,33 @@ namespace Filtration.ViewModels
get { return _activeScriptViewModel; }
}
+ public IBlockGroupBrowserViewModel BlockGroupBrowserViewModel
+ {
+ get { return _blockGroupBrowserViewModel; }
+ }
+
+ public IBlockOutputPreviewViewModel BlockOutputPreviewViewModel
+ {
+ get { return _blockOutputPreviewViewModel; }
+ }
+
+ public ISectionBrowserViewModel SectionBrowserViewModel
+ {
+ get { return _sectionBrowserViewModel; }
+ }
+
private List _tools;
public IEnumerable Tools
{
get
{
- if (_tools == null)
+ return _tools ?? (_tools = new List
{
- _tools = new List { _sectionBrowserViewModel, _blockGroupBrowserViewModel };
- }
-
- return _tools;
+ _sectionBrowserViewModel,
+ _blockGroupBrowserViewModel,
+ _blockOutputPreviewViewModel
+ });
}
}
@@ -95,7 +117,7 @@ namespace Filtration.ViewModels
{
if (document.IsScript)
{
- _activeScriptViewModel = (IItemFilterScriptViewModel)document;
+ _activeScriptViewModel = (IItemFilterScriptViewModel) document;
}
OpenDocuments.Add(document);
diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs
index 9b34a69..a626037 100644
--- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs
+++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs
@@ -11,6 +11,7 @@ using Castle.Core.Internal;
using Filtration.Models;
using Filtration.Services;
using Filtration.Translators;
+using Filtration.ViewModels.ToolPanes;
using GalaSoft.MvvmLight.CommandWpf;
using GalaSoft.MvvmLight.Messaging;
using Clipboard = System.Windows.Clipboard;
diff --git a/Filtration/ViewModels/MainWindowViewModel.cs b/Filtration/ViewModels/MainWindowViewModel.cs
index a2a712b..ba51540 100644
--- a/Filtration/ViewModels/MainWindowViewModel.cs
+++ b/Filtration/ViewModels/MainWindowViewModel.cs
@@ -116,7 +116,7 @@ namespace Filtration.ViewModels
{
return _activeDocument != null && _activeDocument.IsScript;
}
-
+
private void OnOpenAboutWindowCommand()
{
var aboutWindow = new AboutWindow();
diff --git a/Filtration/ViewModels/StartPageViewModel.cs b/Filtration/ViewModels/StartPageViewModel.cs
index 2c9d4b9..a668696 100644
--- a/Filtration/ViewModels/StartPageViewModel.cs
+++ b/Filtration/ViewModels/StartPageViewModel.cs
@@ -1,4 +1,5 @@
-using GalaSoft.MvvmLight.CommandWpf;
+using Filtration.ViewModels.ToolPanes;
+using GalaSoft.MvvmLight.CommandWpf;
using GalaSoft.MvvmLight.Messaging;
namespace Filtration.ViewModels
diff --git a/Filtration/ViewModels/ToolPanes/BlockGroupBrowserViewModel.cs b/Filtration/ViewModels/ToolPanes/BlockGroupBrowserViewModel.cs
new file mode 100644
index 0000000..d4c0630
--- /dev/null
+++ b/Filtration/ViewModels/ToolPanes/BlockGroupBrowserViewModel.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.ObjectModel;
+using System.Windows.Media.Imaging;
+using Filtration.Utilities;
+using GalaSoft.MvvmLight.Command;
+using GalaSoft.MvvmLight.Messaging;
+
+namespace Filtration.ViewModels.ToolPanes
+{
+ internal interface IBlockGroupBrowserViewModel : IToolViewModel
+ {
+ void ClearDown();
+ bool IsVisible { get; set; }
+ }
+
+ internal class BlockGroupBrowserViewModel : ToolViewModel, IBlockGroupBrowserViewModel
+ {
+ private readonly IBlockGroupMapper _blockGroupMapper;
+ private ObservableCollection _blockGroupViewModelViewModels;
+ private ItemFilterBlockGroupViewModel _selectedBlockGroupViewModel;
+
+ public BlockGroupBrowserViewModel(IBlockGroupMapper blockGroupMapper) : base("Block Group Browser")
+ {
+ _blockGroupMapper = blockGroupMapper;
+ FilterToSelectedBlockGroupCommand = new RelayCommand(OnFilterToSelectedBlockGroupCommand, () => SelectedBlockGroupViewModel != null);
+
+ ContentId = ToolContentId;
+ var icon = new BitmapImage();
+ icon.BeginInit();
+ icon.UriSource = new Uri("pack://application:,,,/Filtration;component/Resources/Icons/block_group_browser_icon.png");
+ icon.EndInit();
+ IconSource = icon;
+ Messenger.Default.Register>(this, message =>
+ {
+ switch (message.Notification)
+ {
+ case "ShowAdvancedToggled":
+ {
+ OnShowAdvancedToggled(message.Content);
+ break;
+ }
+ }
+ });
+
+ }
+
+ public const string ToolContentId = "BlockGroupBrowserTool";
+
+ protected override void OnActiveDocumentChanged(object sender, EventArgs e)
+ {
+ if (AvalonDockWorkspaceViewModel.ActiveScriptViewModel != null && AvalonDockWorkspaceViewModel.ActiveDocument.IsScript)
+ {
+ BlockGroupViewModels = RebuildBlockGroupViewModels(AvalonDockWorkspaceViewModel.ActiveScriptViewModel.ShowAdvanced);
+ }
+ else
+ {
+ ClearDown();
+ }
+ }
+
+ public ItemFilterBlockGroupViewModel SelectedBlockGroupViewModel
+ {
+ get { return _selectedBlockGroupViewModel; }
+ set
+ {
+ _selectedBlockGroupViewModel = value;
+ RaisePropertyChanged();
+ FilterToSelectedBlockGroupCommand.RaiseCanExecuteChanged();
+ }
+ }
+
+ public RelayCommand FilterToSelectedBlockGroupCommand { get; private set; }
+
+ public ObservableCollection BlockGroupViewModels
+ {
+ get { return _blockGroupViewModelViewModels; }
+ private set
+ {
+ _blockGroupViewModelViewModels = value;
+ RaisePropertyChanged();
+ }
+ }
+
+ public void ClearDown()
+ {
+ BlockGroupViewModels = null;
+ SelectedBlockGroupViewModel = null;
+ }
+
+ private void OnShowAdvancedToggled(bool showAdvanced)
+ {
+ BlockGroupViewModels = RebuildBlockGroupViewModels(showAdvanced);
+ }
+
+ private ObservableCollection RebuildBlockGroupViewModels(bool showAdvanced)
+ {
+ return
+ _blockGroupMapper.MapBlockGroupsToViewModels(
+ AvalonDockWorkspaceViewModel.ActiveScriptViewModel.Script.ItemFilterBlockGroups, showAdvanced);
+ }
+
+ private void OnFilterToSelectedBlockGroupCommand()
+ {
+ AvalonDockWorkspaceViewModel.ActiveScriptViewModel.BlockFilterPredicate =
+ b => b.Block.HasBlockGroupInParentHierarchy(SelectedBlockGroupViewModel.SourceBlockGroup, b.Block.BlockGroup);
+ }
+ }
+}
diff --git a/Filtration/ViewModels/ToolPanes/BlockOutputPreviewViewModel.cs b/Filtration/ViewModels/ToolPanes/BlockOutputPreviewViewModel.cs
new file mode 100644
index 0000000..049c883
--- /dev/null
+++ b/Filtration/ViewModels/ToolPanes/BlockOutputPreviewViewModel.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Windows.Media.Imaging;
+
+namespace Filtration.ViewModels.ToolPanes
+{
+ internal interface IBlockOutputPreviewViewModel : IToolViewModel
+ {
+ bool IsVisible { get; set; }
+ }
+
+ internal class BlockOutputPreviewViewModel : ToolViewModel, IBlockOutputPreviewViewModel
+ {
+ public BlockOutputPreviewViewModel() : base("Block Output Preview")
+ {
+ ContentId = ToolContentId;
+ var icon = new BitmapImage();
+ icon.BeginInit();
+ icon.UriSource = new Uri("pack://application:,,,/Filtration;component/Resources/Icons/block_output_preview_icon.png");
+ icon.EndInit();
+ IconSource = icon;
+
+ IsVisible = false;
+ }
+
+
+ public const string ToolContentId = "BlockOutputPreviewTool";
+ }
+}
diff --git a/Filtration/ViewModels/PaneViewModel.cs b/Filtration/ViewModels/ToolPanes/PaneViewModel.cs
similarity index 97%
rename from Filtration/ViewModels/PaneViewModel.cs
rename to Filtration/ViewModels/ToolPanes/PaneViewModel.cs
index 8fce535..e912725 100644
--- a/Filtration/ViewModels/PaneViewModel.cs
+++ b/Filtration/ViewModels/ToolPanes/PaneViewModel.cs
@@ -1,6 +1,6 @@
using System.Windows.Media;
-namespace Filtration.ViewModels
+namespace Filtration.ViewModels.ToolPanes
{
class PaneViewModel : FiltrationViewModelBase
{
diff --git a/Filtration/ViewModels/SectionBrowserViewModel.cs b/Filtration/ViewModels/ToolPanes/SectionBrowserViewModel.cs
similarity index 96%
rename from Filtration/ViewModels/SectionBrowserViewModel.cs
rename to Filtration/ViewModels/ToolPanes/SectionBrowserViewModel.cs
index 754e207..894dc5b 100644
--- a/Filtration/ViewModels/SectionBrowserViewModel.cs
+++ b/Filtration/ViewModels/ToolPanes/SectionBrowserViewModel.cs
@@ -2,11 +2,12 @@
using System.Collections.Generic;
using System.Windows.Media.Imaging;
-namespace Filtration.ViewModels
+namespace Filtration.ViewModels.ToolPanes
{
internal interface ISectionBrowserViewModel : IToolViewModel
{
void ClearDown();
+ bool IsVisible { get; set; }
}
internal class SectionBrowserViewModel : ToolViewModel, ISectionBrowserViewModel
diff --git a/Filtration/ViewModels/ToolViewModel.cs b/Filtration/ViewModels/ToolPanes/ToolViewModel.cs
similarity index 92%
rename from Filtration/ViewModels/ToolViewModel.cs
rename to Filtration/ViewModels/ToolPanes/ToolViewModel.cs
index b102e1d..d2fbdb9 100644
--- a/Filtration/ViewModels/ToolViewModel.cs
+++ b/Filtration/ViewModels/ToolPanes/ToolViewModel.cs
@@ -1,6 +1,6 @@
using System;
-namespace Filtration.ViewModels
+namespace Filtration.ViewModels.ToolPanes
{
internal interface IToolViewModel
{
@@ -26,7 +26,7 @@ namespace Filtration.ViewModels
if (_isVisible != value)
{
_isVisible = value;
- RaisePropertyChanged();
+ RaisePropertyChanged("IsVisible");
}
}
}
diff --git a/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml b/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml
index 104214a..01bfded 100644
--- a/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml
+++ b/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml
@@ -7,13 +7,13 @@
xmlns:viewsAvalonDock="clr-namespace:Filtration.Views.AvalonDock"
xmlns:views="clr-namespace:Filtration.Views"
xmlns:toolPanes="clr-namespace:Filtration.Views.ToolPanes"
- xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock"
xmlns:converters="clr-namespace:Filtration.Converters"
+ xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance d:Type=viewModels:AvalonDockWorkspaceViewModel}"
d:DesignHeight="300" d:DesignWidth="300">
-
+
@@ -40,6 +40,11 @@
+
+
+
+
+
@@ -54,7 +59,7 @@