using System.Collections.Generic; using System.Linq; using Artemis.Core.Modules; using Artemis.Core.Services; using GongSolutions.Wpf.DragDrop; using Stylet; namespace Artemis.UI.Screens.Settings.Tabs.Modules { public class ModuleOrderTabViewModel : Screen, IDropTarget { private readonly IModuleService _moduleService; private readonly IPluginService _pluginService; private readonly DefaultDropHandler _defaultDropHandler; private readonly List _modules; public ModuleOrderTabViewModel(IPluginService pluginService, IModuleService moduleService) { DisplayName = "MODULE PRIORITY"; _pluginService = pluginService; _moduleService = moduleService; _modules = new List(pluginService.GetPluginsOfType().Select(m => new ModuleOrderModuleViewModel(m))); _defaultDropHandler = new DefaultDropHandler(); NormalModules = new BindableCollection(); ApplicationModules = new BindableCollection(); OverlayModules = new BindableCollection(); Update(); } public BindableCollection NormalModules { get; set; } public BindableCollection ApplicationModules { get; set; } public BindableCollection OverlayModules { get; set; } public void DragOver(IDropInfo dropInfo) { _defaultDropHandler.DragOver(dropInfo); } public void Drop(IDropInfo dropInfo) { if (dropInfo.TargetItem == dropInfo.Data) return; var viewModel = (ModuleOrderModuleViewModel) dropInfo.Data; var targetCollection = (BindableCollection) dropInfo.TargetCollection; var insertIndex = dropInfo.InsertIndex; ModulePriorityCategory category; if (targetCollection == NormalModules) category = ModulePriorityCategory.Normal; else if (targetCollection == ApplicationModules) category = ModulePriorityCategory.Application; else category = ModulePriorityCategory.Overlay; // If moving down, take the removal of ourselves into consideration with the insert index if (targetCollection.Contains(viewModel) && targetCollection.IndexOf(viewModel) < insertIndex) insertIndex--; _moduleService.UpdateModulePriority(viewModel.Module, category, insertIndex); Update(); } public void Update() { NormalModules.Clear(); NormalModules.AddRange(_modules.Where(m => m.Module.PriorityCategory == ModulePriorityCategory.Normal).OrderBy(m => m.Module.Priority)); ApplicationModules.Clear(); ApplicationModules.AddRange(_modules.Where(m => m.Module.PriorityCategory == ModulePriorityCategory.Application).OrderBy(m => m.Module.Priority)); OverlayModules.Clear(); OverlayModules.AddRange(_modules.Where(m => m.Module.PriorityCategory == ModulePriorityCategory.Overlay).OrderBy(m => m.Module.Priority)); foreach (var moduleOrderModuleViewModel in _modules) moduleOrderModuleViewModel.Update(); } } }