diff --git a/Filtration/Converters/ActiveDocumentConverter.cs b/Filtration/Converters/ActiveDocumentConverter.cs index 9d5939f..96c4019 100644 --- a/Filtration/Converters/ActiveDocumentConverter.cs +++ b/Filtration/Converters/ActiveDocumentConverter.cs @@ -9,7 +9,7 @@ namespace Filtration.Converters { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - if (value is ItemFilterScriptViewModel) + if (value is IDocument) return value; return Binding.DoNothing; @@ -17,7 +17,7 @@ namespace Filtration.Converters public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { - if (value is ItemFilterScriptViewModel) + if (value is IDocument) return value; return Binding.DoNothing; diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj index 2f534f8..6578693 100644 --- a/Filtration/Filtration.csproj +++ b/Filtration/Filtration.csproj @@ -170,7 +170,9 @@ ItemPreviewControl.xaml + + @@ -178,8 +180,13 @@ + + + + BlockGroupBrowserView.xaml + ItemFilterBlockDisplaySettingsView.xaml @@ -199,15 +206,18 @@ AboutWindow.xaml - - - + + + ReplaceColorsWindow.xaml SectionBrowserView.xaml + + StartPageView.xaml + @@ -217,6 +227,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -282,6 +296,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + @@ -338,6 +356,7 @@ + Always diff --git a/Filtration/Models/ItemFilterBlockGroup.cs b/Filtration/Models/ItemFilterBlockGroup.cs index 39acf0f..218123e 100644 --- a/Filtration/Models/ItemFilterBlockGroup.cs +++ b/Filtration/Models/ItemFilterBlockGroup.cs @@ -16,10 +16,15 @@ namespace Filtration.Models var currentBlockGroup = this; var outputString = GroupName; - while (currentBlockGroup.ParentGroup.ParentGroup != null) + + // TODO: This is retarded, fix this. + if (currentBlockGroup.ParentGroup != null) { - outputString = currentBlockGroup.ParentGroup.GroupName + " - " + outputString; - currentBlockGroup = currentBlockGroup.ParentGroup; + while (currentBlockGroup.ParentGroup.ParentGroup != null) + { + outputString = currentBlockGroup.ParentGroup.GroupName + " - " + outputString; + currentBlockGroup = currentBlockGroup.ParentGroup; + } } return outputString; diff --git a/Filtration/Resources/Icons/block_group_browser_icon.png b/Filtration/Resources/Icons/block_group_browser_icon.png new file mode 100644 index 0000000..f688ab4 Binary files /dev/null and b/Filtration/Resources/Icons/block_group_browser_icon.png differ diff --git a/Filtration/ViewModels/IDocument.cs b/Filtration/ViewModels/IDocument.cs new file mode 100644 index 0000000..0b7051d --- /dev/null +++ b/Filtration/ViewModels/IDocument.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Filtration.ViewModels +{ + interface IDocument + { + bool IsScript { get; } + } +} diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs index f56fe65..8e0cec7 100644 --- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs +++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs @@ -18,7 +18,9 @@ namespace Filtration.ViewModels string DisplayName { get; } void Initialise(ItemFilterScript itemFilterScript); IItemFilterBlockViewModel SelectedBlockViewModel { get; set; } + IItemFilterBlockViewModel SectionBrowserSelectedBlockViewModel { get; set; } void RemoveDirtyFlag(); + IEnumerable BlockGroups { get; } IEnumerable ItemFilterSectionViewModels { get; } void AddSection(IItemFilterBlockViewModel targetBlockViewModel); void AddBlock(IItemFilterBlockViewModel targetBlockViewModel); @@ -26,15 +28,18 @@ namespace Filtration.ViewModels void PasteBlock(IItemFilterBlockViewModel targetBlockViewModel); } - internal class ItemFilterScriptViewModel : PaneViewModel, IItemFilterScriptViewModel + internal class ItemFilterScriptViewModel : PaneViewModel, IItemFilterScriptViewModel, IDocument { private readonly IItemFilterBlockViewModelFactory _itemFilterBlockViewModelFactory; private readonly IItemFilterBlockTranslator _blockTranslator; + private readonly IMainWindowViewModel _mainWindowViewModel; private bool _isDirty; private IItemFilterBlockViewModel _selectedBlockViewModel; + private IItemFilterBlockViewModel _sectionBrowserSelectedBlockViewModel; - public ItemFilterScriptViewModel(IItemFilterBlockViewModelFactory itemFilterBlockViewModelFactory, IItemFilterBlockTranslator blockTranslator) + public ItemFilterScriptViewModel(IItemFilterBlockViewModelFactory itemFilterBlockViewModelFactory, IItemFilterBlockTranslator blockTranslator, IMainWindowViewModel mainWindowViewModel) { + CloseCommand = new RelayCommand(OnCloseCommand); DeleteBlockCommand = new RelayCommand(OnDeleteBlockCommand, () => SelectedBlockViewModel != null); MoveBlockToTopCommand = new RelayCommand(OnMoveBlockToTopCommand, () => SelectedBlockViewModel != null); MoveBlockUpCommand = new RelayCommand(OnMoveBlockUpCommand, () => SelectedBlockViewModel != null); @@ -46,10 +51,16 @@ namespace Filtration.ViewModels PasteBlockCommand = new RelayCommand(OnPasteBlockCommand, () => SelectedBlockViewModel != null); _itemFilterBlockViewModelFactory = itemFilterBlockViewModelFactory; _blockTranslator = blockTranslator; + _mainWindowViewModel = mainWindowViewModel; ItemFilterBlockViewModels = new ObservableCollection(); - } + public bool IsScript + { + get { return true; } + } + + public RelayCommand CloseCommand { get; private set; } public RelayCommand DeleteBlockCommand { get; private set; } public RelayCommand MoveBlockToTopCommand { get; private set; } public RelayCommand MoveBlockUpCommand { get; private set; } @@ -66,9 +77,7 @@ namespace Filtration.ViewModels { get { return ItemFilterBlockViewModels.Where(b => b.Block.GetType() == typeof (ItemFilterSection)); } } - - public IItemFilterBlockViewModel SectionBrowserSelectedViewModel { get; set; } - + public string Description { get { return Script.Description; } @@ -90,8 +99,24 @@ namespace Filtration.ViewModels } } + public IItemFilterBlockViewModel SectionBrowserSelectedBlockViewModel + { + get { return _sectionBrowserSelectedBlockViewModel; } + set + { + _sectionBrowserSelectedBlockViewModel = value; + SelectedBlockViewModel = value; + RaisePropertyChanged(); + } + } + public ItemFilterScript Script { get; private set; } + public IEnumerable BlockGroups + { + get { return Script.ItemFilterBlockGroups; } + } + public bool IsDirty { get { return _isDirty || HasDirtyChildren; } @@ -153,6 +178,10 @@ namespace Filtration.ViewModels ContentId = "testcontentid"; } + private void OnCloseCommand() + { + _mainWindowViewModel.Close(this); + } private void OnCopyBlockCommand() { CopyBlock(SelectedBlockViewModel); diff --git a/Filtration/ViewModels/MainWindowViewModel.cs b/Filtration/ViewModels/MainWindowViewModel.cs index f9332a1..40b36d0 100644 --- a/Filtration/ViewModels/MainWindowViewModel.cs +++ b/Filtration/ViewModels/MainWindowViewModel.cs @@ -10,7 +10,6 @@ using Filtration.Services; using Filtration.Translators; using Filtration.Views; using GalaSoft.MvvmLight.CommandWpf; -using Xceed.Wpf.AvalonDock.Layout; using Clipboard = System.Windows.Clipboard; using OpenFileDialog = Microsoft.Win32.OpenFileDialog; @@ -18,9 +17,13 @@ namespace Filtration.ViewModels { internal interface IMainWindowViewModel { - IItemFilterScriptViewModel ActiveDocument { get; set; } + IDocument ActiveDocument { get; set; } + IItemFilterScriptViewModel ActiveScriptViewModel { get; } event EventHandler ActiveDocumentChanged; void LoadScriptFromFile(string path); + RelayCommand OpenScriptCommand { get; } + RelayCommand NewScriptCommand { get; } + void Close(IDocument scriptToClose); } internal class MainWindowViewModel : FiltrationViewModelBase, IMainWindowViewModel @@ -32,38 +35,52 @@ namespace Filtration.ViewModels private readonly IItemFilterPersistenceService _persistenceService; private readonly IItemFilterScriptTranslator _itemFilterScriptTranslator; private readonly IReplaceColorsViewModel _replaceColorsViewModel; - private IItemFilterScriptViewModel _activeDocument; - private readonly ObservableCollection _scriptViewModels; - private readonly SectionBrowserViewModel _sectionBrowserViewModel; + private IDocument _activeDocument; + private IItemFilterScriptViewModel _activeScriptViewModel; + private readonly ObservableCollection _openDocuments; + private readonly ISectionBrowserViewModel _sectionBrowserViewModel; + private readonly IBlockGroupBrowserViewModel _blockGroupBrowserViewModel; + private readonly IStartPageViewModel _startPageViewModel; public MainWindowViewModel(IItemFilterScriptViewModelFactory itemFilterScriptViewModelFactory, IItemFilterPersistenceService persistenceService, IItemFilterScriptTranslator itemFilterScriptTranslator, - IReplaceColorsViewModel replaceColorsViewModel) + IReplaceColorsViewModel replaceColorsViewModel, + ISectionBrowserViewModel sectionBrowserViewModel, + IBlockGroupBrowserViewModel blockGroupBrowserViewModel, + IStartPageViewModel startPageViewModel) { _itemFilterScriptViewModelFactory = itemFilterScriptViewModelFactory; _persistenceService = persistenceService; _itemFilterScriptTranslator = itemFilterScriptTranslator; _replaceColorsViewModel = replaceColorsViewModel; - _sectionBrowserViewModel = new SectionBrowserViewModel(); - _sectionBrowserViewModel.Initialise(this); + _sectionBrowserViewModel = sectionBrowserViewModel; + _blockGroupBrowserViewModel = blockGroupBrowserViewModel; + _startPageViewModel = startPageViewModel; - _scriptViewModels = new ObservableCollection(); + _sectionBrowserViewModel.Initialise(this); + _blockGroupBrowserViewModel.Initialise(this); + _startPageViewModel.Initialise(this); + + _openDocuments = new ObservableCollection(); OpenAboutWindowCommand = new RelayCommand(OnOpenAboutWindowCommand); OpenScriptCommand = new RelayCommand(OnOpenScriptCommand); - SaveScriptCommand = new RelayCommand(OnSaveScriptCommand, () => ActiveDocument != null); - SaveScriptAsCommand = new RelayCommand(OnSaveScriptAsCommand, () => ActiveDocument != null); - CopyScriptCommand = new RelayCommand(OnCopyScriptCommand, () => ActiveDocument != null); - CopyBlockCommand = new RelayCommand(OnCopyBlockCommand, () => ActiveDocument != null && ActiveDocument.SelectedBlockViewModel != null); - PasteCommand = new RelayCommand(OnPasteCommand, () => ActiveDocument != null && ActiveDocument.SelectedBlockViewModel != null); + SaveScriptCommand = new RelayCommand(OnSaveScriptCommand, () => ActiveDocument != null && ActiveDocument.IsScript); + SaveScriptAsCommand = new RelayCommand(OnSaveScriptAsCommand, () => ActiveDocument != null && ActiveDocument.IsScript); + CopyScriptCommand = new RelayCommand(OnCopyScriptCommand, () => ActiveDocument != null && ActiveDocument.IsScript); + CopyBlockCommand = new RelayCommand(OnCopyBlockCommand, () => ActiveDocument != null && ActiveDocument.IsScript && ((IItemFilterScriptViewModel)ActiveDocument).SelectedBlockViewModel != null); + PasteCommand = new RelayCommand(OnPasteCommand, () => ActiveDocument != null && ActiveDocument.IsScript && ((IItemFilterScriptViewModel)ActiveDocument).SelectedBlockViewModel != null); NewScriptCommand = new RelayCommand(OnNewScriptCommand); - CloseScriptCommand = new RelayCommand(OnCloseScriptCommand, v => ActiveDocument != null); - ReplaceColorsCommand = new RelayCommand(OnReplaceColorsCommand, () => ActiveDocument != null); + CloseScriptCommand = new RelayCommand(OnCloseScriptCommand, v => ActiveDocument != null && ActiveDocument.IsScript); + ReplaceColorsCommand = new RelayCommand(OnReplaceColorsCommand, () => ActiveDocument != null && ActiveDocument.IsScript); //LoadScriptFromFile("C:\\ThioleLootFilter.txt"); SetItemFilterScriptDirectory(); + + _openDocuments.Add(_startPageViewModel); + ActiveDocument = startPageViewModel; } public RelayCommand OpenScriptCommand { get; private set; } @@ -73,38 +90,30 @@ namespace Filtration.ViewModels public RelayCommand PasteCommand { get; private set; } public RelayCommand CopyScriptCommand { get; private set; } public RelayCommand NewScriptCommand { get; private set; } - public RelayCommand CloseScriptCommand { get; private set; } + public RelayCommand CloseScriptCommand { get; private set; } public RelayCommand OpenAboutWindowCommand { get; private set; } public RelayCommand ReplaceColorsCommand { get; private set; } - public ObservableCollection ScriptViewModels + public ObservableCollection OpenDocuments { - get { return _scriptViewModels; } + get { return _openDocuments; } } - private List _tools; + private List _tools; - public IEnumerable Tools + public IEnumerable Tools { get { if (_tools == null) { - _tools = new List { _sectionBrowserViewModel }; + _tools = new List {_sectionBrowserViewModel, _blockGroupBrowserViewModel}; } return _tools; } } - public SectionBrowserViewModel SectionBrowserViewModel - { - get - { - return _sectionBrowserViewModel; - } - } - public string WindowTitle { get @@ -115,14 +124,19 @@ namespace Filtration.ViewModels } } - [DoNotWire] - public IItemFilterScriptViewModel ActiveDocument + public IDocument ActiveDocument { get { return _activeDocument; } set { _activeDocument = value; RaisePropertyChanged(); + + if (value.IsScript) + { + _activeScriptViewModel = (IItemFilterScriptViewModel)value; + } + if (ActiveDocumentChanged != null) { ActiveDocumentChanged(this, EventArgs.Empty); @@ -134,6 +148,12 @@ namespace Filtration.ViewModels } } + public IItemFilterScriptViewModel ActiveScriptViewModel + { + get { return _activeScriptViewModel; } + } + + public event EventHandler ActiveDocumentChanged; public bool NoScriptsOpen @@ -175,8 +195,9 @@ namespace Filtration.ViewModels var newViewModel = _itemFilterScriptViewModelFactory.Create(); newViewModel.Initialise(_loadedScript); - ScriptViewModels.Add(newViewModel); - ActiveDocument = newViewModel; + _activeScriptViewModel = newViewModel; + OpenDocuments.Add((IDocument)newViewModel); + ActiveDocument = (IDocument)newViewModel; } private void SetItemFilterScriptDirectory() @@ -206,7 +227,7 @@ namespace Filtration.ViewModels { if (!ValidateScript()) return; - if (string.IsNullOrEmpty(ActiveDocument.Script.FilePath)) + if (string.IsNullOrEmpty(_activeScriptViewModel.Script.FilePath)) { OnSaveScriptAsCommand(); return; @@ -214,8 +235,8 @@ namespace Filtration.ViewModels try { - _persistenceService.SaveItemFilterScript(ActiveDocument.Script); - ActiveDocument.RemoveDirtyFlag(); + _persistenceService.SaveItemFilterScript(_activeScriptViewModel.Script); + _activeScriptViewModel.RemoveDirtyFlag(); } catch (Exception e) { @@ -240,31 +261,31 @@ namespace Filtration.ViewModels if (result != DialogResult.OK) return; - var previousFilePath = ActiveDocument.Script.FilePath; + var previousFilePath = _activeScriptViewModel.Script.FilePath; try { - ActiveDocument.Script.FilePath = saveDialog.FileName; - _persistenceService.SaveItemFilterScript(ActiveDocument.Script); - ActiveDocument.RemoveDirtyFlag(); + _activeScriptViewModel.Script.FilePath = saveDialog.FileName; + _persistenceService.SaveItemFilterScript(_activeScriptViewModel.Script); + _activeScriptViewModel.RemoveDirtyFlag(); } catch (Exception e) { MessageBox.Show(@"Error saving filter file - " + e.Message, @"Save Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - ActiveDocument.Script.FilePath = previousFilePath; + _activeScriptViewModel.Script.FilePath = previousFilePath; } } private void OnReplaceColorsCommand() { - _replaceColorsViewModel.Initialise(ActiveDocument.Script); + _replaceColorsViewModel.Initialise(_activeScriptViewModel.Script); var replaceColorsWindow = new ReplaceColorsWindow {DataContext = _replaceColorsViewModel}; replaceColorsWindow.ShowDialog(); } private bool ValidateScript() { - var result = ActiveDocument.Script.Validate(); + var result = _activeScriptViewModel.Script.Validate(); if (result.Count == 0) return true; @@ -283,17 +304,17 @@ namespace Filtration.ViewModels private void OnCopyScriptCommand() { - Clipboard.SetText(_itemFilterScriptTranslator.TranslateItemFilterScriptToString(_activeDocument.Script)); + Clipboard.SetText(_itemFilterScriptTranslator.TranslateItemFilterScriptToString(_activeScriptViewModel.Script)); } private void OnCopyBlockCommand() { - _activeDocument.CopyBlock(_activeDocument.SelectedBlockViewModel); + _activeScriptViewModel.CopyBlock(_activeScriptViewModel.SelectedBlockViewModel); } private void OnPasteCommand() { - _activeDocument.PasteBlock(_activeDocument.SelectedBlockViewModel); + _activeScriptViewModel.PasteBlock(_activeScriptViewModel.SelectedBlockViewModel); } private void OnNewScriptCommand() @@ -302,40 +323,66 @@ namespace Filtration.ViewModels var newViewModel = _itemFilterScriptViewModelFactory.Create(); newViewModel.Initialise(newScript); newViewModel.Description = "New Script"; - ScriptViewModels.Add(newViewModel); - ActiveDocument = newViewModel; + _activeScriptViewModel = newViewModel; + OpenDocuments.Add((IDocument)newViewModel); + ActiveDocument = (IDocument)newViewModel; } - private void OnCloseScriptCommand(IItemFilterScriptViewModel scriptViewModel) + private void OnCloseScriptCommand(IDocument documentToClose) { - ActiveDocument = scriptViewModel; - if (!ActiveDocument.IsDirty) + Close(documentToClose); + } + + public void Close(IDocument documentToClose) + { + ActiveDocument = documentToClose; + if (ActiveDocument.IsScript) { - ScriptViewModels.Remove(ActiveDocument); - } - else - { - var result = MessageBox.Show(@"Want to save your changes to this script?", - @"Filtration", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); - switch (result) + if (!_activeScriptViewModel.IsDirty) { - case DialogResult.Yes: + RemoveDocument(ActiveDocument); + } + else + { + var result = MessageBox.Show(@"Want to save your changes to this script?", + @"Filtration", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + switch (result) { - OnSaveScriptCommand(); - ScriptViewModels.Remove(ActiveDocument); - break; - } - case DialogResult.No: - { - ScriptViewModels.Remove(ActiveDocument); - break; - } - case DialogResult.Cancel: - { - break; + case DialogResult.Yes: + { + OnSaveScriptCommand(); + RemoveDocument(ActiveDocument); + break; + } + case DialogResult.No: + { + RemoveDocument(ActiveDocument); + break; + } + case DialogResult.Cancel: + { + return; + } } } } + else + { + RemoveDocument(documentToClose); + } + } + + private void RemoveDocument(IDocument documentToRemove) + { + if (documentToRemove.IsScript) + { + _sectionBrowserViewModel.ClearDown(); + } + + OpenDocuments.Remove(documentToRemove); + } + + } } diff --git a/Filtration/ViewModels/SectionBrowserViewModel.cs b/Filtration/ViewModels/SectionBrowserViewModel.cs index d043ebf..f564205 100644 --- a/Filtration/ViewModels/SectionBrowserViewModel.cs +++ b/Filtration/ViewModels/SectionBrowserViewModel.cs @@ -1,32 +1,38 @@ using System; using System.Collections.Generic; +using System.Windows.Media; +using System.Windows.Media.Imaging; namespace Filtration.ViewModels { - internal interface ISectionBrowserViewModel + internal interface ISectionBrowserViewModel : IToolViewModel { + void ClearDown(); } internal class SectionBrowserViewModel : ToolViewModel, ISectionBrowserViewModel { - private IMainWindowViewModel _mainWindowViewModel; private IEnumerable _sectionBlockViewModels; private IItemFilterBlockViewModel _selectedSectionBlockViewModel; public SectionBrowserViewModel() : base("Section Browser") { - ContentId = ToolContentId; - } - - public void Initialise(IMainWindowViewModel mainWindowViewModel) - { - _mainWindowViewModel = mainWindowViewModel; - _mainWindowViewModel.ActiveDocumentChanged += OnActiveDocumentChanged; + var icon = new BitmapImage(); + icon.BeginInit(); + icon.UriSource = new Uri("pack://application:,,,/Filtration;component/Resources/Icons/add_section_icon.png"); + icon.EndInit(); + IconSource = icon; } public const string ToolContentId = "SectionBrowserTool"; + public override void Initialise(IMainWindowViewModel mainWindowViewModel) + { + base.Initialise(mainWindowViewModel); + MainWindowViewModel.ActiveDocumentChanged += OnActiveDocumentChanged; + } + public IEnumerable SectionBlockViewModels { get { return _sectionBlockViewModels; } @@ -43,13 +49,30 @@ namespace Filtration.ViewModels set { _selectedSectionBlockViewModel = value; + if (MainWindowViewModel.ActiveDocument.IsScript) + { + MainWindowViewModel.ActiveScriptViewModel.SectionBrowserSelectedBlockViewModel = value; + } RaisePropertyChanged(); } } private void OnActiveDocumentChanged(object sender, EventArgs e) { - SectionBlockViewModels = _mainWindowViewModel.ActiveDocument != null ? _mainWindowViewModel.ActiveDocument.ItemFilterSectionViewModels : null; + if (MainWindowViewModel.ActiveScriptViewModel != null && MainWindowViewModel.ActiveDocument.IsScript) + { + SectionBlockViewModels = MainWindowViewModel.ActiveScriptViewModel.ItemFilterSectionViewModels; + } + else + { + ClearDown(); + } + } + + public void ClearDown() + { + SectionBlockViewModels = null; + SelectedSectionBlockViewModel = null; } } } diff --git a/Filtration/ViewModels/StartPageViewModel.cs b/Filtration/ViewModels/StartPageViewModel.cs new file mode 100644 index 0000000..2b6ab9b --- /dev/null +++ b/Filtration/ViewModels/StartPageViewModel.cs @@ -0,0 +1,29 @@ +using GalaSoft.MvvmLight.CommandWpf; + +namespace Filtration.ViewModels +{ + internal interface IStartPageViewModel : IDocument + { + void Initialise(IMainWindowViewModel mainWindowViewModel); + } + + internal class StartPageViewModel : PaneViewModel, IStartPageViewModel + { + private IMainWindowViewModel _mainWindowViewModel; + + public StartPageViewModel() + { + Title = "Start Page"; + } + + public void Initialise(IMainWindowViewModel mainWindowViewModel) + { + _mainWindowViewModel = mainWindowViewModel; + } + + public RelayCommand OpenScriptCommand { get { return _mainWindowViewModel.OpenScriptCommand; } } + public RelayCommand NewScriptCommand { get { return _mainWindowViewModel.NewScriptCommand; } } + + public bool IsScript { get { return false; } } + } +} diff --git a/Filtration/ViewModels/ToolViewModel.cs b/Filtration/ViewModels/ToolViewModel.cs index f9c3fda..bba616c 100644 --- a/Filtration/ViewModels/ToolViewModel.cs +++ b/Filtration/ViewModels/ToolViewModel.cs @@ -1,6 +1,11 @@ namespace Filtration.ViewModels { - class ToolViewModel : PaneViewModel + internal interface IToolViewModel + { + void Initialise(IMainWindowViewModel mainWindowViewModel); + } + + class ToolViewModel : PaneViewModel, IToolViewModel { public ToolViewModel(string name) { @@ -23,5 +28,12 @@ } } } + + protected IMainWindowViewModel MainWindowViewModel { get; private set; } + + public virtual void Initialise(IMainWindowViewModel mainWindowViewModel) + { + MainWindowViewModel = mainWindowViewModel; + } } } diff --git a/Filtration/Views/AttachedProperties/SelectingItemAttachedProperty.cs b/Filtration/Views/AttachedProperties/SelectingItemAttachedProperty.cs new file mode 100644 index 0000000..4d5e8f6 --- /dev/null +++ b/Filtration/Views/AttachedProperties/SelectingItemAttachedProperty.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using Filtration.ViewModels; + +namespace Filtration.Views.AttachedProperties +{ + internal class SelectingItemAttachedProperty + { + public static readonly DependencyProperty SelectingItemProperty = DependencyProperty.RegisterAttached( + "SelectingItem", + typeof(IItemFilterBlockViewModel), + typeof(SelectingItemAttachedProperty), + new PropertyMetadata(default(IItemFilterBlockViewModel), OnSelectingItemChanged)); + + public static IItemFilterBlockViewModel GetSelectingItem(DependencyObject target) + { + return (IItemFilterBlockViewModel)target.GetValue(SelectingItemProperty); + } + + public static void SetSelectingItem(DependencyObject target, IItemFilterBlockViewModel value) + { + target.SetValue(SelectingItemProperty, value); + } + + static void OnSelectingItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) + { + var listBox = sender as ListBox; + if (listBox == null || listBox.SelectedItem == null) + { + return; + } + + listBox.Dispatcher.InvokeAsync(() => + { + listBox.UpdateLayout(); + listBox.ScrollIntoView(listBox.SelectedItem); + }); + } + } +} diff --git a/Filtration/Views/LayoutInitializer.cs b/Filtration/Views/AvalonDock/LayoutInitializer.cs similarity index 53% rename from Filtration/Views/LayoutInitializer.cs rename to Filtration/Views/AvalonDock/LayoutInitializer.cs index ec2696d..9452a37 100644 --- a/Filtration/Views/LayoutInitializer.cs +++ b/Filtration/Views/AvalonDock/LayoutInitializer.cs @@ -1,7 +1,7 @@ using System.Linq; using Xceed.Wpf.AvalonDock.Layout; -namespace Filtration.Views +namespace Filtration.Views.AvalonDock { class LayoutInitializer : ILayoutUpdateStrategy { @@ -15,12 +15,29 @@ namespace Filtration.Views destinationContainer.FindParent() != null) return false; - var toolsPane = layout.Descendents().OfType().FirstOrDefault(d => d.Name == "ToolsPane"); - if (toolsPane != null) - { - toolsPane.Children.Add(anchorableToShow); - return true; - } + //if (anchorableToShow.ContentId == "SectionBrowserTool") + //{ + // 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 == "BlockGroupBrowserTool") + //{ + // var toolsPane = layout.Descendents().OfType().FirstOrDefault(d => d.Name == "BlockGroupBrowserPane"); + // if (toolsPane != null) + // { + // anchorableToShow.CanHide = false; + // toolsPane.Children.Add(anchorableToShow); + // return true; + // } + //} + + return false; diff --git a/Filtration/Views/PanesStyleSelector.cs b/Filtration/Views/AvalonDock/PanesStyleSelector.cs similarity index 73% rename from Filtration/Views/PanesStyleSelector.cs rename to Filtration/Views/AvalonDock/PanesStyleSelector.cs index ea96fe7..d3e7df7 100644 --- a/Filtration/Views/PanesStyleSelector.cs +++ b/Filtration/Views/AvalonDock/PanesStyleSelector.cs @@ -2,12 +2,12 @@ using System.Windows.Controls; using Filtration.ViewModels; -namespace Filtration.Views +namespace Filtration.Views.AvalonDock { class PanesStyleSelector : StyleSelector { public Style ToolStyle { get; set; } - public Style ScriptStyle { get; set; } + public Style DocumentStyle { get; set; } public override Style SelectStyle(object item, DependencyObject container) { @@ -16,11 +16,11 @@ namespace Filtration.Views return ToolStyle; } - if (item is IItemFilterScriptViewModel) + if (item is IDocument) { - return ScriptStyle; + return DocumentStyle; } - + return base.SelectStyle(item, container); } } diff --git a/Filtration/Views/PanesTemplateSelector.cs b/Filtration/Views/AvalonDock/PanesTemplateSelector.cs similarity index 66% rename from Filtration/Views/PanesTemplateSelector.cs rename to Filtration/Views/AvalonDock/PanesTemplateSelector.cs index 6803e8c..8baab8d 100644 --- a/Filtration/Views/PanesTemplateSelector.cs +++ b/Filtration/Views/AvalonDock/PanesTemplateSelector.cs @@ -3,15 +3,14 @@ using System.Windows.Controls; using Filtration.ViewModels; using Xceed.Wpf.AvalonDock.Layout; -namespace Filtration.Views +namespace Filtration.Views.AvalonDock { class PanesTemplateSelector : DataTemplateSelector { public DataTemplate ItemFilterScriptTemplate { get; set; } - + public DataTemplate BlockGroupBrowserTemplate { get; set; } public DataTemplate SectionBrowserTemplate { get; set; } - - + public DataTemplate StartPageTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { @@ -27,6 +26,16 @@ namespace Filtration.Views return SectionBrowserTemplate; } + if (item is BlockGroupBrowserViewModel) + { + return BlockGroupBrowserTemplate; + } + + if (item is StartPageViewModel) + { + return StartPageTemplate; + } + return base.SelectTemplate(item, container); } } diff --git a/Filtration/Views/BlockGroupBrowserView.xaml b/Filtration/Views/BlockGroupBrowserView.xaml new file mode 100644 index 0000000..6d33536 --- /dev/null +++ b/Filtration/Views/BlockGroupBrowserView.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + diff --git a/Filtration/Views/BlockGroupBrowserView.xaml.cs b/Filtration/Views/BlockGroupBrowserView.xaml.cs new file mode 100644 index 0000000..cceb3f2 --- /dev/null +++ b/Filtration/Views/BlockGroupBrowserView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Filtration.Views +{ + /// + /// Interaction logic for BlockGroupBrowserView.xaml + /// + public partial class BlockGroupBrowserView : UserControl + { + public BlockGroupBrowserView() + { + InitializeComponent(); + } + } +} diff --git a/Filtration/Views/ItemFilterScriptView.xaml b/Filtration/Views/ItemFilterScriptView.xaml index a8288f5..65b6823 100644 --- a/Filtration/Views/ItemFilterScriptView.xaml +++ b/Filtration/Views/ItemFilterScriptView.xaml @@ -4,6 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:views="clr-namespace:Filtration.Views" + xmlns:attachedProperties="clr-namespace:Filtration.Views.AttachedProperties" xmlns:viewModels="clr-namespace:Filtration.ViewModels" xmlns:userControls="clr-namespace:Filtration.UserControls" mc:Ignorable="d" @@ -87,6 +88,7 @@ ScrollViewer.HorizontalScrollBarVisibility="Disabled" VirtualizingStackPanel.VirtualizationMode="Recycling" ItemTemplateSelector="{StaticResource BlockTemplateSelector}" + attachedProperties:SelectingItemAttachedProperty.SelectingItem="{Binding SectionBrowserSelectedBlockViewModel}" SelectedItem="{Binding SelectedBlockViewModel}" x:Name="BlocksListBox"> diff --git a/Filtration/Views/ItemFilterScriptView.xaml.cs b/Filtration/Views/ItemFilterScriptView.xaml.cs index 76ed7e6..9d85b97 100644 --- a/Filtration/Views/ItemFilterScriptView.xaml.cs +++ b/Filtration/Views/ItemFilterScriptView.xaml.cs @@ -1,6 +1,4 @@ -using System.Windows.Controls; - -namespace Filtration.Views +namespace Filtration.Views { public partial class ItemFilterScriptView { @@ -8,11 +6,5 @@ namespace Filtration.Views { InitializeComponent(); } - - private void SectionBrowserListBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) - { - var listBox = (ListBox) sender; - BlocksListBox.ScrollIntoView(listBox.SelectedItem); - } } } diff --git a/Filtration/Views/MainWindow.xaml b/Filtration/Views/MainWindow.xaml index a8f20d3..9345e3d 100644 --- a/Filtration/Views/MainWindow.xaml +++ b/Filtration/Views/MainWindow.xaml @@ -9,6 +9,7 @@ xmlns:avalonDock="http://schemas.xceed.com/wpf/xaml/avalondock" xmlns:converters="clr-namespace:Filtration.Converters" xmlns:views="clr-namespace:Filtration.Views" + xmlns:viewsAvalonDock="clr-namespace:Filtration.Views.AvalonDock" mc:Ignorable="d" d:DataContext="{d:DesignInstance Type=viewModels:MainWindowViewModel}" Title="{Binding WindowTitle}" Height="707" Width="930" BorderThickness="1" BorderBrush="Black"> @@ -50,26 +51,37 @@ - - + + - - + + + + + + + - - + + + + + + + - - + + - - + + - - + + - + - + - + - - - - Welcome to Filtration, to get started either - create a new script or open an existing script diff --git a/Filtration/Views/SectionBrowserView.xaml b/Filtration/Views/SectionBrowserView.xaml index 30ff345..072f36a 100644 --- a/Filtration/Views/SectionBrowserView.xaml +++ b/Filtration/Views/SectionBrowserView.xaml @@ -11,7 +11,6 @@ diff --git a/Filtration/Views/StartPageView.xaml b/Filtration/Views/StartPageView.xaml new file mode 100644 index 0000000..8e3793c --- /dev/null +++ b/Filtration/Views/StartPageView.xaml @@ -0,0 +1,14 @@ + + + + Welcome to Filtration, to get started either + create a new script or open an existing script + + + diff --git a/Filtration/Views/StartPageView.xaml.cs b/Filtration/Views/StartPageView.xaml.cs new file mode 100644 index 0000000..b5b2ba0 --- /dev/null +++ b/Filtration/Views/StartPageView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Filtration.Views +{ + /// + /// Interaction logic for StartPageView.xaml + /// + public partial class StartPageView : UserControl + { + public StartPageView() + { + InitializeComponent(); + } + } +} diff --git a/Filtration/WindsorInstallers/ViewModelsInstaller.cs b/Filtration/WindsorInstallers/ViewModelsInstaller.cs index 7be569e..0495abd 100644 --- a/Filtration/WindsorInstallers/ViewModelsInstaller.cs +++ b/Filtration/WindsorInstallers/ViewModelsInstaller.cs @@ -30,11 +30,21 @@ namespace Filtration.WindsorInstallers .ImplementedBy() .LifeStyle.Singleton); + container.Register( + Component.For() + .ImplementedBy() + .LifeStyle.Singleton); + container.Register( Component.For() .ImplementedBy() .LifeStyle.Singleton); + container.Register( + Component.For() + .ImplementedBy() + .LifeStyle.Singleton); + container.AddFacility(); container.Register( Component.For().AsFactory());