1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
Robert 06f014a294 Added a Material-styled scrollbar
Cleaned up reorder code
Reorganised profile editor layout and added panel titles
2019-11-26 23:31:41 +01:00

125 lines
4.0 KiB
C#

using System.Linq;
using System.Windows;
using Artemis.Core.Models.Profile;
using Artemis.UI.Screens.Module.ProfileEditor.ProfileElements.ProfileElement;
using GongSolutions.Wpf.DragDrop;
namespace Artemis.UI.Screens.Module.ProfileEditor.ProfileElements
{
public class ProfileElementsViewModel : ProfileEditorPanelViewModel, IDropTarget
{
public ProfileElementsViewModel()
{
CreateRootFolderViewModel();
}
public FolderViewModel RootFolder { get; set; }
public void DragOver(IDropInfo dropInfo)
{
var dragDropType = GetDragDropType(dropInfo);
switch (dragDropType)
{
case DragDropType.Add:
dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
dropInfo.Effects = DragDropEffects.Move;
break;
case DragDropType.InsertBefore:
case DragDropType.InsertAfter:
dropInfo.DropTargetAdorner = DropTargetAdorners.Insert;
dropInfo.Effects = DragDropEffects.Move;
break;
}
}
public void Drop(IDropInfo dropInfo)
{
var source = (ProfileElementViewModel) dropInfo.Data;
var target = (ProfileElementViewModel) dropInfo.TargetItem;
var dragDropType = GetDragDropType(dropInfo);
switch (dragDropType)
{
case DragDropType.Add:
source.Parent.RemoveExistingElement(source);
target.AddExistingElement(source);
break;
case DragDropType.InsertBefore:
target.SetElementInFront(source);
break;
case DragDropType.InsertAfter:
target.SetElementBehind(source);
break;
}
ProfileEditorViewModel.OnProfileUpdated();
}
// ReSharper disable once UnusedMember.Global - Called from view
public void AddFolder()
{
RootFolder?.AddFolder();
}
// ReSharper disable once UnusedMember.Global - Called from view
public void AddLayer()
{
RootFolder?.AddLayer();
}
public override void ActiveProfileChanged()
{
CreateRootFolderViewModel();
base.ActiveProfileChanged();
}
private void CreateRootFolderViewModel()
{
if (!(ProfileEditorViewModel?.SelectedProfile?.Children?.FirstOrDefault() is Folder folder))
{
RootFolder = null;
return;
}
RootFolder = new FolderViewModel(null, folder, ProfileEditorViewModel);
}
private static DragDropType GetDragDropType(IDropInfo dropInfo)
{
var source = (ProfileElementViewModel) dropInfo.Data;
var target = (ProfileElementViewModel) dropInfo.TargetItem;
if (source == target)
return DragDropType.None;
var parent = target;
while (parent != null)
{
if (parent == source)
return DragDropType.None;
parent = parent.Parent;
}
switch (dropInfo.InsertPosition)
{
case RelativeInsertPosition.AfterTargetItem | RelativeInsertPosition.TargetItemCenter:
case RelativeInsertPosition.BeforeTargetItem | RelativeInsertPosition.TargetItemCenter:
return target.SupportsChildren ? DragDropType.Add : DragDropType.None;
case RelativeInsertPosition.BeforeTargetItem:
return DragDropType.InsertBefore;
case RelativeInsertPosition.AfterTargetItem:
return DragDropType.InsertAfter;
default:
return DragDropType.None;
}
}
}
public enum DragDropType
{
None,
Add,
InsertBefore,
InsertAfter
}
}