mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-31 09:43:46 +00:00
Profile editor - Added basic layer copy/paste
This commit is contained in:
parent
253c2f069b
commit
f694f39219
@ -52,7 +52,10 @@ namespace Artemis.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsRootFolder => Parent == Profile;
|
public bool IsRootFolder => Parent == Profile;
|
||||||
|
|
||||||
internal FolderEntity FolderEntity { get; set; }
|
/// <summary>
|
||||||
|
/// Gets the folder entity this folder uses for persistent storage
|
||||||
|
/// </summary>
|
||||||
|
public FolderEntity FolderEntity { get; internal set; }
|
||||||
|
|
||||||
internal override RenderElementEntity RenderElementEntity => FolderEntity;
|
internal override RenderElementEntity RenderElementEntity => FolderEntity;
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,6 @@ using Artemis.Core.LayerBrushes;
|
|||||||
using Artemis.Core.LayerEffects;
|
using Artemis.Core.LayerEffects;
|
||||||
using Artemis.Storage.Entities.Profile;
|
using Artemis.Storage.Entities.Profile;
|
||||||
using Artemis.Storage.Entities.Profile.Abstract;
|
using Artemis.Storage.Entities.Profile.Abstract;
|
||||||
using Newtonsoft.Json;
|
|
||||||
using SkiaSharp;
|
using SkiaSharp;
|
||||||
|
|
||||||
namespace Artemis.Core
|
namespace Artemis.Core
|
||||||
@ -18,9 +17,9 @@ namespace Artemis.Core
|
|||||||
{
|
{
|
||||||
private LayerGeneralProperties _general;
|
private LayerGeneralProperties _general;
|
||||||
private BaseLayerBrush? _layerBrush;
|
private BaseLayerBrush? _layerBrush;
|
||||||
private LayerTransformProperties _transform;
|
|
||||||
private LayerShape? _layerShape;
|
private LayerShape? _layerShape;
|
||||||
private List<ArtemisLed> _leds;
|
private List<ArtemisLed> _leds;
|
||||||
|
private LayerTransformProperties _transform;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new instance of the <see cref="Layer" /> class and adds itself to the child collection of the provided
|
/// Creates a new instance of the <see cref="Layer" /> class and adds itself to the child collection of the provided
|
||||||
@ -46,7 +45,13 @@ namespace Artemis.Core
|
|||||||
Parent.AddChild(this);
|
Parent.AddChild(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Layer(Profile profile, ProfileElement parent, LayerEntity layerEntity) : base(parent.Profile)
|
/// <summary>
|
||||||
|
/// Creates a new instance of the <see cref="Layer" /> class based on the provided layer entity
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="profile">The profile the layer belongs to</param>
|
||||||
|
/// <param name="parent">The parent of the layer</param>
|
||||||
|
/// <param name="layerEntity">The entity of the layer</param>
|
||||||
|
public Layer(Profile profile, ProfileElement parent, LayerEntity layerEntity) : base(parent.Profile)
|
||||||
{
|
{
|
||||||
LayerEntity = layerEntity;
|
LayerEntity = layerEntity;
|
||||||
EntityId = layerEntity.Id;
|
EntityId = layerEntity.Id;
|
||||||
@ -82,7 +87,7 @@ namespace Artemis.Core
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the general properties of the layer
|
/// Gets the general properties of the layer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PropertyGroupDescription(Name = "General", Description = "A collection of general properties")]
|
[PropertyGroupDescription(Name = "General", Description = "A collection of general properties")]
|
||||||
public LayerGeneralProperties General
|
public LayerGeneralProperties General
|
||||||
@ -92,7 +97,7 @@ namespace Artemis.Core
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the transform properties of the layer
|
/// Gets the transform properties of the layer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[PropertyGroupDescription(Name = "Transform", Description = "A collection of transformation properties")]
|
[PropertyGroupDescription(Name = "Transform", Description = "A collection of transformation properties")]
|
||||||
public LayerTransformProperties Transform
|
public LayerTransformProperties Transform
|
||||||
@ -110,7 +115,10 @@ namespace Artemis.Core
|
|||||||
internal set => SetAndNotify(ref _layerBrush, value);
|
internal set => SetAndNotify(ref _layerBrush, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal LayerEntity LayerEntity { get; set; }
|
/// <summary>
|
||||||
|
/// Gets the layer entity this layer uses for persistent storage
|
||||||
|
/// </summary>
|
||||||
|
public LayerEntity LayerEntity { get; internal set; }
|
||||||
|
|
||||||
internal override RenderElementEntity RenderElementEntity => LayerEntity;
|
internal override RenderElementEntity RenderElementEntity => LayerEntity;
|
||||||
|
|
||||||
|
|||||||
@ -143,6 +143,8 @@ namespace Artemis.Core
|
|||||||
// Shift everything after the given order
|
// Shift everything after the given order
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (order < 0)
|
||||||
|
order = 0;
|
||||||
foreach (ProfileElement profileElement in ChildrenList.Where(c => c.Order >= order).ToList())
|
foreach (ProfileElement profileElement in ChildrenList.Where(c => c.Order >= order).ToList())
|
||||||
profileElement.Order++;
|
profileElement.Order++;
|
||||||
|
|
||||||
|
|||||||
@ -114,7 +114,6 @@ namespace Artemis.Core
|
|||||||
|
|
||||||
#region Properties
|
#region Properties
|
||||||
|
|
||||||
private ProfileElement? _parent;
|
|
||||||
private SKPath? _path;
|
private SKPath? _path;
|
||||||
internal abstract RenderElementEntity RenderElementEntity { get; }
|
internal abstract RenderElementEntity RenderElementEntity { get; }
|
||||||
|
|
||||||
@ -123,10 +122,11 @@ namespace Artemis.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public new ProfileElement? Parent
|
public new ProfileElement? Parent
|
||||||
{
|
{
|
||||||
get => _parent;
|
get => base.Parent;
|
||||||
internal set
|
internal set
|
||||||
{
|
{
|
||||||
SetAndNotify(ref _parent, value);
|
base.Parent = value;
|
||||||
|
OnPropertyChanged(nameof(Parent));
|
||||||
Renderer.Invalidate();
|
Renderer.Invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,6 +36,8 @@
|
|||||||
<TreeView.InputBindings>
|
<TreeView.InputBindings>
|
||||||
<KeyBinding Key="F2" Command="{s:Action RenameElement}" s:View.ActionTarget="{Binding SelectedTreeItem}"/>
|
<KeyBinding Key="F2" Command="{s:Action RenameElement}" s:View.ActionTarget="{Binding SelectedTreeItem}"/>
|
||||||
<KeyBinding Key="Delete" Command="{s:Action DeleteElement}" s:View.ActionTarget="{Binding SelectedTreeItem}"/>
|
<KeyBinding Key="Delete" Command="{s:Action DeleteElement}" s:View.ActionTarget="{Binding SelectedTreeItem}"/>
|
||||||
|
<KeyBinding Key="C" Modifiers="Control" Command="{s:Action CopyElement}" s:View.ActionTarget="{Binding SelectedTreeItem}"/>
|
||||||
|
<KeyBinding Key="V" Modifiers="Control" Command="{s:Action PasteElement}" s:View.ActionTarget="{Binding SelectedTreeItem}"/>
|
||||||
</TreeView.InputBindings>
|
</TreeView.InputBindings>
|
||||||
<b:Interaction.Behaviors>
|
<b:Interaction.Behaviors>
|
||||||
<behaviors:TreeViewSelectionBehavior ExpandSelected="True" SelectedItem="{Binding SelectedTreeItem}" />
|
<behaviors:TreeViewSelectionBehavior ExpandSelected="True" SelectedItem="{Binding SelectedTreeItem}" />
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
<materialDesign:PackIcon Kind="RenameBox" />
|
<materialDesign:PackIcon Kind="RenameBox" />
|
||||||
</MenuItem.Icon>
|
</MenuItem.Icon>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem Header="Copy" Command="{s:Action CopyElement}">
|
<MenuItem Header="Duplicate" Command="{s:Action DuplicateElement}">
|
||||||
<MenuItem.Icon>
|
<MenuItem.Icon>
|
||||||
<materialDesign:PackIcon Kind="ContentCopy" />
|
<materialDesign:PackIcon Kind="ContentCopy" />
|
||||||
</MenuItem.Icon>
|
</MenuItem.Icon>
|
||||||
|
|||||||
@ -21,7 +21,7 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
|
|||||||
_profileEditorService = profileEditorService;
|
_profileEditorService = profileEditorService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CopyElement()
|
public void DuplicateElement()
|
||||||
{
|
{
|
||||||
Layer layer = Layer.CreateCopy();
|
Layer layer = Layer.CreateCopy();
|
||||||
|
|
||||||
|
|||||||
@ -5,10 +5,12 @@ using System.Threading.Tasks;
|
|||||||
using Artemis.Core;
|
using Artemis.Core;
|
||||||
using Artemis.Core.LayerBrushes;
|
using Artemis.Core.LayerBrushes;
|
||||||
using Artemis.Core.Services;
|
using Artemis.Core.Services;
|
||||||
|
using Artemis.Storage.Entities.Profile;
|
||||||
using Artemis.UI.Exceptions;
|
using Artemis.UI.Exceptions;
|
||||||
using Artemis.UI.Ninject.Factories;
|
using Artemis.UI.Ninject.Factories;
|
||||||
using Artemis.UI.Screens.ProfileEditor.Dialogs;
|
using Artemis.UI.Screens.ProfileEditor.Dialogs;
|
||||||
using Artemis.UI.Shared.Services;
|
using Artemis.UI.Shared.Services;
|
||||||
|
using Artemis.UI.Utilities;
|
||||||
using Stylet;
|
using Stylet;
|
||||||
|
|
||||||
namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
|
namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
|
||||||
@ -185,6 +187,29 @@ namespace Artemis.UI.Screens.ProfileEditor.ProfileTree.TreeItem
|
|||||||
_profileEditorService.ChangeSelectedProfileElement(null);
|
_profileEditorService.ChangeSelectedProfileElement(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void CopyElement()
|
||||||
|
{
|
||||||
|
if (ProfileElement is Layer layer)
|
||||||
|
JsonClipboard.SetObject(layer.LayerEntity);
|
||||||
|
else if (ProfileElement is Folder folder)
|
||||||
|
JsonClipboard.SetObject(folder.FolderEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PasteElement()
|
||||||
|
{
|
||||||
|
object? clipboardObject = JsonClipboard.GetData();
|
||||||
|
if (clipboardObject is LayerEntity layerEntity)
|
||||||
|
{
|
||||||
|
layerEntity.Id = Guid.NewGuid();
|
||||||
|
layerEntity.Name += " - copy";
|
||||||
|
Layer pasted = new Layer(ProfileElement.Profile, ProfileElement.Parent, layerEntity);
|
||||||
|
ProfileElement.Parent.AddChild(pasted, ProfileElement.Order - 1);
|
||||||
|
}
|
||||||
|
else if (clipboardObject is FolderEntity folderEntity)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void UpdateProfileElements()
|
public void UpdateProfileElements()
|
||||||
{
|
{
|
||||||
// Remove VMs that are no longer a child
|
// Remove VMs that are no longer a child
|
||||||
|
|||||||
35
src/Artemis.UI/Utilities/ClipboardHelper.cs
Normal file
35
src/Artemis.UI/Utilities/ClipboardHelper.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using System.Windows;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Artemis.UI.Utilities
|
||||||
|
{
|
||||||
|
public static class JsonClipboard
|
||||||
|
{
|
||||||
|
private static readonly JsonSerializerSettings JsonSettings = new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.All};
|
||||||
|
|
||||||
|
public static void SetObject(object clipboardObject)
|
||||||
|
{
|
||||||
|
string json = JsonConvert.SerializeObject(clipboardObject, JsonSettings);
|
||||||
|
Clipboard.SetData("Artemis", json);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static object GetData()
|
||||||
|
{
|
||||||
|
string json = Clipboard.GetData("Artemis")?.ToString();
|
||||||
|
if (json != null)
|
||||||
|
return JsonConvert.DeserializeObject(json, JsonSettings);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static T GetData<T>()
|
||||||
|
{
|
||||||
|
object data = GetData();
|
||||||
|
return data is T castData ? castData : default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool ContainsArtemisData()
|
||||||
|
{
|
||||||
|
return Clipboard.ContainsData("Artemis");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user