From bc2508e4ac55a48a6ed54c2206dab1f27f1863f9 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Sat, 14 Jan 2017 13:08:48 +0100 Subject: [PATCH] Profile editor tweaks and fixes Select profile after duplicate/add Select default profile after delete --- Artemis/Artemis/Models/ProfileEditorModel.cs | 39 +++++++++----- .../Modules/Abstract/ModuleViewModel.cs | 39 +++++++------- .../ViewModels/ProfileEditorViewModel.cs | 54 ++++++++++++++----- 3 files changed, 87 insertions(+), 45 deletions(-) diff --git a/Artemis/Artemis/Models/ProfileEditorModel.cs b/Artemis/Artemis/Models/ProfileEditorModel.cs index caefa2926..ebc55d2be 100644 --- a/Artemis/Artemis/Models/ProfileEditorModel.cs +++ b/Artemis/Artemis/Models/ProfileEditorModel.cs @@ -153,50 +153,54 @@ namespace Artemis.Models ProfileProvider.RenameProfile(profileModel, profileModel.Name); } - public async Task DuplicateProfile(ProfileModel selectedProfile) + public async Task DuplicateProfile(ProfileModel selectedProfile) { var newProfile = GeneralHelpers.Clone(selectedProfile); - var name = await GetValidProfileName("Rename profile", "Please enter a unique new profile name"); + var name = await GetValidProfileName("Duplicate profile", "Please enter a unique new profile name"); // User cancelled if (name == null) - return; + return null; var doRename = await MakeProfileUnique(newProfile, name, newProfile.Name); if (!doRename) - return; + return null; // Make sure it's not default, in case of copying a default profile newProfile.IsDefault = false; ProfileProvider.AddOrUpdate(newProfile); + + return newProfile; } - public async Task DeleteProfile(ProfileModel selectedProfile, ModuleModel moduleModel) + public async Task DeleteProfile(ProfileModel selectedProfile, ModuleModel moduleModel) { var confirm = await _dialogService.ShowQuestionMessageBox("Delete profile", $"Are you sure you want to delete the profile named: {selectedProfile.Name}?\n\n" + "This cannot be undone."); if (!confirm.Value) - return; + return false; var defaultProfile = ProfileProvider.GetProfile(_deviceManager.ActiveKeyboard, moduleModel, "Default"); var deleteProfile = selectedProfile; moduleModel.ChangeProfile(defaultProfile); ProfileProvider.DeleteProfile(deleteProfile); + + return true; } - public async Task ImportProfile(ModuleModel moduleModel) + public async Task ImportProfile(ModuleModel moduleModel) { var dialog = new OpenFileDialog {Filter = "Artemis profile (*.json)|*.json"}; var result = dialog.ShowDialog(); if (result != DialogResult.OK) - return; + return null; var profileModel = ProfileProvider.LoadProfileIfValid(dialog.FileName); if (profileModel == null) { _dialogService.ShowErrorMessageBox("Oh noes, the profile you provided is invalid. " + "If this keeps happening, please make an issue on GitHub and provide the profile."); - return; + return null; } // Verify the game @@ -204,7 +208,7 @@ namespace Artemis.Models { _dialogService.ShowErrorMessageBox( $"Oh oops! This profile is ment for {profileModel.GameName}, not {moduleModel.Name} :c"); - return; + return null; } // Verify the keyboard @@ -216,7 +220,7 @@ namespace Artemis.Models "You can still import it but you'll probably have to do some adjusting\n\n" + "Continue?"); if (!adjustKeyboard.Value) - return; + return null; // Resize layers that are on the full keyboard width profileModel.ResizeLayers(deviceManager.ActiveKeyboard); @@ -232,13 +236,22 @@ namespace Artemis.Models var name = await GetValidProfileName("Rename profile", "Please enter a unique new profile name"); // User cancelled if (name == null) - return; + return null; var doRename = await MakeProfileUnique(profileModel, name, profileModel.Name); if (!doRename) - return; + return null; profileModel.IsDefault = false; ProfileProvider.AddOrUpdate(profileModel); + return profileModel; + } + + public void ChangeProfileByName(ModuleModel moduleModel, string profileName) + { + if (string.IsNullOrEmpty(profileName)) + profileName = "Default"; + + moduleModel.ChangeProfile(ProfileProvider.GetProfile(_deviceManager.ActiveKeyboard, moduleModel, profileName)); } private async Task GetValidProfileName(string title, string text) diff --git a/Artemis/Artemis/Modules/Abstract/ModuleViewModel.cs b/Artemis/Artemis/Modules/Abstract/ModuleViewModel.cs index fa0eeaca5..e20501ac8 100644 --- a/Artemis/Artemis/Modules/Abstract/ModuleViewModel.cs +++ b/Artemis/Artemis/Modules/Abstract/ModuleViewModel.cs @@ -1,9 +1,9 @@ -using Artemis.Events; +using Artemis.DAL; +using Artemis.Events; using Artemis.Managers; using Artemis.Services; using Artemis.Settings; using Artemis.ViewModels; -using Artemis.ViewModels.Profiles; using Caliburn.Micro; using Ninject; using Ninject.Extensions.Logging; @@ -13,23 +13,33 @@ namespace Artemis.Modules.Abstract { public abstract class ModuleViewModel : Screen { - private readonly ModuleManager _moduleManager; private readonly MainManager _mainManager; - private readonly IKernel _kernel; + private readonly ModuleManager _moduleManager; + private readonly GeneralSettings _generalSettings; private ModuleSettings _settings; - private GeneralSettings _generalSettings; public ModuleViewModel(MainManager mainManager, ModuleModel moduleModel, IKernel kernel) { _mainManager = mainManager; - _kernel = kernel; _moduleManager = mainManager.ModuleManager; - _generalSettings = DAL.SettingsProvider.Load(); + _generalSettings = SettingsProvider.Load(); ModuleModel = moduleModel; Settings = moduleModel.Settings; _mainManager.EnabledChanged += MainManagerOnEnabledChanged; _moduleManager.EffectChanged += ModuleManagerOnModuleChanged; + + // ReSharper disable once VirtualMemberCallInConstructor + if (!UsesProfileEditor) + return; + + IParameter[] args = + { + new ConstructorArgument("mainManager", _mainManager), + new ConstructorArgument("moduleModel", ModuleModel), + new ConstructorArgument("lastProfile", Settings.LastProfile) + }; + ProfileEditor = kernel.Get(args); } public ProfileEditorViewModel ProfileEditor { get; set; } @@ -142,24 +152,13 @@ namespace Artemis.Modules.Abstract protected override void OnActivate() { base.OnActivate(); - - if (!UsesProfileEditor) - return; - - IParameter[] args = - { - new ConstructorArgument("mainManager", _mainManager), - new ConstructorArgument("moduleModel", ModuleModel), - new ConstructorArgument("lastProfile", Settings.LastProfile) - }; - ProfileEditor = _kernel.Get(args); + ProfileEditor?.OnActivate(); } protected override void OnDeactivate(bool close) { base.OnDeactivate(close); - ProfileEditor?.Dispose(); - ProfileEditor = null; + ProfileEditor?.OnDeactivate(close); } } } \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs b/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs index 2b1da49ae..bfd4f67b2 100644 --- a/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs @@ -40,7 +40,7 @@ using Screen = Caliburn.Micro.Screen; namespace Artemis.ViewModels { - public sealed class ProfileEditorViewModel : Screen, IDropTarget, IDisposable + public sealed class ProfileEditorViewModel : Screen, IDropTarget { private readonly DeviceManager _deviceManager; private readonly MetroDialogService _dialogService; @@ -68,16 +68,22 @@ namespace Artemis.ViewModels PropertyChanged += EditorStateHandler; _deviceManager.OnKeyboardChanged += DeviceManagerOnOnKeyboardChanged; _moduleModel.ProfileChanged += ModuleModelOnProfileChanged; - _loopManager.RenderCompleted += LoopManagerOnRenderCompleted; LoadProfiles(); } - public void Dispose() + public new void OnActivate() { + base.OnActivate(); + + _loopManager.RenderCompleted += LoopManagerOnRenderCompleted; + } + + public new void OnDeactivate(bool close) + { + base.OnDeactivate(close); + SaveSelectedProfile(); - ProfileEditorModel.Dispose(); _loopManager.RenderCompleted -= LoopManagerOnRenderCompleted; - _deviceManager.OnKeyboardChanged -= DeviceManagerOnOnKeyboardChanged; } #region LUA @@ -154,11 +160,10 @@ namespace Artemis.ViewModels get { return SelectedProfile?.Name; } set { - if (value == SelectedProfile?.Name) - return; - - _moduleModel.ChangeProfile(ProfileProvider.GetProfile(_deviceManager.ActiveKeyboard, _moduleModel, value)); + SaveSelectedProfile(); NotifyOfPropertyChange(() => SelectedProfileName); + if (value != null) + ProfileEditorModel.ChangeProfileByName(_moduleModel, value); } } @@ -208,6 +213,15 @@ namespace Artemis.ViewModels UpdateLayerList(SelectedLayer); } + public void EditLayer(LayerModel layerModel) + { + if (layerModel == null) + return; + + ProfileEditorModel.EditLayer(layerModel, _moduleModel.DataModel); + UpdateLayerList(layerModel); + } + public LayerModel AddLayer() { if (SelectedProfile == null) @@ -355,6 +369,7 @@ namespace Artemis.ViewModels return; LoadProfiles(); + _moduleModel.ChangeProfile(profile); } public async void RenameProfile() @@ -362,8 +377,11 @@ namespace Artemis.ViewModels if (SelectedProfile == null) return; + var renameProfile = SelectedProfile; await ProfileEditorModel.RenameProfile(SelectedProfile); + LoadProfiles(); + _moduleModel.ChangeProfile(renameProfile); } public async void DuplicateProfile() @@ -371,8 +389,12 @@ namespace Artemis.ViewModels if (SelectedProfile == null) return; - await ProfileEditorModel.DuplicateProfile(SelectedProfile); + var newProfle = await ProfileEditorModel.DuplicateProfile(SelectedProfile); + if (newProfle == null) + return; + LoadProfiles(); + _moduleModel.ChangeProfile(newProfle); } public async void DeleteProfile() @@ -380,8 +402,12 @@ namespace Artemis.ViewModels if (SelectedProfile == null) return; - await ProfileEditorModel.DeleteProfile(SelectedProfile, _moduleModel); + var confirmed = await ProfileEditorModel.DeleteProfile(SelectedProfile, _moduleModel); + if (!confirmed) + return; + LoadProfiles(); + ProfileEditorModel.ChangeProfileByName(_moduleModel, null); } public async void ImportProfile() @@ -393,8 +419,12 @@ namespace Artemis.ViewModels return; } - await ProfileEditorModel.ImportProfile(_moduleModel); + var importProfile = await ProfileEditorModel.ImportProfile(_moduleModel); + if (importProfile == null) + return; + LoadProfiles(); + _moduleModel.ChangeProfile(importProfile); } public void ExportProfile()