diff --git a/src/Artemis.UI/Artemis.UI.csproj b/src/Artemis.UI/Artemis.UI.csproj index b40eb1fab..dc57c291e 100644 --- a/src/Artemis.UI/Artemis.UI.csproj +++ b/src/Artemis.UI/Artemis.UI.csproj @@ -192,10 +192,7 @@ - - - - + diff --git a/src/Artemis.UI/Ninject/Factories/IArtemisUiFactory.cs b/src/Artemis.UI/Ninject/Factories/IArtemisUiFactory.cs deleted file mode 100644 index 7cf08f331..000000000 --- a/src/Artemis.UI/Ninject/Factories/IArtemisUiFactory.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Artemis.UI.Ninject.Factories -{ - public interface IArtemisUIFactory - { - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Ninject/Factories/IDeviceSettingsViewMOdelFactory.cs b/src/Artemis.UI/Ninject/Factories/IDeviceSettingsViewMOdelFactory.cs deleted file mode 100644 index 5bbae036c..000000000 --- a/src/Artemis.UI/Ninject/Factories/IDeviceSettingsViewMOdelFactory.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Artemis.Core.Models.Surface; -using Artemis.UI.Screens.Settings.Tabs.Devices; - -namespace Artemis.UI.Ninject.Factories -{ - public interface IDeviceSettingsViewModelFactory : IArtemisUIFactory - { - DeviceSettingsViewModel Create(ArtemisDevice device); - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Ninject/Factories/IModuleViewModelFactory.cs b/src/Artemis.UI/Ninject/Factories/IModuleViewModelFactory.cs deleted file mode 100644 index bd516f830..000000000 --- a/src/Artemis.UI/Ninject/Factories/IModuleViewModelFactory.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Artemis.Core.Plugins.Abstract; -using Artemis.UI.Screens.Module; - -namespace Artemis.UI.Ninject.Factories -{ - public interface IModuleViewModelFactory : IArtemisUIFactory - { - ModuleRootViewModel Create(Module module); - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Ninject/Factories/IProfileEditorViewModelFactory.cs b/src/Artemis.UI/Ninject/Factories/IProfileEditorViewModelFactory.cs deleted file mode 100644 index 73026d66e..000000000 --- a/src/Artemis.UI/Ninject/Factories/IProfileEditorViewModelFactory.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Artemis.Core.Plugins.Abstract; -using Artemis.UI.Screens.Module.ProfileEditor; - -namespace Artemis.UI.Ninject.Factories -{ - public interface IProfileEditorViewModelFactory : IArtemisUIFactory - { - ProfileEditorViewModel Create(ProfileModule module); - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Ninject/Factories/IViewModelFactory.cs b/src/Artemis.UI/Ninject/Factories/IViewModelFactory.cs new file mode 100644 index 000000000..f13888a18 --- /dev/null +++ b/src/Artemis.UI/Ninject/Factories/IViewModelFactory.cs @@ -0,0 +1,40 @@ +using Artemis.Core.Models.Profile.Abstract; +using Artemis.Core.Models.Surface; +using Artemis.Core.Plugins.Abstract; +using Artemis.UI.Screens.Module; +using Artemis.UI.Screens.Module.ProfileEditor; +using Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem; +using Artemis.UI.Screens.Settings.Tabs.Devices; + +namespace Artemis.UI.Ninject.Factories +{ + public interface IViewModelFactory + { + } + + public interface IModuleViewModelFactory : IViewModelFactory + { + ModuleRootViewModel Create(Module module); + } + + public interface IDeviceSettingsViewModelFactory : IViewModelFactory + { + DeviceSettingsViewModel Create(ArtemisDevice device); + } + + public interface IProfileEditorViewModelFactory : IViewModelFactory + { + ProfileEditorViewModel Create(ProfileModule module); + } + + public interface IFolderViewModelFactory : IViewModelFactory + { + FolderViewModel Create(ProfileElement folder); + FolderViewModel Create(TreeItemViewModel parent, ProfileElement folder); + } + + public interface ILayerViewModelFactory : IViewModelFactory + { + LayerViewModel Create(TreeItemViewModel parent, ProfileElement folder); + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Ninject/UiModule.cs b/src/Artemis.UI/Ninject/UiModule.cs index cb36d7088..cd64d319e 100644 --- a/src/Artemis.UI/Ninject/UiModule.cs +++ b/src/Artemis.UI/Ninject/UiModule.cs @@ -43,15 +43,11 @@ namespace Artemis.UI.Ninject Kernel.Bind(x => { x.FromThisAssembly() - .SelectAllClasses() - .InheritedFrom() + .SelectAllInterfaces() + .InheritedFrom() .BindToFactory(); }); - Kernel.Bind().ToFactory(); - Kernel.Bind().ToFactory(); - Kernel.Bind().ToFactory(); - // Bind profile editor VMs Kernel.Bind(x => { diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/ProfileTreeViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/ProfileTreeViewModel.cs index e0efbb2a8..e1df7fa0a 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/ProfileTreeViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/ProfileTreeViewModel.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Windows; using Artemis.Core.Models.Profile; +using Artemis.UI.Ninject.Factories; using Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem; using Artemis.UI.Services.Interfaces; using GongSolutions.Wpf.DragDrop; @@ -11,11 +12,13 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree public class ProfileTreeViewModel : ProfileEditorPanelViewModel, IDropTarget { private readonly IProfileEditorService _profileEditorService; + private readonly IFolderViewModelFactory _folderViewModelFactory; private TreeItemViewModel _selectedTreeItem; - public ProfileTreeViewModel(IProfileEditorService profileEditorService) + public ProfileTreeViewModel(IProfileEditorService profileEditorService, IFolderViewModelFactory folderViewModelFactory) { _profileEditorService = profileEditorService; + _folderViewModelFactory = folderViewModelFactory; CreateRootFolderViewModel(); _profileEditorService.SelectedProfileChanged += OnSelectedProfileChanged; @@ -96,7 +99,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree return; } - RootFolder = new FolderViewModel(null, folder, _profileEditorService); + RootFolder = _folderViewModelFactory.Create(folder); } private static DragDropType GetDragDropType(IDropInfo dropInfo) diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/FolderViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/FolderViewModel.cs index 0a011e090..0a148fa99 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/FolderViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/FolderViewModel.cs @@ -1,11 +1,28 @@ using Artemis.Core.Models.Profile.Abstract; +using Artemis.UI.Ninject.Factories; using Artemis.UI.Services.Interfaces; namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem { public class FolderViewModel : TreeItemViewModel { - public FolderViewModel(TreeItemViewModel parent, ProfileElement folder, IProfileEditorService profileEditorService) : base(parent, folder, profileEditorService) + // I hate this about DI, oh well + public FolderViewModel(ProfileElement folder, + IProfileEditorService profileEditorService, + IDialogService dialogService, + IFolderViewModelFactory folderViewModelFactory, + ILayerViewModelFactory layerViewModelFactory) : + base(null, folder, profileEditorService, dialogService, folderViewModelFactory, layerViewModelFactory) + { + } + + public FolderViewModel(TreeItemViewModel parent, + ProfileElement folder, + IProfileEditorService profileEditorService, + IDialogService dialogService, + IFolderViewModelFactory folderViewModelFactory, + ILayerViewModelFactory layerViewModelFactory) : + base(parent, folder, profileEditorService, dialogService, folderViewModelFactory, layerViewModelFactory) { } diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/LayerViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/LayerViewModel.cs index 6ba30eb7c..016ef7332 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/LayerViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/LayerViewModel.cs @@ -1,11 +1,18 @@ using Artemis.Core.Models.Profile.Abstract; +using Artemis.UI.Ninject.Factories; using Artemis.UI.Services.Interfaces; namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem { public class LayerViewModel : TreeItemViewModel { - public LayerViewModel(TreeItemViewModel parent, ProfileElement layer, IProfileEditorService profileEditorService) : base(parent, layer, profileEditorService) + public LayerViewModel(TreeItemViewModel parent, + ProfileElement folder, + IProfileEditorService profileEditorService, + IDialogService dialogService, + IFolderViewModelFactory folderViewModelFactory, + ILayerViewModelFactory layerViewModelFactory) : + base(parent, folder, profileEditorService, dialogService, folderViewModelFactory, layerViewModelFactory) { } diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/TreeItemViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/TreeItemViewModel.cs index 787ad93c0..3c48babf9 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/TreeItemViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileTree/TreeItem/TreeItemViewModel.cs @@ -4,6 +4,8 @@ using System.Threading.Tasks; using Artemis.Core.Models.Profile; using Artemis.Core.Models.Profile.Abstract; using Artemis.UI.Exceptions; +using Artemis.UI.Ninject.Factories; +using Artemis.UI.Screens.Module.ProfileEditor.Dialogs; using Artemis.UI.Services.Interfaces; using Stylet; @@ -11,11 +13,25 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem { public abstract class TreeItemViewModel : PropertyChangedBase { - protected TreeItemViewModel(TreeItemViewModel parent, ProfileElement profileElement, IProfileEditorService profileEditorService) + private readonly IProfileEditorService _profileEditorService; + private readonly IDialogService _dialogService; + private readonly IFolderViewModelFactory _folderViewModelFactory; + private readonly ILayerViewModelFactory _layerViewModelFactory; + + protected TreeItemViewModel(TreeItemViewModel parent, + ProfileElement profileElement, + IProfileEditorService profileEditorService, + IDialogService dialogService, + IFolderViewModelFactory folderViewModelFactory, + ILayerViewModelFactory layerViewModelFactory) { + _profileEditorService = profileEditorService; + _dialogService = dialogService; + _folderViewModelFactory = folderViewModelFactory; + _layerViewModelFactory = layerViewModelFactory; + Parent = parent; ProfileElement = profileElement; - ProfileEditorService = profileEditorService; Children = new BindableCollection(); UpdateProfileElements(); @@ -23,7 +39,6 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem public TreeItemViewModel Parent { get; set; } public ProfileElement ProfileElement { get; set; } - public IProfileEditorService ProfileEditorService { get; set; } public abstract bool SupportsChildren { get; } public BindableCollection Children { get; set; } @@ -95,7 +110,7 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem ProfileElement.AddChild(new Folder(ProfileElement.Profile, ProfileElement, "New folder")); UpdateProfileElements(); - ProfileEditorService.UpdateSelectedProfile(); + _profileEditorService.UpdateSelectedProfile(); } public void AddLayer() @@ -105,40 +120,40 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem ProfileElement.AddChild(new Layer(ProfileElement.Profile, ProfileElement, "New layer")); UpdateProfileElements(); - ProfileEditorService.UpdateSelectedProfile(); + _profileEditorService.UpdateSelectedProfile(); } // ReSharper disable once UnusedMember.Global - Called from view public async Task RenameElement() { -// var result = await ProfileEditorService.DialogService.ShowDialog( -// new Dictionary {{"profileElement", ProfileElement}} -// ); -// if (result is string newName) -// { -// ProfileElement.Name = newName; -// ProfileEditorService.UpdateSelectedProfile(); -// } + var result = await _dialogService.ShowDialog( + new Dictionary {{"profileElement", ProfileElement}} + ); + if (result is string newName) + { + ProfileElement.Name = newName; + _profileEditorService.UpdateSelectedProfile(); + } } // ReSharper disable once UnusedMember.Global - Called from view public async Task DeleteElement() { -// var result = await ProfileEditorService.DialogService.ShowConfirmDialog( -// "Delete profile element", -// "Are you sure you want to delete this element? This cannot be undone." -// ); -// -// if (!result) -// return; -// -// // Farewell, cruel world -// var parent = Parent; -// ProfileElement.Parent.RemoveChild(ProfileElement); -// parent.RemoveExistingElement(this); -// parent.UpdateProfileElements(); -// -// ProfileEditorService.UpdateSelectedProfile(); + var result = await _dialogService.ShowConfirmDialog( + "Delete profile element", + "Are you sure you want to delete this element? This cannot be undone." + ); + + if (!result) + return; + + // Farewell, cruel world + var parent = Parent; + ProfileElement.Parent.RemoveChild(ProfileElement); + parent.RemoveExistingElement(this); + parent.UpdateProfileElements(); + + _profileEditorService.UpdateSelectedProfile(); } private void UpdateProfileElements() @@ -161,13 +176,13 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileTree.TreeItem { existing = Children.FirstOrDefault(p => p is FolderViewModel vm && vm.ProfileElement == folder); if (existing == null) - Children.Add(new FolderViewModel(this, folder, ProfileEditorService)); + Children.Add(_folderViewModelFactory.Create((FolderViewModel) this, folder)); } else if (profileElement is Layer layer) { existing = Children.FirstOrDefault(p => p is LayerViewModel vm && vm.ProfileElement == layer); if (existing == null) - Children.Add(new LayerViewModel(this, layer, ProfileEditorService)); + Children.Add(_layerViewModelFactory.Create((FolderViewModel) this, layer)); } existing?.UpdateProfileElements(); diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceView.xaml index 5fda64a2a..f130ea888 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceView.xaml @@ -21,9 +21,9 @@ - - - + - + @@ -66,10 +66,10 @@ - + - - + + diff --git a/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceView.xaml b/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceView.xaml index 14acc7038..abd62d62a 100644 --- a/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceView.xaml +++ b/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceView.xaml @@ -26,7 +26,9 @@ - +