From e3505b357581268e139e790094e594e7951bde9a Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 23 Jun 2015 21:41:57 +0100 Subject: [PATCH] Fixed AvalonDock close tools crash, added Block Output Preview pane --- Filtration/Filtration.csproj | 39 +++---- .../Icons/block_output_preview_icon.png | Bin 0 -> 188 bytes .../AvalonDockWorkspaceViewModel.cs | 36 ++++-- .../ViewModels/ItemFilterScriptViewModel.cs | 1 + Filtration/ViewModels/MainWindowViewModel.cs | 2 +- Filtration/ViewModels/StartPageViewModel.cs | 3 +- .../ToolPanes/BlockGroupBrowserViewModel.cs | 108 ++++++++++++++++++ .../ToolPanes/BlockOutputPreviewViewModel.cs | 28 +++++ .../{ => ToolPanes}/PaneViewModel.cs | 2 +- .../SectionBrowserViewModel.cs | 3 +- .../{ => ToolPanes}/ToolViewModel.cs | 4 +- .../AvalonDock/AvalonDockWorkspaceView.xaml | 14 ++- .../Views/AvalonDock/LayoutInitializer.cs | 16 ++- .../Views/AvalonDock/PanesStyleSelector.cs | 1 + .../Views/AvalonDock/PanesTemplateSelector.cs | 7 ++ Filtration/Views/IconsDictionary.xaml | 2 + Filtration/Views/MainWindow.xaml | 5 + .../ToolPanes/BlockGroupBrowserView.xaml | 3 +- .../ToolPanes/BlockOutputPreviewView.xaml | 11 ++ .../ToolPanes/BlockOutputPreviewView.xaml.cs | 10 ++ .../Views/ToolPanes/SectionBrowserView.xaml | 4 +- .../WindsorInstallers/ViewModelsInstaller.cs | 6 + 22 files changed, 260 insertions(+), 45 deletions(-) create mode 100644 Filtration/Resources/Icons/block_output_preview_icon.png create mode 100644 Filtration/ViewModels/ToolPanes/BlockGroupBrowserViewModel.cs create mode 100644 Filtration/ViewModels/ToolPanes/BlockOutputPreviewViewModel.cs rename Filtration/ViewModels/{ => ToolPanes}/PaneViewModel.cs (97%) rename Filtration/ViewModels/{ => ToolPanes}/SectionBrowserViewModel.cs (96%) rename Filtration/ViewModels/{ => ToolPanes}/ToolViewModel.cs (92%) create mode 100644 Filtration/Views/ToolPanes/BlockOutputPreviewView.xaml create mode 100644 Filtration/Views/ToolPanes/BlockOutputPreviewView.xaml.cs 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 0000000000000000000000000000000000000000..eb86e5cf34255e87f9cd3fe9dc807a234c48e914 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP%zKa z#WAEJZtdiQTnvgFF4-T0?q7TUEw^lrYlNZ!|7u%<6A5z|S2K9AO-f!X8kD&<^wMdG z!yIQUx7ODP&zsa@=2||f+v>&M@Rj;qnh!7RmQfTt%C*8a++{HrgPvw h{dMh{@VECThkk0bk^b>~8GoS744$rjF6*2UngCp8KuiDt literal 0 HcmV?d00001 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 @@