diff --git a/src/Artemis.Core/Services/PluginManagementService.cs b/src/Artemis.Core/Services/PluginManagementService.cs index dc5d1e3b1..1e113ab95 100644 --- a/src/Artemis.Core/Services/PluginManagementService.cs +++ b/src/Artemis.Core/Services/PluginManagementService.cs @@ -5,6 +5,7 @@ using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; +using System.Runtime.Loader; using System.Threading.Tasks; using Artemis.Core.DeviceProviders; using Artemis.Core.Ninject; @@ -334,13 +335,16 @@ internal class PluginManagementService : IPluginManagementService throw new ArtemisPluginException(plugin, "Plugin main entry casing mismatch at " + plugin.Info.Main); // Load the plugin, all types implementing Plugin and register them with DI - plugin.PluginLoader = PluginLoader.CreateFromAssemblyFile(mainFile!, configure => + plugin.PluginLoader = PluginLoader.CreateFromAssemblyFile(mainFile, configure => { configure.IsUnloadable = true; configure.LoadInMemory = true; configure.PreferSharedTypes = true; + + // Resolving failed, try a loaded assembly but ignoring the version + configure.DefaultContext.Resolving += (context, assemblyName) => context.Assemblies.FirstOrDefault(a => a.GetName().Name == assemblyName.Name); }); - + try { plugin.Assembly = plugin.PluginLoader.LoadDefaultAssembly(); @@ -402,7 +406,7 @@ internal class PluginManagementService : IPluginManagementService OnPluginLoaded(new PluginEventArgs(plugin)); return plugin; } - + public void EnablePlugin(Plugin plugin, bool saveState, bool ignorePluginLock) { if (!plugin.Info.IsCompatible) diff --git a/src/Artemis.UI/Screens/Sidebar/SidebarCategoryViewModel.cs b/src/Artemis.UI/Screens/Sidebar/SidebarCategoryViewModel.cs index 8da48b281..224bb4074 100644 --- a/src/Artemis.UI/Screens/Sidebar/SidebarCategoryViewModel.cs +++ b/src/Artemis.UI/Screens/Sidebar/SidebarCategoryViewModel.cs @@ -26,18 +26,20 @@ public class SidebarCategoryViewModel : ActivatableViewModelBase private readonly IProfileService _profileService; private readonly ISidebarVmFactory _vmFactory; private readonly IWindowService _windowService; + private readonly IProfileEditorService _profileEditorService; private ObservableAsPropertyHelper? _isCollapsed; private ObservableAsPropertyHelper? _isSuspended; private SidebarProfileConfigurationViewModel? _selectedProfileConfiguration; - public SidebarCategoryViewModel(ProfileCategory profileCategory, - IProfileService profileService, - IWindowService windowService, + public SidebarCategoryViewModel(ProfileCategory profileCategory, + IProfileService profileService, + IWindowService windowService, IProfileEditorService profileEditorService, ISidebarVmFactory vmFactory) { _profileService = profileService; _windowService = windowService; + _profileEditorService = profileEditorService; _vmFactory = vmFactory; ProfileCategory = profileCategory; @@ -154,7 +156,11 @@ public class SidebarCategoryViewModel : ActivatableViewModelBase private async Task ExecuteDeleteCategory() { if (await _windowService.ShowConfirmContentDialog($"Delete {ProfileCategory.Name}", "Do you want to delete this category and all its profiles?")) + { + if (ProfileCategory.ProfileConfigurations.Any(c => c.IsBeingEdited)) + _profileEditorService.ChangeCurrentProfileConfiguration(null); _profileService.DeleteProfileCategory(ProfileCategory); + } } private async Task ExecuteAddProfile() @@ -171,7 +177,7 @@ public class SidebarCategoryViewModel : ActivatableViewModelBase } private async Task ExecuteImportProfile() - { + { string[]? result = await _windowService.CreateOpenFileDialog() .HavingFilter(f => f.WithExtension("json").WithName("Artemis profile")) .ShowAsync(); @@ -225,10 +231,9 @@ public class SidebarCategoryViewModel : ActivatableViewModelBase if (index <= 0) return; - categories[index - 1].Order++; - ProfileCategory.Order--; - _profileService.SaveProfileCategory(categories[index - 1]); - _profileService.SaveProfileCategory(ProfileCategory); + categories.Remove(ProfileCategory); + categories.Insert(index - 1, ProfileCategory); + ApplyCategoryOrder(categories); } private void ExecuteMoveDown() @@ -238,9 +243,19 @@ public class SidebarCategoryViewModel : ActivatableViewModelBase if (index >= categories.Count - 1) return; - categories[index + 1].Order--; - ProfileCategory.Order++; - _profileService.SaveProfileCategory(categories[index + 1]); - _profileService.SaveProfileCategory(ProfileCategory); + categories.Remove(ProfileCategory); + categories.Insert(index + 1, ProfileCategory); + ApplyCategoryOrder(categories); + } + + private void ApplyCategoryOrder(List categories) + { + for (int i = 0; i < categories.Count; i++) + { + if (categories[i].Order == i + 1) + continue; + categories[i].Order = i + 1; + _profileService.SaveProfileCategory(categories[i]); + } } } \ No newline at end of file