mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Merge pull request #510 from diogotr7/feature/sidebar-modules
UI - Made it so modules are sorted by priority in the sidebar
This commit is contained in:
commit
286f475c7b
@ -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
|
||||
/// </summary>
|
||||
public interface IModuleService : IArtemisService
|
||||
{
|
||||
/// <summary>
|
||||
/// Occurs when the priorty of a module is updated.
|
||||
/// </summary>
|
||||
event EventHandler ModulePriorityUpdated;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current active module override. If set, all other modules are deactivated and only the
|
||||
/// <see cref="ActiveModuleOverride" /> is active.
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -35,7 +35,7 @@ namespace Artemis.UI.Screens.Sidebar
|
||||
private BindableCollection<INavigationItem> _sidebarItems;
|
||||
private Dictionary<INavigationItem, Module> _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<Module> modules = _pluginManagementService.GetFeaturesOfType<Module>().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<Module> modules = _pluginManagementService.GetFeaturesOfType<Module>().ToList();
|
||||
|
||||
foreach (IGrouping<ModulePriorityCategory, Module> 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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user