diff --git a/src/Artemis.Core/Services/Interfaces/IModuleService.cs b/src/Artemis.Core/Services/Interfaces/IModuleService.cs
index e4748174a..38371632f 100644
--- a/src/Artemis.Core/Services/Interfaces/IModuleService.cs
+++ b/src/Artemis.Core/Services/Interfaces/IModuleService.cs
@@ -1,4 +1,5 @@
-using System.Threading.Tasks;
+using System;
+using System.Threading.Tasks;
using Artemis.Core.Modules;
namespace Artemis.Core.Services
@@ -8,6 +9,11 @@ namespace Artemis.Core.Services
///
public interface IModuleService : IArtemisService
{
+ ///
+ /// Occurs when the priorty of a module is updated.
+ ///
+ event EventHandler ModulePriorityUpdated;
+
///
/// Gets the current active module override. If set, all other modules are deactivated and only the
/// is active.
diff --git a/src/Artemis.Core/Services/ModuleService.cs b/src/Artemis.Core/Services/ModuleService.cs
index 68dd9d203..a1a72bb2b 100644
--- a/src/Artemis.Core/Services/ModuleService.cs
+++ b/src/Artemis.Core/Services/ModuleService.cs
@@ -149,6 +149,8 @@ namespace Artemis.Core.Services
UpdateModulePriority(module, category, priority);
}
+ public event EventHandler ModulePriorityUpdated;
+
public Module? ActiveModuleOverride { get; private set; }
public async Task SetActiveModuleOverride(Module? overrideModule)
@@ -261,6 +263,8 @@ namespace Artemis.Core.Services
_moduleRepository.Save(categoryModule.SettingsEntity);
}
}
+
+ ModulePriorityUpdated?.Invoke(this, EventArgs.Empty);
}
}
}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Sidebar/SidebarViewModel.cs b/src/Artemis.UI/Screens/Sidebar/SidebarViewModel.cs
index 079059c23..7e854e4f5 100644
--- a/src/Artemis.UI/Screens/Sidebar/SidebarViewModel.cs
+++ b/src/Artemis.UI/Screens/Sidebar/SidebarViewModel.cs
@@ -35,7 +35,7 @@ namespace Artemis.UI.Screens.Sidebar
private BindableCollection _sidebarItems;
private Dictionary _sidebarModules;
- public SidebarViewModel(IKernel kernel, ISettingsService settingsService, IEventAggregator eventAggregator, IModuleVmFactory moduleVmFactory, IPluginManagementService pluginManagementService)
+ public SidebarViewModel(IKernel kernel, ISettingsService settingsService, IEventAggregator eventAggregator, IModuleVmFactory moduleVmFactory, IPluginManagementService pluginManagementService, IModuleService moduleService)
{
_kernel = kernel;
_settingsService = settingsService;
@@ -53,6 +53,7 @@ namespace Artemis.UI.Screens.Sidebar
_pluginManagementService.PluginFeatureEnabled += OnFeatureEnabled;
_pluginManagementService.PluginFeatureDisabled += OnFeatureDisabled;
+ moduleService.ModulePriorityUpdated += OnModulePriorityUpdated;
SetupSidebar();
eventAggregator.Subscribe(this);
@@ -97,22 +98,7 @@ namespace Artemis.UI.Screens.Sidebar
public void SetupSidebar()
{
- SidebarItems.Clear();
- SidebarModules.Clear();
-
- // Add all default sidebar items
- SidebarItems.Add(new FirstLevelNavigationItem {Icon = PackIconKind.Home, Label = "Home"});
- SidebarItems.Add(new FirstLevelNavigationItem {Icon = PackIconKind.Newspaper, Label = "News"});
- SidebarItems.Add(new FirstLevelNavigationItem {Icon = PackIconKind.TestTube, Label = "Workshop"});
- SidebarItems.Add(new FirstLevelNavigationItem {Icon = PackIconKind.Edit, Label = "Surface Editor"});
- SidebarItems.Add(new FirstLevelNavigationItem {Icon = PackIconKind.Settings, Label = "Settings"});
-
- // Add all activated modules
- SidebarItems.Add(new DividerNavigationItem());
- SidebarItems.Add(new SubheaderNavigationItem {Subheader = "Modules"});
- List modules = _pluginManagementService.GetFeaturesOfType().ToList();
- foreach (Module module in modules)
- AddModule(module);
+ UpdateSidebarItems();
// Set the sidebar as open if it's pinned
if (PinSidebar.Value)
@@ -122,6 +108,32 @@ namespace Artemis.UI.Screens.Sidebar
Task.Run(() => SelectSidebarItem(SidebarItems[0]));
}
+ private void UpdateSidebarItems()
+ {
+ SidebarItems.Clear();
+ SidebarModules.Clear();
+
+ // Add all default sidebar items
+ SidebarItems.Add(new FirstLevelNavigationItem { Icon = PackIconKind.Home, Label = "Home" });
+ SidebarItems.Add(new FirstLevelNavigationItem { Icon = PackIconKind.Newspaper, Label = "News" });
+ SidebarItems.Add(new FirstLevelNavigationItem { Icon = PackIconKind.TestTube, Label = "Workshop" });
+ SidebarItems.Add(new FirstLevelNavigationItem { Icon = PackIconKind.Edit, Label = "Surface Editor" });
+ SidebarItems.Add(new FirstLevelNavigationItem { Icon = PackIconKind.Settings, Label = "Settings" });
+
+ // Add all activated modules
+ SidebarItems.Add(new DividerNavigationItem());
+ List modules = _pluginManagementService.GetFeaturesOfType().ToList();
+
+ foreach (IGrouping category in modules.OrderByDescending(m => m.PriorityCategory).GroupBy(m => m.PriorityCategory))
+ {
+ SidebarItems.Add(new SubheaderNavigationItem { Subheader = category.Key.ToString() });
+ foreach(Module module in category.OrderBy(m => m.Priority))
+ {
+ AddModule(module);
+ }
+ }
+ }
+
// ReSharper disable once UnusedMember.Global - Called by view
public void SelectItem(WillSelectNavigationItemEventArgs args)
{
@@ -217,14 +229,19 @@ namespace Artemis.UI.Screens.Sidebar
private void OnFeatureEnabled(object sender, PluginFeatureEventArgs e)
{
- if (e.PluginFeature is Module module)
- AddModule(module);
+ if (e.PluginFeature is Module)
+ UpdateSidebarItems();
}
private void OnFeatureDisabled(object sender, PluginFeatureEventArgs e)
{
- if (e.PluginFeature is Module module)
- RemoveModule(module);
+ if (e.PluginFeature is Module)
+ UpdateSidebarItems();
+ }
+
+ private void OnModulePriorityUpdated(object sender, EventArgs e)
+ {
+ UpdateSidebarItems();
}
public void Handle(RequestSelectSidebarItemEvent message)