diff --git a/Filtration/App.xaml b/Filtration/App.xaml index 9f53d04..f12e2dd 100644 --- a/Filtration/App.xaml +++ b/Filtration/App.xaml @@ -1,6 +1,7 @@ @@ -11,6 +12,19 @@ + + + + + + + + + + + + + diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj index 3a697c2..93d0910 100644 --- a/Filtration/Filtration.csproj +++ b/Filtration/Filtration.csproj @@ -41,9 +41,6 @@ ..\packages\Castle.Windsor.3.3.0\lib\net45\Castle.Windsor.dll - - ..\..\DragAndDrop(Complete)\DragAndDropLib\bin\Debug\DragAndDropLib.dll - False ..\packages\FontAwesome.WPF.4.3.0.2\lib\FontAwesome.WPF.dll @@ -152,6 +149,7 @@ + LootFilterBlockDisplaySettingsView.xaml diff --git a/Filtration/Properties/AssemblyInfo.cs b/Filtration/Properties/AssemblyInfo.cs index b96ae8e..bb7b74d 100644 --- a/Filtration/Properties/AssemblyInfo.cs +++ b/Filtration/Properties/AssemblyInfo.cs @@ -50,8 +50,7 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.0.*")] [assembly: InternalsVisibleTo("Filtration.Tests")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] \ No newline at end of file diff --git a/Filtration/ViewModels/LootFilterBlockViewModel.cs b/Filtration/ViewModels/LootFilterBlockViewModel.cs index a2b5309..260ef1b 100644 --- a/Filtration/ViewModels/LootFilterBlockViewModel.cs +++ b/Filtration/ViewModels/LootFilterBlockViewModel.cs @@ -15,7 +15,7 @@ namespace Filtration.ViewModels { internal interface ILootFilterBlockViewModel { - void Initialise(LootFilterBlock lootFilterBlock); + void Initialise(LootFilterBlock lootFilterBlock, LootFilterScriptViewModel parentScriptViewModel); bool IsDirty { get; set; } LootFilterBlock Block { get; } } @@ -25,6 +25,7 @@ namespace Filtration.ViewModels private readonly ILootFilterBlockTranslator _translator; private readonly IStaticDataService _staticDataService; private readonly MediaPlayer _mediaPlayer = new MediaPlayer(); + private LootFilterScriptViewModel _parentScriptViewModel; private bool _displaySettingsPopupOpen; @@ -33,7 +34,11 @@ namespace Filtration.ViewModels _translator = translator; _staticDataService = staticDataService; CopyBlockCommand = new RelayCommand(OnCopyConditionCommand); - + AddBlockCommand = new RelayCommand(OnAddBlockCommand); + AddSectionCommand = new RelayCommand(OnAddSectionCommand); + DeleteBlockCommand = new RelayCommand(OnDeleteBlockCommand); + MoveBlockUpCommand = new RelayCommand(OnMoveBlockUpCommand); + MoveBlockDownCommand = new RelayCommand(OnMoveBlockDownCommand); AddFilterBlockItemCommand = new RelayCommand(OnAddFilterBlockItemCommand); AddAudioVisualBlockItemCommand = new RelayCommand(OnAddAudioVisualBlockItemCommand); RemoveFilterBlockItemCommand = new RelayCommand(OnRemoveFilterBlockItemCommand); @@ -41,13 +46,15 @@ namespace Filtration.ViewModels PlaySoundCommand = new RelayCommand(OnPlaySoundCommand, () => HasSound); } - public void Initialise(LootFilterBlock lootFilterBlock) + public void Initialise(LootFilterBlock lootFilterBlock, LootFilterScriptViewModel parentScriptViewModel) { - if (lootFilterBlock == null) + if (lootFilterBlock == null || parentScriptViewModel == null) { throw new ArgumentNullException("lootFilterBlock"); } + _parentScriptViewModel = parentScriptViewModel; + Block = lootFilterBlock; lootFilterBlock.BlockItems.CollectionChanged += OnBlockItemsCollectionChanged; @@ -58,6 +65,11 @@ namespace Filtration.ViewModels } public RelayCommand CopyBlockCommand { get; private set; } + public RelayCommand AddBlockCommand { get; private set; } + public RelayCommand AddSectionCommand { get; private set; } + public RelayCommand DeleteBlockCommand { get; private set; } + public RelayCommand MoveBlockUpCommand { get; private set; } + public RelayCommand MoveBlockDownCommand { get; private set; } public RelayCommand AddFilterBlockItemCommand { get; private set; } public RelayCommand AddAudioVisualBlockItemCommand { get; private set; } public RelayCommand RemoveFilterBlockItemCommand { get; private set; } @@ -264,6 +276,31 @@ namespace Filtration.ViewModels IsDirty = true; } + private void OnAddBlockCommand() + { + _parentScriptViewModel.AddBlock(this); + } + + private void OnAddSectionCommand() + { + _parentScriptViewModel.AddSection(this); + } + + private void OnDeleteBlockCommand() + { + _parentScriptViewModel.DeleteBlock(this); + } + + private void OnMoveBlockUpCommand() + { + _parentScriptViewModel.MoveBlockUp(this); + } + + private void OnMoveBlockDownCommand() + { + _parentScriptViewModel.MoveBlockDown(this); + } + private bool AddBlockItemAllowed(Type type) { var blockItem = (ILootFilterBlockItem)Activator.CreateInstance(type); diff --git a/Filtration/ViewModels/LootFilterScriptViewModel.cs b/Filtration/ViewModels/LootFilterScriptViewModel.cs index 1a4d2a6..c5a258b 100644 --- a/Filtration/ViewModels/LootFilterScriptViewModel.cs +++ b/Filtration/ViewModels/LootFilterScriptViewModel.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; @@ -16,26 +15,25 @@ namespace Filtration.ViewModels string Description { get; set; } void Initialise(LootFilterScript lootFilterScript); void RemoveDirtyFlag(); + void AddSection(ILootFilterBlockViewModel blockViewModel); + void AddBlock(ILootFilterBlockViewModel blockViewModel); } internal class LootFilterScriptViewModel : FiltrationViewModelBase, ILootFilterScriptViewModel { private readonly ILootFilterBlockViewModelFactory _lootFilterBlockViewModelFactory; private bool _isDirty; + private ILootFilterBlockViewModel _selectedBlockViewModel; public LootFilterScriptViewModel(ILootFilterBlockViewModelFactory lootFilterBlockViewModelFactory ) { - DeleteBlockCommand = new RelayCommand(OnDeleteBlock, () => SelectedBlockViewModel != null); + DeleteBlockCommand = new RelayCommand(OnDeleteBlockCommand, () => SelectedBlockViewModel != null); MoveBlockToTopCommand = new RelayCommand(OnMoveBlockToTopCommand, () => SelectedBlockViewModel != null); MoveBlockUpCommand = new RelayCommand(OnMoveBlockUpCommand, () => SelectedBlockViewModel != null); MoveBlockDownCommand = new RelayCommand(OnMoveBlockDownCommand, () => SelectedBlockViewModel != null); MoveBlockToBottomCommand = new RelayCommand(OnMoveBlockToBottomCommand, () => SelectedBlockViewModel != null); - AddBlockAboveCommand = new RelayCommand(OnAddBlockAboveCommand, () => SelectedBlockViewModel != null || LootFilterBlockViewModels.Count == 0); - AddBlockBelowCommand = new RelayCommand(OnAddBlockBelowCommand, () => SelectedBlockViewModel != null); - - AddSectionAboveCommand = new RelayCommand(OnAddSectionAboveCommand, () => SelectedBlockViewModel != null); - - SectionBrowserSelectionChangedCommand = new RelayCommand(OnSectionBrowserSelectionChanged); + AddBlockCommand = new RelayCommand(OnAddBlockCommand, () => SelectedBlockViewModel != null); + AddSectionCommand = new RelayCommand(OnAddSectionCommand, () => SelectedBlockViewModel != null); _lootFilterBlockViewModelFactory = lootFilterBlockViewModelFactory; LootFilterBlockViewModels = new ObservableCollection(); @@ -47,10 +45,8 @@ namespace Filtration.ViewModels public RelayCommand MoveBlockUpCommand { get; private set; } public RelayCommand MoveBlockDownCommand { get; private set; } public RelayCommand MoveBlockToBottomCommand { get; private set; } - public RelayCommand AddBlockAboveCommand { get; private set; } - public RelayCommand AddBlockBelowCommand { get; private set; } - public RelayCommand AddSectionAboveCommand { get; private set; } - public RelayCommand SectionBrowserSelectionChangedCommand { get; private set; } + public RelayCommand AddBlockCommand { get; private set; } + public RelayCommand AddSectionCommand { get; private set; } public ObservableCollection LootFilterBlockViewModels { get; private set; } @@ -61,11 +57,6 @@ namespace Filtration.ViewModels public ILootFilterBlockViewModel SectionBrowserSelectedViewModel { get; set; } - private void OnSectionBrowserSelectionChanged(EventArgs e) - { - - } - public string Description { get { return Script.Description; } @@ -77,7 +68,15 @@ namespace Filtration.ViewModels } } - public LootFilterBlockViewModel SelectedBlockViewModel { get; set; } + public ILootFilterBlockViewModel SelectedBlockViewModel + { + get { return _selectedBlockViewModel; } + set + { + _selectedBlockViewModel = value; + RaisePropertyChanged(); + } + } public LootFilterScript Script { get; private set; } @@ -105,7 +104,7 @@ namespace Filtration.ViewModels CleanChildren(); IsDirty = false; } - + public string DisplayName { get { return !string.IsNullOrEmpty(Filename) ? Filename : Description; } @@ -129,7 +128,7 @@ namespace Filtration.ViewModels foreach (var block in Script.LootFilterBlocks) { var vm = _lootFilterBlockViewModelFactory.Create(); - vm.Initialise(block); + vm.Initialise(block, this); LootFilterBlockViewModels.Add(vm); } } @@ -151,11 +150,16 @@ namespace Filtration.ViewModels private void OnMoveBlockUpCommand() { - var currentIndex = LootFilterBlockViewModels.IndexOf(SelectedBlockViewModel); + MoveBlockUp(SelectedBlockViewModel); + } + + public void MoveBlockUp(ILootFilterBlockViewModel blockViewModel) + { + var currentIndex = LootFilterBlockViewModels.IndexOf(blockViewModel); if (currentIndex > 0) { - var block = SelectedBlockViewModel.Block; + var block = blockViewModel.Block; var blockPos = Script.LootFilterBlocks.IndexOf(block); Script.LootFilterBlocks.RemoveAt(blockPos); Script.LootFilterBlocks.Insert(blockPos - 1, block); @@ -167,11 +171,16 @@ namespace Filtration.ViewModels private void OnMoveBlockDownCommand() { - var currentIndex = LootFilterBlockViewModels.IndexOf(SelectedBlockViewModel); + MoveBlockDown(SelectedBlockViewModel); + } + + public void MoveBlockDown(ILootFilterBlockViewModel blockViewModel) + { + var currentIndex = LootFilterBlockViewModels.IndexOf(blockViewModel); if (currentIndex < LootFilterBlockViewModels.Count - 1) { - var block = SelectedBlockViewModel.Block; + var block = blockViewModel.Block; var blockPos = Script.LootFilterBlocks.IndexOf(block); Script.LootFilterBlocks.RemoveAt(blockPos); Script.LootFilterBlocks.Insert(blockPos + 1, block); @@ -196,16 +205,21 @@ namespace Filtration.ViewModels } } - private void OnAddBlockAboveCommand() + private void OnAddBlockCommand() + { + AddBlock(SelectedBlockViewModel); + } + + public void AddBlock(ILootFilterBlockViewModel blockViewModel) { var vm = _lootFilterBlockViewModelFactory.Create(); var newBlock = new LootFilterBlock(); - vm.Initialise(newBlock); + vm.Initialise(newBlock, this); if (LootFilterBlockViewModels.Count > 0) { - Script.LootFilterBlocks.Insert(Script.LootFilterBlocks.IndexOf(SelectedBlockViewModel.Block), newBlock); - LootFilterBlockViewModels.Insert(LootFilterBlockViewModels.IndexOf(SelectedBlockViewModel), vm); + Script.LootFilterBlocks.Insert(Script.LootFilterBlocks.IndexOf(blockViewModel.Block) + 1, newBlock); + LootFilterBlockViewModels.Insert(LootFilterBlockViewModels.IndexOf(blockViewModel) + 1, vm); } else { @@ -213,41 +227,42 @@ namespace Filtration.ViewModels LootFilterBlockViewModels.Add(vm); } + SelectedBlockViewModel = vm; _isDirty = true; } - private void OnAddBlockBelowCommand() + private void OnAddSectionCommand() { - var vm = _lootFilterBlockViewModelFactory.Create(); - var newBlock = new LootFilterBlock(); - vm.Initialise(newBlock); - - Script.LootFilterBlocks.Insert(Script.LootFilterBlocks.IndexOf(SelectedBlockViewModel.Block) + 1, newBlock); - LootFilterBlockViewModels.Insert(LootFilterBlockViewModels.IndexOf(SelectedBlockViewModel) + 1, vm); - _isDirty = true; + AddSection(SelectedBlockViewModel); } - private void OnAddSectionAboveCommand() + public void AddSection(ILootFilterBlockViewModel blockViewModel) { var vm = _lootFilterBlockViewModelFactory.Create(); var newSection = new LootFilterSection { Description = "New Section" }; - vm.Initialise(newSection); + vm.Initialise(newSection, this); - Script.LootFilterBlocks.Insert(Script.LootFilterBlocks.IndexOf(SelectedBlockViewModel.Block), newSection); - LootFilterBlockViewModels.Insert(LootFilterBlockViewModels.IndexOf(SelectedBlockViewModel), vm); + Script.LootFilterBlocks.Insert(Script.LootFilterBlocks.IndexOf(blockViewModel.Block) + 1, newSection); + LootFilterBlockViewModels.Insert(LootFilterBlockViewModels.IndexOf(blockViewModel) + 1, vm); _isDirty = true; + SelectedBlockViewModel = vm; RaisePropertyChanged("LootFilterSectionViewModels"); } - private void OnDeleteBlock() + private void OnDeleteBlockCommand() + { + DeleteBlock(SelectedBlockViewModel); + } + + public void DeleteBlock(ILootFilterBlockViewModel blockViewModel) { var result = MessageBox.Show("Are you sure you wish to delete this block?", "Delete Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { - Script.LootFilterBlocks.Remove(SelectedBlockViewModel.Block); - LootFilterBlockViewModels.Remove(SelectedBlockViewModel); + Script.LootFilterBlocks.Remove(blockViewModel.Block); + LootFilterBlockViewModels.Remove(blockViewModel); _isDirty = true; } SelectedBlockViewModel = null; diff --git a/Filtration/Views/BindingProxy.cs b/Filtration/Views/BindingProxy.cs new file mode 100644 index 0000000..8c27092 --- /dev/null +++ b/Filtration/Views/BindingProxy.cs @@ -0,0 +1,22 @@ +using System.Windows; + +namespace Filtration.Views +{ + public class BindingProxy : Freezable + { + protected override Freezable CreateInstanceCore() + { + return new BindingProxy(); + } + + public object Data + { + get { return GetValue(DataProperty); } + set { SetValue(DataProperty, value); } + } + + // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc... + public static readonly DependencyProperty DataProperty = + DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); + } +} diff --git a/Filtration/Views/LootFilterBlockView.xaml b/Filtration/Views/LootFilterBlockView.xaml index 0700936..14f980c 100644 --- a/Filtration/Views/LootFilterBlockView.xaml +++ b/Filtration/Views/LootFilterBlockView.xaml @@ -18,6 +18,9 @@ + + + @@ -30,28 +33,35 @@ - - + + + + + + + + + + + + - + + + + + + + + + + @@ -61,8 +71,9 @@ + + - @@ -126,6 +137,7 @@ + @@ -143,6 +155,7 @@ + diff --git a/Filtration/Views/LootFilterScriptView.xaml b/Filtration/Views/LootFilterScriptView.xaml index 7495b31..c2c0469 100644 --- a/Filtration/Views/LootFilterScriptView.xaml +++ b/Filtration/Views/LootFilterScriptView.xaml @@ -7,7 +7,6 @@ xmlns:viewModels="clr-namespace:Filtration.ViewModels" xmlns:userControls="clr-namespace:Filtration.UserControls" xmlns:fa="http://schemas.fontawesome.io/icons/" - xmlns:dragAndDropLib="clr-namespace:DragAndDropLib;assembly=DragAndDropLib" mc:Ignorable="d" d:DataContext="{d:DesignInstance Type=viewModels:LootFilterScriptViewModel}" d:DesignHeight="300" d:DesignWidth="600"> @@ -59,30 +58,16 @@ - - - + - - - - @@ -113,6 +98,9 @@ VirtualizingStackPanel.VirtualizationMode="Recycling" ItemTemplateSelector="{StaticResource BlockTemplateSelector}" SelectedItem="{Binding SelectedBlockViewModel}" x:Name="BlocksListBox"> + + + diff --git a/Filtration/Views/MainWindow.xaml b/Filtration/Views/MainWindow.xaml index db255c1..557fd51 100644 --- a/Filtration/Views/MainWindow.xaml +++ b/Filtration/Views/MainWindow.xaml @@ -25,7 +25,14 @@ - + + +