From 08a193dc6bd41cb8cc7d618ab3b0037bc6892101 Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 14 Jun 2015 16:50:08 +0100 Subject: [PATCH] Various bug fixes, added standard POE colours to ColorPickers --- Filtration/Filtration.csproj | 5 + .../BlockItemTypes/FontSizeBlockItem.cs | 1 + Filtration/Models/ItemFilterBlock.cs | 19 +++ .../Resources/Icons/clear_filter_icon.png | Bin 0 -> 398 bytes Filtration/Resources/Icons/filter_icon.png | Bin 0 -> 202 bytes .../Translators/ItemFilterScriptTranslator.cs | 7 +- .../ViewModels/ItemFilterBlockViewModel.cs | 21 ++- .../ViewModels/ItemFilterScriptViewModel.cs | 160 ++++++++++++++---- Filtration/ViewModels/MainWindowViewModel.cs | 16 +- .../ViewModels/ReplaceColorsViewModel.cs | 15 +- Filtration/ViewModels/StartPageViewModel.cs | 18 +- .../AvalonDock/AvalonDockWorkspaceView.xaml | 4 +- .../Views/AvalonDock/LayoutInitializer.cs | 14 +- .../Behaviors/BindableSelectedItemBehavior.cs | 55 ++++++ Filtration/Views/IconsDictionary.xaml | 2 + .../ItemFilterBlockDisplaySettingsView.xaml | 2 +- Filtration/Views/ItemFilterScriptView.xaml | 43 ++--- Filtration/Views/MainWindow.xaml | 2 +- Filtration/Views/PathOfExileColors.cs | 48 ++++++ Filtration/Views/ReplaceColorsWindow.xaml | 12 +- .../ToolPanes/BlockGroupBrowserView.xaml | 17 +- .../Views/ToolPanes/SectionBrowserView.xaml | 6 +- 22 files changed, 375 insertions(+), 92 deletions(-) create mode 100644 Filtration/Resources/Icons/clear_filter_icon.png create mode 100644 Filtration/Resources/Icons/filter_icon.png create mode 100644 Filtration/Views/Behaviors/BindableSelectedItemBehavior.cs create mode 100644 Filtration/Views/PathOfExileColors.cs diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj index 46eccf5..c28c718 100644 --- a/Filtration/Filtration.csproj +++ b/Filtration/Filtration.csproj @@ -112,6 +112,7 @@ + @@ -189,7 +190,9 @@ AvalonDockWorkspaceView.xaml + + BlockGroupBrowserView.xaml @@ -367,6 +370,8 @@ + + Always diff --git a/Filtration/Models/BlockItemTypes/FontSizeBlockItem.cs b/Filtration/Models/BlockItemTypes/FontSizeBlockItem.cs index d9eb107..25b8fff 100644 --- a/Filtration/Models/BlockItemTypes/FontSizeBlockItem.cs +++ b/Filtration/Models/BlockItemTypes/FontSizeBlockItem.cs @@ -6,6 +6,7 @@ namespace Filtration.Models.BlockItemTypes { public FontSizeBlockItem() { + Value = 35; } public FontSizeBlockItem(int value) : base(value) diff --git a/Filtration/Models/ItemFilterBlock.cs b/Filtration/Models/ItemFilterBlock.cs index 3279ee3..241038a 100644 --- a/Filtration/Models/ItemFilterBlock.cs +++ b/Filtration/Models/ItemFilterBlock.cs @@ -75,6 +75,25 @@ namespace Filtration.Models return BlockItems.Count(b => b is T) > 0; } + public bool HasBlockGroupInParentHierarchy(ItemFilterBlockGroup targetBlockGroup, ItemFilterBlockGroup startingBlockGroup) + { + if (startingBlockGroup == targetBlockGroup) + { + return true; + } + if (BlockGroup == null) + { + return false; + } + + if (startingBlockGroup.ParentGroup != null) + { + return HasBlockGroupInParentHierarchy(targetBlockGroup, startingBlockGroup.ParentGroup); + } + + return false; + } + private void OnBlockGroupStatusChanged(object sender, EventArgs e) { if (BlockGroup.IsChecked == false && Action == BlockAction.Show) diff --git a/Filtration/Resources/Icons/clear_filter_icon.png b/Filtration/Resources/Icons/clear_filter_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..91ca9aa69ca389df9690ed812e50514d22bdaa5c GIT binary patch literal 398 zcmV;90df9`P)pGKuJVFRCr$1lf6pBKoH0G1q2_!!pg!*u(CVSSOu&stSkbSxxxn! ziB2DlUTx66h-a-M{wbKYmM%D+w}c4AqEcgJ%X)ZXJV10Y5MVWYAA?* za!BJ_n{IYDU=>WXNtR_hO$hYm;vA)q5bp%2F3Tq1_39FU`&IxCi?hSxW1K&qeLxnf zKxPb!`-d|Kg4rB~j~?l|PMW68sbLrZ$k_$}K_yj1{Uk}qG))?N19~{xC)ai7002f& zM5tc90YE^*Eb6xUVHm0`fFW*K76VXW`)UE^%uRJ1r`vF)lU#;nkQu=LL~jKF4gCZ70Z-Yc{v;gyZU6uP07*qoM6N<$f^qq$tN;K2 literal 0 HcmV?d00001 diff --git a/Filtration/Resources/Icons/filter_icon.png b/Filtration/Resources/Icons/filter_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1470188d2b7e7f7b4ee5c1f21905dc3fb0396d54 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMpkR%s zi(^Pd+|@~jTn7|*Ty4G1Pl~SSjyoz``b~w8Z|%o<-%S&8N;p`K{NE zc||r@AG7FqvH3w`IOB|;XDt00KOEq0VBHzyrN>}g(X{;D??5lZ#S7XcZKM_~)>-?` xedhXi?kl%)G30*<``^m&ie+t-M#8XA5)(gQu&X%Q~loCIAT%Ov?ZO literal 0 HcmV?d00001 diff --git a/Filtration/Translators/ItemFilterScriptTranslator.cs b/Filtration/Translators/ItemFilterScriptTranslator.cs index bb68b48..98cd467 100644 --- a/Filtration/Translators/ItemFilterScriptTranslator.cs +++ b/Filtration/Translators/ItemFilterScriptTranslator.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; +using Castle.Core.Internal; using Filtration.Models; using Filtration.Utilities; @@ -43,7 +44,11 @@ namespace Filtration.Translators script.Description += lines[i].Substring(1).Trim(' ') + Environment.NewLine; } } - script.Description = script.Description.TrimEnd('\n').TrimEnd('\r'); + + if (!script.Description.IsNullOrEmpty()) + { + script.Description = script.Description.TrimEnd('\n').TrimEnd('\r'); + } // Extract each block from between boundaries and translate it into a ItemFilterBlock object // and add that object to the ItemFilterBlocks list diff --git a/Filtration/ViewModels/ItemFilterBlockViewModel.cs b/Filtration/ViewModels/ItemFilterBlockViewModel.cs index a16be84..a9cc44b 100644 --- a/Filtration/ViewModels/ItemFilterBlockViewModel.cs +++ b/Filtration/ViewModels/ItemFilterBlockViewModel.cs @@ -10,6 +10,7 @@ using Filtration.Models.BlockItemTypes; using Filtration.Services; using Filtration.Views; using GalaSoft.MvvmLight.CommandWpf; +using Xceed.Wpf.Toolkit; namespace Filtration.ViewModels { @@ -188,11 +189,25 @@ namespace Filtration.ViewModels } set { - Block.Description = value; - RaisePropertyChanged(); + if (Block.Description != value) + { + Block.Description = value; + IsDirty = true; + RaisePropertyChanged(); + } } } - + + public ObservableCollection AvailableColors + { + get + { + { + return PathOfExileColors.DefaultColors; + } + } + } + public bool HasTextColor { get { return Block.HasBlockItemOfType(); } diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs index fb05cb8..d9ba011 100644 --- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs +++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs @@ -1,11 +1,14 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; using System.IO; using System.Linq; using System.Windows; +using System.Windows.Data; using System.Windows.Forms; using Castle.Core.Internal; +using Filtration.Enums; using Filtration.Models; using Filtration.Services; using Filtration.Translators; @@ -22,11 +25,12 @@ namespace Filtration.ViewModels IItemFilterBlockViewModel SectionBrowserSelectedBlockViewModel { get; set; } IEnumerable BlockGroups { get; } IEnumerable ItemFilterSectionViewModels { get; } + Predicate BlockFilterPredicate { get; set; } bool IsDirty { get; } string Description { get; set; } string DisplayName { get; } - void Initialise(ItemFilterScript itemFilterScript); + void Initialise(ItemFilterScript itemFilterScript, bool newScript); void RemoveDirtyFlag(); void SaveScript(); void SaveScriptAs(); @@ -47,12 +51,23 @@ namespace Filtration.ViewModels private bool _isDirty; private IItemFilterBlockViewModel _selectedBlockViewModel; private IItemFilterBlockViewModel _sectionBrowserSelectedBlockViewModel; + private readonly ObservableCollection _itemFilterBlockViewModels; + private ICollectionView _itemFilterBlockViewModelsCollectionView; + private Predicate _blockFilterPredicate; public ItemFilterScriptViewModel(IItemFilterBlockViewModelFactory itemFilterBlockViewModelFactory, IItemFilterBlockTranslator blockTranslator, IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel, IItemFilterPersistenceService persistenceService) { + _itemFilterBlockViewModelFactory = itemFilterBlockViewModelFactory; + _blockTranslator = blockTranslator; + _avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel; + _avalonDockWorkspaceViewModel.ActiveDocumentChanged += OnActiveDocumentChanged; + _persistenceService = persistenceService; + _itemFilterBlockViewModels = new ObservableCollection(); + + ClearFilterCommand = new RelayCommand(OnClearFilterCommand, () => BlockFilterPredicate != null); CloseCommand = new RelayCommand(OnCloseCommand); DeleteBlockCommand = new RelayCommand(OnDeleteBlockCommand, () => SelectedBlockViewModel != null); MoveBlockToTopCommand = new RelayCommand(OnMoveBlockToTopCommand, () => SelectedBlockViewModel != null); @@ -63,13 +78,9 @@ namespace Filtration.ViewModels AddSectionCommand = new RelayCommand(OnAddSectionCommand, () => SelectedBlockViewModel != null); CopyBlockCommand = new RelayCommand(OnCopyBlockCommand, () => SelectedBlockViewModel != null); PasteBlockCommand = new RelayCommand(OnPasteBlockCommand, () => SelectedBlockViewModel != null); - _itemFilterBlockViewModelFactory = itemFilterBlockViewModelFactory; - _blockTranslator = blockTranslator; - _avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel; - _persistenceService = persistenceService; - ItemFilterBlockViewModels = new ObservableCollection(); } + public RelayCommand ClearFilterCommand { get; private set; } public RelayCommand CloseCommand { get; private set; } public RelayCommand DeleteBlockCommand { get; private set; } public RelayCommand MoveBlockToTopCommand { get; private set; } @@ -81,8 +92,43 @@ namespace Filtration.ViewModels public RelayCommand CopyBlockCommand { get; private set; } public RelayCommand PasteBlockCommand { get; private set; } - public ObservableCollection ItemFilterBlockViewModels { get; private set; } + public ObservableCollection ItemFilterBlockViewModels + { + get + { + _itemFilterBlockViewModelsCollectionView = + CollectionViewSource.GetDefaultView(_itemFilterBlockViewModels); + if (BlockFilterPredicate != null) + { + _itemFilterBlockViewModelsCollectionView.Filter = BlockFilter; + } + else + { + _itemFilterBlockViewModelsCollectionView.Filter = null; + } + return _itemFilterBlockViewModels; + + } + } + private bool BlockFilter(object item) + { + var blockViewModel = item as IItemFilterBlockViewModel; + return BlockFilterPredicate(blockViewModel); + } + + public Predicate BlockFilterPredicate + { + get { return _blockFilterPredicate; } + set + { + _blockFilterPredicate = value; + RaisePropertyChanged("ItemFilterBlockViewModels"); + } + } + + public ObservableCollection DisplayedItemFilterBlockViewModels { get; private set; } + public IEnumerable ItemFilterSectionViewModels { get { return ItemFilterBlockViewModels.Where(b => b.Block.GetType() == typeof (ItemFilterSection)); } @@ -99,7 +145,7 @@ namespace Filtration.ViewModels set { Script.Description = value; - _isDirty = true; + IsDirty = true; RaisePropertyChanged(); } } @@ -137,20 +183,19 @@ namespace Filtration.ViewModels get { return _isDirty || HasDirtyChildren; } set { - _isDirty = value; - } - } + if (_isDirty != value) + { + _isDirty = value; + if (_isDirty) + { + Title = Filename + "*"; + } + else + { + Title = Filename; + } + } - private bool HasDirtyChildren - { - get { return ItemFilterBlockViewModels.Any(vm => vm.IsDirty); } - } - - private void CleanChildren() - { - foreach (var vm in ItemFilterBlockViewModels) - { - vm.IsDirty = false; } } @@ -177,7 +222,9 @@ namespace Filtration.ViewModels get { return Script.FilePath; } } - public void Initialise(ItemFilterScript itemFilterScript) + private bool _filenameIsFake; + + public void Initialise(ItemFilterScript itemFilterScript, bool newScript) { ItemFilterBlockViewModels.Clear(); @@ -189,6 +236,13 @@ namespace Filtration.ViewModels ItemFilterBlockViewModels.Add(vm); } + _filenameIsFake = newScript; + + if (newScript) + { + Script.FilePath = "Untitled.filter"; + } + Title = Filename; ContentId = "testcontentid"; } @@ -197,7 +251,7 @@ namespace Filtration.ViewModels { if (!ValidateScript()) return; - if (string.IsNullOrEmpty(Script.FilePath)) + if (_filenameIsFake) { SaveScriptAs(); return; @@ -235,6 +289,8 @@ namespace Filtration.ViewModels { Script.FilePath = saveDialog.FileName; _persistenceService.SaveItemFilterScript(Script); + _filenameIsFake = false; + Title = Filename; RemoveDirtyFlag(); } catch (Exception e) @@ -245,6 +301,27 @@ namespace Filtration.ViewModels } } + private void OnActiveDocumentChanged(object sender, EventArgs e) + { + if (_avalonDockWorkspaceViewModel.ActiveScriptViewModel != this) + { + BlockFilterPredicate = null; + } + } + + private bool HasDirtyChildren + { + get { return ItemFilterBlockViewModels.Any(vm => vm.IsDirty); } + } + + private void CleanChildren() + { + foreach (var vm in ItemFilterBlockViewModels) + { + vm.IsDirty = false; + } + } + private bool ValidateScript() { var result = Script.Validate(); @@ -265,11 +342,16 @@ namespace Filtration.ViewModels return false; } + private void OnCloseCommand() + { + Close(); + } + public void Close() { if (!IsDirty) { - _avalonDockWorkspaceViewModel.CloseDocument(this); + CloseScript(); } else { @@ -280,12 +362,12 @@ namespace Filtration.ViewModels case MessageBoxResult.Yes: { SaveScript(); - _avalonDockWorkspaceViewModel.CloseDocument(this); + CloseScript(); break; } case MessageBoxResult.No: { - _avalonDockWorkspaceViewModel.CloseDocument(this); + CloseScript(); break; } case MessageBoxResult.Cancel: @@ -296,9 +378,15 @@ namespace Filtration.ViewModels } } - private void OnCloseCommand() + private void CloseScript() { - Close(); + _avalonDockWorkspaceViewModel.ActiveDocumentChanged -= OnActiveDocumentChanged; + _avalonDockWorkspaceViewModel.CloseDocument(this); + } + + private void OnClearFilterCommand() + { + BlockFilterPredicate = null; } private void OnCopyBlockCommand() @@ -339,7 +427,7 @@ namespace Filtration.ViewModels } SelectedBlockViewModel = vm; - _isDirty = true; + IsDirty = true; } @@ -359,7 +447,7 @@ namespace Filtration.ViewModels Script.ItemFilterBlocks.Remove(block); Script.ItemFilterBlocks.Insert(0, block); ItemFilterBlockViewModels.Move(currentIndex, 0); - _isDirty = true; + IsDirty = true; RaisePropertyChanged("ItemFilterSectionViewModels"); } } @@ -380,7 +468,7 @@ namespace Filtration.ViewModels Script.ItemFilterBlocks.RemoveAt(blockPos); Script.ItemFilterBlocks.Insert(blockPos - 1, block); ItemFilterBlockViewModels.Move(currentIndex, currentIndex - 1); - _isDirty = true; + IsDirty = true; RaisePropertyChanged("ItemFilterSectionViewModels"); } } @@ -401,7 +489,7 @@ namespace Filtration.ViewModels Script.ItemFilterBlocks.RemoveAt(blockPos); Script.ItemFilterBlocks.Insert(blockPos + 1, block); ItemFilterBlockViewModels.Move(currentIndex, currentIndex + 1); - _isDirty = true; + IsDirty = true; RaisePropertyChanged("ItemFilterSectionViewModels"); } } @@ -421,7 +509,7 @@ namespace Filtration.ViewModels Script.ItemFilterBlocks.Remove(block); Script.ItemFilterBlocks.Add(block); ItemFilterBlockViewModels.Move(currentIndex, ItemFilterBlockViewModels.Count - 1); - _isDirty = true; + IsDirty = true; RaisePropertyChanged("ItemFilterSectionViewModels"); } } @@ -449,7 +537,7 @@ namespace Filtration.ViewModels } SelectedBlockViewModel = vm; - _isDirty = true; + IsDirty = true; } private void OnAddSectionCommand() @@ -465,7 +553,7 @@ namespace Filtration.ViewModels Script.ItemFilterBlocks.Insert(Script.ItemFilterBlocks.IndexOf(targetBlockViewModel.Block) + 1, newSection); ItemFilterBlockViewModels.Insert(ItemFilterBlockViewModels.IndexOf(targetBlockViewModel) + 1, vm); - _isDirty = true; + IsDirty = true; SelectedBlockViewModel = vm; RaisePropertyChanged("ItemFilterSectionViewModels"); } @@ -484,7 +572,7 @@ namespace Filtration.ViewModels { Script.ItemFilterBlocks.Remove(targetBlockViewModel.Block); ItemFilterBlockViewModels.Remove(targetBlockViewModel); - _isDirty = true; + IsDirty = true; } SelectedBlockViewModel = null; } diff --git a/Filtration/ViewModels/MainWindowViewModel.cs b/Filtration/ViewModels/MainWindowViewModel.cs index 0a0804e..925e7cc 100644 --- a/Filtration/ViewModels/MainWindowViewModel.cs +++ b/Filtration/ViewModels/MainWindowViewModel.cs @@ -43,7 +43,6 @@ namespace Filtration.ViewModels _replaceColorsViewModel = replaceColorsViewModel; _avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel; - OpenAboutWindowCommand = new RelayCommand(OnOpenAboutWindowCommand); OpenScriptCommand = new RelayCommand(OnOpenScriptCommand); SaveScriptCommand = new RelayCommand(OnSaveScriptCommand, ActiveDocumentIsScript); @@ -76,6 +75,16 @@ namespace Filtration.ViewModels ReplaceColorsCommand.RaiseCanExecuteChanged(); break; } + case "NewScript": + { + OnNewScriptCommand(); + break; + } + case "OpenScript": + { + OnOpenScriptCommand(); + break; + } } }); } @@ -145,7 +154,7 @@ namespace Filtration.ViewModels } var newViewModel = _itemFilterScriptViewModelFactory.Create(); - newViewModel.Initialise(loadedScript); + newViewModel.Initialise(loadedScript, false); _avalonDockWorkspaceViewModel.AddDocument(newViewModel); } @@ -208,8 +217,7 @@ namespace Filtration.ViewModels { var newScript = new ItemFilterScript(); var newViewModel = _itemFilterScriptViewModelFactory.Create(); - newViewModel.Initialise(newScript); - newViewModel.Description = "New Script"; + newViewModel.Initialise(newScript, true); _avalonDockWorkspaceViewModel.AddDocument(newViewModel); } diff --git a/Filtration/ViewModels/ReplaceColorsViewModel.cs b/Filtration/ViewModels/ReplaceColorsViewModel.cs index 176296a..8c379c4 100644 --- a/Filtration/ViewModels/ReplaceColorsViewModel.cs +++ b/Filtration/ViewModels/ReplaceColorsViewModel.cs @@ -1,8 +1,11 @@ -using System.Linq; +using System.Collections.ObjectModel; +using System.Linq; using System.Windows.Media; using Filtration.Models; using Filtration.Models.BlockItemTypes; +using Filtration.Views; using GalaSoft.MvvmLight.CommandWpf; +using Xceed.Wpf.Toolkit; namespace Filtration.ViewModels { @@ -58,6 +61,16 @@ namespace Filtration.ViewModels _itemFilterScript = itemFilterScript; } + public ObservableCollection AvailableColors + { + get + { + { + return PathOfExileColors.DefaultColors; + } + } + } + public Color NewTextColor { get { return _replaceColorsParameterSet.NewTextColor; } diff --git a/Filtration/ViewModels/StartPageViewModel.cs b/Filtration/ViewModels/StartPageViewModel.cs index fd810da..2c9d4b9 100644 --- a/Filtration/ViewModels/StartPageViewModel.cs +++ b/Filtration/ViewModels/StartPageViewModel.cs @@ -1,4 +1,5 @@ using GalaSoft.MvvmLight.CommandWpf; +using GalaSoft.MvvmLight.Messaging; namespace Filtration.ViewModels { @@ -12,12 +13,23 @@ namespace Filtration.ViewModels public StartPageViewModel() { Title = "Start Page"; + OpenScriptCommand = new RelayCommand(OnOpenScriptCommand); + NewScriptCommand = new RelayCommand(OnNewScriptCommand); } - // TODO: Replace with MVVMLight ViewModel Messages - public RelayCommand OpenScriptCommand { get { return null; } } - public RelayCommand NewScriptCommand { get { return null; } } + public RelayCommand OpenScriptCommand { get; private set; } + public RelayCommand NewScriptCommand { get; private set; } public bool IsScript { get { return false; } } + + private static void OnOpenScriptCommand() + { + Messenger.Default.Send(new NotificationMessage("OpenScript")); + } + + private static void OnNewScriptCommand() + { + Messenger.Default.Send(new NotificationMessage("NewScript")); + } } } diff --git a/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml b/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml index 895f80c..24f9ab9 100644 --- a/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml +++ b/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml @@ -22,7 +22,7 @@ AnchorablesSource="{Binding Tools}" AllowMixedOrientation="True" DocumentsSource="{Binding OpenDocuments}" - ActiveContent="{Binding ActiveDocument, Mode=TwoWay, Converter={StaticResource ActiveDocumentConverter}}"> + ActiveContent="{Binding ActiveDocument, Mode=TwoWay, Converter={StaticResource ActiveDocumentConverter}}" > @@ -79,7 +79,7 @@ - + diff --git a/Filtration/Views/AvalonDock/LayoutInitializer.cs b/Filtration/Views/AvalonDock/LayoutInitializer.cs index bb6780c..9d36602 100644 --- a/Filtration/Views/AvalonDock/LayoutInitializer.cs +++ b/Filtration/Views/AvalonDock/LayoutInitializer.cs @@ -1,4 +1,6 @@ -using Xceed.Wpf.AvalonDock.Layout; +using System.Linq; +using Filtration.ViewModels; +using Xceed.Wpf.AvalonDock.Layout; namespace Filtration.Views.AvalonDock { @@ -14,6 +16,16 @@ namespace Filtration.Views.AvalonDock destinationContainer.FindParent() != null) return false; + if (anchorableToShow.Content is SectionBrowserViewModel) + { + var toolsPane = layout.Descendents().OfType().FirstOrDefault(d => d.Name == "SectionBrowserPane"); + if (toolsPane != null) + { + anchorableToShow.CanHide = false; + toolsPane.Children.Add(anchorableToShow); + return true; + } + } //if (anchorableToShow.ContentId == "SectionBrowserTool") //{ // var toolsPane = layout.Descendents().OfType().FirstOrDefault(d => d.Name == "SectionBrowserPane"); diff --git a/Filtration/Views/Behaviors/BindableSelectedItemBehavior.cs b/Filtration/Views/Behaviors/BindableSelectedItemBehavior.cs new file mode 100644 index 0000000..6a82b47 --- /dev/null +++ b/Filtration/Views/Behaviors/BindableSelectedItemBehavior.cs @@ -0,0 +1,55 @@ +// Taken from http://stackoverflow.com/a/5118406/4153185 +using System.Windows; +using System.Windows.Controls; +using System.Windows.Interactivity; + +namespace Filtration.Views.Behaviors +{ + internal class BindableSelectedItemBehavior : Behavior + { + #region SelectedItem Property + + public object SelectedItem + { + get { return GetValue(SelectedItemProperty); } + set { SetValue(SelectedItemProperty, value); } + } + + public static readonly DependencyProperty SelectedItemProperty = + DependencyProperty.Register("SelectedItem", typeof (object), typeof (BindableSelectedItemBehavior), + new UIPropertyMetadata(null, OnSelectedItemChanged)); + + private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) + { + var item = e.NewValue as TreeViewItem; + if (item != null) + { + item.SetValue(TreeViewItem.IsSelectedProperty, true); + } + } + + #endregion + + protected override void OnAttached() + { + base.OnAttached(); + + AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged; + } + + protected override void OnDetaching() + { + base.OnDetaching(); + + if (AssociatedObject != null) + { + AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged; + } + } + + private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) + { + SelectedItem = e.NewValue; + } + } +} diff --git a/Filtration/Views/IconsDictionary.xaml b/Filtration/Views/IconsDictionary.xaml index 6978cea..d5b4f3b 100644 --- a/Filtration/Views/IconsDictionary.xaml +++ b/Filtration/Views/IconsDictionary.xaml @@ -17,4 +17,6 @@ + + \ No newline at end of file diff --git a/Filtration/Views/ItemFilterBlockDisplaySettingsView.xaml b/Filtration/Views/ItemFilterBlockDisplaySettingsView.xaml index b447dd2..fd4be7c 100644 --- a/Filtration/Views/ItemFilterBlockDisplaySettingsView.xaml +++ b/Filtration/Views/ItemFilterBlockDisplaySettingsView.xaml @@ -62,7 +62,7 @@ - + diff --git a/Filtration/Views/ItemFilterScriptView.xaml b/Filtration/Views/ItemFilterScriptView.xaml index 65b6823..b9ed597 100644 --- a/Filtration/Views/ItemFilterScriptView.xaml +++ b/Filtration/Views/ItemFilterScriptView.xaml @@ -47,39 +47,22 @@ - - -