From cf16b9c2184c5641147467a219af074d2390c74e Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Sun, 18 Oct 2020 13:47:35 +0200 Subject: [PATCH] Core - Added method to reactivate a module, reusing its profile Profile editor - Improved performance when moving between modules Profile editor - Fixed editor sometimes going blank when moving between modules --- src/Artemis.Core/Plugins/Modules/Module.cs | 9 +++ .../Plugins/Modules/ProfileModule.cs | 10 +++ src/Artemis.Core/Services/ModuleService.cs | 65 ++++++++++--------- .../Services/ProfileEditorService.cs | 3 +- 4 files changed, 55 insertions(+), 32 deletions(-) diff --git a/src/Artemis.Core/Plugins/Modules/Module.cs b/src/Artemis.Core/Plugins/Modules/Module.cs index cd2d9a19e..e6725a329 100644 --- a/src/Artemis.Core/Plugins/Modules/Module.cs +++ b/src/Artemis.Core/Plugins/Modules/Module.cs @@ -222,6 +222,15 @@ namespace Artemis.Core.Modules ModuleDeactivated(isOverride); } + internal virtual void Reactivate(bool isDeactivateOverride, bool isActivateOverride) + { + if (!IsActivated) + return; + + Deactivate(isDeactivateOverride); + Activate(isActivateOverride); + } + internal void ApplyToEntity() { if (Entity == null) diff --git a/src/Artemis.Core/Plugins/Modules/ProfileModule.cs b/src/Artemis.Core/Plugins/Modules/ProfileModule.cs index fc2b84da2..8f1930609 100644 --- a/src/Artemis.Core/Plugins/Modules/ProfileModule.cs +++ b/src/Artemis.Core/Plugins/Modules/ProfileModule.cs @@ -232,6 +232,16 @@ namespace Artemis.Core.Modules profile?.Dispose(); } + internal override void Reactivate(bool isDeactivateOverride, bool isActivateOverride) + { + if (!IsActivated) + return; + + // Avoid disposing the profile + base.Deactivate(isDeactivateOverride); + Activate(isActivateOverride); + } + #region Events /// diff --git a/src/Artemis.Core/Services/ModuleService.cs b/src/Artemis.Core/Services/ModuleService.cs index aa1af0734..aa2aeeb58 100644 --- a/src/Artemis.Core/Services/ModuleService.cs +++ b/src/Artemis.Core/Services/ModuleService.cs @@ -58,7 +58,7 @@ namespace Artemis.Core.Services // Always deactivate all other modules whenever override is called List modules = _pluginService.GetPluginsOfType().ToList(); foreach (Module module in modules.Where(m => m != overrideModule)) - OverrideDeactivate(module); + OverrideDeactivate(module, overrideModule != null); ActiveModuleOverride = overrideModule; } @@ -84,13 +84,11 @@ namespace Artemis.Core.Services bool shouldBeActivated = ActiveModuleOverride.EvaluateActivationRequirements(); if (shouldBeActivated && ActiveModuleOverride.IsActivatedOverride) { - ActiveModuleOverride.Deactivate(true); - ActiveModuleOverride.Activate(false); + ActiveModuleOverride.Reactivate(true, false); } else if (!shouldBeActivated && !ActiveModuleOverride.IsActivatedOverride) { - ActiveModuleOverride.Deactivate(false); - ActiveModuleOverride.Activate(true); + ActiveModuleOverride.Reactivate(false, true); } return; @@ -171,31 +169,12 @@ namespace Artemis.Core.Services } } - private void OverrideActivate(Module module) - { - try - { - if (module.IsActivated) - return; - - module.Activate(true); - - // If this is a profile module, activate the last active profile after module activation - if (module is ProfileModule profileModule) - _profileService.ActivateLastProfile(profileModule); - } - catch (Exception e) - { - _logger.Error(new ArtemisPluginException(module.PluginInfo, "Failed to activate module and last profile.", e), "Failed to activate module and last profile"); - throw; - } - } - private async Task DeactivateModule(Module module) { try { - // If this is a profile module, activate the last active profile after module activation + // If this is a profile module, animate profile disable + // module.Deactivate would do the same but without animation if (module.IsActivated && module is ProfileModule profileModule) await profileModule.ChangeActiveProfileAnimated(null, null); @@ -208,17 +187,41 @@ namespace Artemis.Core.Services } } - private void OverrideDeactivate(Module module) + private void OverrideActivate(Module module) + { + try + { + if (module.IsActivated) + return; + + // If activating while it should be deactivated, its an override + bool shouldBeActivated = module.EvaluateActivationRequirements(); + module.Activate(!shouldBeActivated); + + // If this is a profile module, activate the last active profile after module activation + if (module is ProfileModule profileModule) + _profileService.ActivateLastProfile(profileModule); + } + catch (Exception e) + { + _logger.Error(new ArtemisPluginException(module.PluginInfo, "Failed to activate module and last profile.", e), "Failed to activate module and last profile"); + throw; + } + } + + private void OverrideDeactivate(Module module, bool clearingOverride) { try { if (!module.IsActivated) return; - // If this is a profile module, activate the last active profile after module activation - if (module is ProfileModule profileModule) - profileModule.ChangeActiveProfile(null, null); - + // If deactivating while it should be activated, its an override + bool shouldBeActivated = module.EvaluateActivationRequirements(); + // No need to deactivate if it is not in an overridden state + if (shouldBeActivated && !module.IsActivatedOverride && !clearingOverride) + return; + module.Deactivate(true); } catch (Exception e) diff --git a/src/Artemis.UI.Shared/Services/ProfileEditorService.cs b/src/Artemis.UI.Shared/Services/ProfileEditorService.cs index f1dedc4c3..8afc4f4c0 100644 --- a/src/Artemis.UI.Shared/Services/ProfileEditorService.cs +++ b/src/Artemis.UI.Shared/Services/ProfileEditorService.cs @@ -361,7 +361,8 @@ namespace Artemis.UI.Shared.Services private void SelectedProfileOnDeactivated(object sender, EventArgs e) { - Execute.PostToUIThread(() => ChangeSelectedProfile(null)); + // Execute.PostToUIThread(() => ChangeSelectedProfile(null)); + ChangeSelectedProfile(null); } } } \ No newline at end of file