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)