From 60296602a96fa7a44b184dd9cbb36f145cd31012 Mon Sep 17 00:00:00 2001 From: Daniel Kraus Date: Wed, 5 Aug 2015 20:28:09 +0200 Subject: [PATCH] Implement DeleteElementCommand. --- Tests/ViewModels/SettingsViewModelTest.cs | 20 ++++++++++- .../ViewModels/ControlElementViewModel.cs | 14 ++++++++ .../ViewModels/FormatElementViewModel.cs | 6 ++++ zaaReloaded2/ViewModels/SettingsViewModel.cs | 33 ++++++++++++++++++- 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/Tests/ViewModels/SettingsViewModelTest.cs b/Tests/ViewModels/SettingsViewModelTest.cs index 695e62c..637bb48 100755 --- a/Tests/ViewModels/SettingsViewModelTest.cs +++ b/Tests/ViewModels/SettingsViewModelTest.cs @@ -106,7 +106,25 @@ namespace Tests.ViewModels [Test] public void DeleteElement() { - throw new NotImplementedException(); + Settings settings = new Settings(); + settings.AddElement(new SelectFirstDay()); + settings.AddElement(new SelectEachDay()); + settings.AddElement(new SelectLastDay()); + SettingsViewModel settingsVM = new SettingsViewModel(settings); + int oldCount = settingsVM.Elements.Count; + ElementViewModel elementVM = settingsVM.Elements.First(); + ElementBase element = elementVM.RevealModelObject() as ElementBase; + Assert.IsTrue(settings.Elements.Contains(element), + "Settings object does not contain the model that the VM revealed?!"); + elementVM.IsSelected = true; + Assert.IsTrue(settingsVM.DeleteElementCommand.CanExecute(null), + "DeleteElementCommand should be enabled."); + settingsVM.DeleteElementCommand.Execute(null); + Assert.AreEqual(oldCount - 1, settingsVM.Elements.Count); + Assert.IsFalse(settingsVM.Elements.Contains(elementVM), + "Elements collection still contains the deleted element view model."); + Assert.IsFalse(settings.Elements.Contains(element), + "Settings' Element collection still contains the element model."); } [Test] diff --git a/zaaReloaded2/ViewModels/ControlElementViewModel.cs b/zaaReloaded2/ViewModels/ControlElementViewModel.cs index 58b0421..ada4589 100755 --- a/zaaReloaded2/ViewModels/ControlElementViewModel.cs +++ b/zaaReloaded2/ViewModels/ControlElementViewModel.cs @@ -62,10 +62,24 @@ namespace zaaReloaded2.ViewModels public void AddChildElement(FormatElementViewModel viewModel) { Elements.Add(viewModel); + viewModel.Parent = this; ControlElementBase e = Element as ControlElementBase; e.FormatElements.Add(viewModel.RevealModelObject() as FormatElementBase); } + public void RemoveChildElement(FormatElementViewModel viewModel) + { + if (!Elements.Contains(viewModel)) + { + throw new InvalidOperationException( + "Cannot remove child view model that is not in the collection."); + } + Elements.Remove(viewModel); + ((ControlElementBase)Element).FormatElements + .Remove(viewModel.RevealModelObject() as FormatElementBase); + viewModel.Parent = null; + } + #endregion } } diff --git a/zaaReloaded2/ViewModels/FormatElementViewModel.cs b/zaaReloaded2/ViewModels/FormatElementViewModel.cs index 5dbe16a..27e491e 100755 --- a/zaaReloaded2/ViewModels/FormatElementViewModel.cs +++ b/zaaReloaded2/ViewModels/FormatElementViewModel.cs @@ -39,6 +39,12 @@ namespace zaaReloaded2.ViewModels } } + /// + /// Gets or sets the parent ControlElementViewModel, if + /// there is any. + /// + public ControlElementViewModel Parent { get; set; } + #endregion #region Constructors diff --git a/zaaReloaded2/ViewModels/SettingsViewModel.cs b/zaaReloaded2/ViewModels/SettingsViewModel.cs index 1a5cfd1..9f4670b 100755 --- a/zaaReloaded2/ViewModels/SettingsViewModel.cs +++ b/zaaReloaded2/ViewModels/SettingsViewModel.cs @@ -299,7 +299,38 @@ namespace zaaReloaded2.ViewModels return LastSelectedElement is ControlElementViewModel; } - void DoDeleteElement() { } + /// + /// Deletes the selected element. + /// + /// + /// The following algorithm ist used to find out whether the selected + /// element is at the first or the second level of the hierarchy: + /// If the Element is a ControlElement, it must be at the first level. + /// If the Element is a FormatElement, its Parent property will be + /// Null if the Element is at the first level. + /// + void DoDeleteElement() + { + if (CanDeleteElement()) + { + if (LastSelectedElement is ControlElementViewModel || + ((FormatElementViewModel)LastSelectedElement).Parent == null) + { + // First level of the hierarchy + Elements.Remove(LastSelectedElement); + ElementBase element = LastSelectedElement.RevealModelObject() as ElementBase; + _settings.Elements.Remove(element); + } + else + { + // Second level of the hierarchy + FormatElementViewModel formatVM = LastSelectedElement as FormatElementViewModel; + ControlElementViewModel parent = formatVM.Parent; + parent.RemoveChildElement(formatVM); + } + LastSelectedElement = null; + } + } bool CanDeleteElement() { return LastSelectedElement != null && LastSelectedElement.IsSelected; }